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,
));
}
}