WebView во Flutter Web

Я пытаюсь отобразить веб-представление во Flutter for Web, но получаю следующую ошибку:

PlatformException(Unregistered factory, No factory registered for viewtype 'plugins.flutter.io/webview', null)

Есть ли способ отобразить WebView во Flutter Web?

6 ответов

Решение

Сначала вам нужно выполнить platformViewRegistry:

  ui.platformViewRegistry.registerViewFactory(
  'hello-world-html',
  (int viewId) => IFrameElement()
    ..width = '640'
    ..height = '360'
    ..src = 'https://www.youtube.com/embed/IyFZznAk69U'
    ..style.border = 'none');

Взгляните на тот пример. В этом примере была импортирована старая библиотека (29.09.19), но если вы измените flutter_web на flutter, она должна работать.

Также вы можете использовать не только IFrameElement, это может быть обычный html:

    ui.platformViewRegistry.registerViewFactory("simple_div", (int viewId) {
  DivElement element = DivElement();
  ...
  return element;

Вы можете попробовать использовать плагин easy_web_view .

Для iOS и Android он использует собственный плагин webview_flutter, а для Интернета он делает аналогичные вещи из ответа @alex89607.

Вы можете использоватьflutter_inappwebview версия плагина (я его автор)6.x.x, который представляет поддержку веб-платформ и macOS!

Текущая последняя доступная версия 6:6.0.0-beta.16.

Он используетiframeЭлемент HTML под капотом, поэтому, к сожалению, он очень ограничен в возможностях.

Для начала ознакомьтесь с официальной онлайн-документацией Setup Web .

Ответ @mohamed-salah полезен, однако я получал только символ загрузки на моем экране. Нам нужно поставитьwebview внутри WillPopScopeвиджет. Используйте следующий код для правильной загрузкиwebview -

В pubspec.yaml добавить зависимость

flutter_webview_plugin: ^0.3.9+1 // replace with latest version

В StatefulWidget класс, используйте следующий код -

class _WebViewLoadingState extends State<Details> {
  final _webViewPlugin = FlutterWebviewPlugin();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // on pressing back button, exiting the screen instead of showing loading symbol
    _webViewPlugin.onDestroy.listen((_) {
      if (Navigator.canPop(context)) {
        // exiting the screen
        Navigator.of(context).pop();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    // WillPopScope will prevent loading
    return WillPopScope(
      child: WebviewScaffold(
        url: "https://www.google.com",
        withZoom: false,
        withLocalStorage: true,
        withJavascript: true,
        appCacheEnabled: true,
        appBar: AppBar(
          title: Text("Browser"),
        ),
      ),
      onWillPop: () {
        return _webViewPlugin.close();
      }
    );
  }
}

Вы можете использовать плагин webview_flutter_web , это реализация плагина webview_flutter для Интернета. в настоящее время он ограничен, он поддерживает только

  • loadRequest
  • loadHtmlString

Вы можете использовать этот пакет: https://pub.dev/packages/flutter_webview_plugin

и вот рабочий пример, который вы можете использовать:

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var title = 'some title';
    return MaterialApp(
        title: title,
        home: WebviewScaffold(
          url: "yourwebsite.com",
          withZoom: false,
          withLocalStorage: true,
        ));
  }
}
Другие вопросы по тегам