Подсчет переходов страниц во Flutter с помощью окон iframe [flutter web] - PullRequest
1 голос
/ 25 мая 2020

Я хотел бы включить другой веб-сайт в свой собственный. Для этого я хотел бы зарегистрировать обратный вызов для отслеживания переходов сайта (т.е. пользователь нажимает ссылку на встроенном сайте и перенаправляется на другой URL-адрес / дополнительный URL-адрес (?).) В настоящее время я использую IFrameElement для встраивания сайта теоретически это позволило бы зарегистрировать прослушиватели событий, но я не могу найти никакой документации по этому поводу.

Моя основная цель - подсчитать количество переходов между страницами. Это мой текущий код:

import 'package:flutter/material.dart';
import 'package:wikipoker/widgets/my_iframe.dart';
import 'package:wikipoker/widgets/player_tab.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Wikipedia Poker',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Game of Wikipedia Poker'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              buildIFrame(constraints.maxHeight, constraints.maxWidth),
            ],
          );
        },
      ),
    );
  }

  String _youtube = 'https://www.youtube.com/embed/RQzhAQlg2JQ';
  String _wiki = 'https://de.wikipedia.org/wiki/Hunde';

  Widget buildIFrame(double height, double width) {

    return Column(
      children: [
        IFrameWidget(
          _wiki,
          height,
          width * (4 / 5),
        ),
      ],
    );
  }
}
import 'dart:html';
import 'dart:ui' as ui;

import 'package:flutter/cupertino.dart';

class IFrameWidget extends StatefulWidget {
  final String _url;
  double _height = 500;
  double _width = 500;

  IFrameWidget(this._url, this._height, this._width);

  @override
  State<StatefulWidget> createState() => _IFrameWidgetState();
}

class _IFrameWidgetState extends State<IFrameWidget> {
  Widget _iframeWidget;

  @override
  void initState() {
    super.initState();

    final IFrameElement _iframeElement = IFrameElement();

//    _iframeElement.height = '500';
//    _iframeElement.width = '500';

    // FIXME This does not load.
//    _iframeElement.addEventListener('onLoad', (event) {
//      setState(() {
//        _iframeWidget = Text("Lol");
//      });
//    });

    _iframeElement.src = widget._url;
    _iframeElement.style.border = 'none';

    // ignore: undefined_prefixed_name
    ui.platformViewRegistry.registerViewFactory(
      'iframeElement',
      (int viewId) => _iframeElement,
    );

    _iframeWidget = HtmlElementView(
      key: UniqueKey(),
      viewType: 'iframeElement',
    );
  }

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: widget._height,
      width: widget._width,
      child: _iframeWidget,
    );
  }
}

В IFrameElement есть несколько полей и методов, которые выглядят так, как будто они могут быть полезны. addEventListener ожидает тип события, но нет обзора того, что это может быть. Документация по этому поводу очень неполная, и я не знаю, какое событие я хотел бы зарегистрировать. Я надеюсь, что я смогу использовать для этого события из встроенного html iframe.

Документация для IFrames: https://api.flutter.dev/flutter/dart-html/IFrameElement-class.html

...