Flutter多WebView管理插件flutter_multiple_webview_plugin的使用

Flutter多WebView管理插件flutter_multiple_webview_plugin的使用

NOTICE

这个webview包允许你使用多个WebView实例。

继续Flutter之旅!

Flutter WebView 插件

允许Flutter与原生WebView通信的插件。

警告: WebView不集成在widget树中,它是在Flutter视图之上的原生视图。你将无法看到覆盖在WebView区域上的snackbars、对话框或其他Flutter小部件。

getSafeAcceptedType()函数仅适用于最低SDK为21。 eval()函数仅支持SDK为19或更高的版本来评估JavaScript。

开始使用

要开始使用Flutter,请查看我们的在线文档。

iOS

为了让插件正确工作,你需要向ios/Runner/Info.plist添加新键:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

NSAllowsArbitraryLoadsInWebContent适用于iOS 10及以上版本,而NSAllowsArbitraryLoads适用于iOS 9。

它如何工作

使用Flutter导航全屏启动WebView

new MaterialApp(
      routes: {
        "/": (_) => new WebviewScaffold(
          url: "https://www.google.com",
          appBar: new AppBar(
            title: new Text("Widget webview"),
          ),
        ),
      },
    );

可选参数hiddeninitialChild可用,以便在页面加载时显示其他内容。 如果将hidden设置为true,它会显示一个默认的CircularProgressIndicator。如果你另外指定了一个Widget作为initialChild,你可以显示任何你喜欢的内容直到页面加载完成。

例如,以下代码将显示一个带有文本“等待…”的红色屏幕:

return new MaterialApp(
  title: 'Flutter WebView Demo',
  theme: new ThemeData(
    primarySwatch: Colors.blue,
  ),
  routes: {
    '/': (_) => const MyHomePage(title: 'Flutter WebView Demo'),
    '/widget': (_) => new WebviewScaffold(
      url: selectedUrl,
      appBar: new AppBar(
        title: const Text('Widget webview'),
      ),
      withZoom: true,
      withLocalStorage: true,
      hidden: true,
      initialChild: Container(
        color: Colors.redAccent,
        child: const Center(
          child: Text('Waiting.....'),
        ),
      ),
    ),
  },
);

FlutterMultipleWebviewPlugin提供了一个单例实例,链接到一个唯一的WebView, 这样你可以在应用程序的任何地方控制WebView

监听事件

final flutterWebviewPlugin = new FlutterMultipleWebviewPlugin();

flutterWebviewPlugin.onUrlChanged.listen((String url) {

});

监听WebView中的滚动事件

final flutterWebviewPlugin = new FlutterMultipleWebviewPlugin();
flutterWebviewPlugin.onScrollYChanged.listen((double offsetY) { // 最新的垂直滚动偏移值
  // 在这里比较垂直滚动的变化与旧值
});

flutterWebviewPlugin.onScrollXChanged.listen((double offsetX) { // 最新的水平滚动偏移值
  // 在这里比较水平滚动的变化与旧值
});

注意:请注意iOS和Android之间的滚动距离略有不同。Android的滚动值差异通常比iOS设备大。

隐藏WebView

final flutterWebviewPlugin = new FlutterMultipleWebviewPlugin();

flutterWebviewPlugin.launch(url, hidden: true);

关闭已启动的WebView

flutterWebviewPlugin.close();

在自定义矩形内启动WebView

final flutterWebviewPlugin = new FlutterMultipleWebviewPlugin();

flutterWebviewPlugin.launch(url,
  fullScreen: false,
  rect: new Rect.fromLTWH(
    0.0,
    0.0,
    MediaQuery.of(context).size.width,
    300.0,
  ),
);

向WebView注入自定义代码

使用flutterWebviewPlugin.evalJavaScript(String code)。此函数必须在页面加载完成后运行(即监听onStateChanged事件,状态为finishLoad)。

如果你有大量的JavaScript要嵌入,可以使用资源文件。将资源文件添加到pubspec.yaml,然后像这样调用该函数:

Future<String> loadJS(String name) async {
  var givenJS = rootBundle.loadString('assets/$name.js');
  return givenJS.then((String js) {
    flutterWebViewPlugin.onStateChanged.listen((viewState) async {
      if (viewState.type == WebViewState.finishLoad) {
        flutterWebViewPlugin.evalJavascript(js);
      }
    });
  });
}

访问文件系统中的本地文件

在启动函数或WebView支架中将withLocalUrl选项设置为true以启用本地URL的支持。

注意,在iOS上,还需要将localUrlScope选项设置为目录路径。所有文件(或子文件夹中的文件)都将被允许访问。如果省略,则只有正在打开的本地文件将被允许访问,导致无法加载子资源。此选项在Android上被忽略。

忽略SSL错误

ignoreSSLErrors选项设置为true以显示来自服务器的内容,这些服务器的证书通常不受WebView信任,如自签名证书。

警告: 不要在生产环境中使用此功能。

注意,在iOS上,你需要向ios/Runner/Info.plist添加新键:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

NSAllowsArbitraryLoadsInWebContent适用于iOS 10及以上版本,而NSAllowsArbitraryLoads适用于iOS 9。 否则,你仍然无法显示来自未受信任证书页面的内容。

你可以通过https://self-signed.badssl.com/测试你的SSL证书忽略是否有效。

WebView事件

  • Stream<Null> onDestroy
  • Stream<String> onUrlChanged
  • Stream<WebViewStateChanged> onStateChanged
  • Stream<double> onScrollXChanged
  • Stream<double> onScrollYChanged
  • Stream<String> onError

不要忘记释放WebView

flutterWebviewPlugin.dispose()

WebView函数

Future<Null> launch(String url, {
    Map<String, String> headers: null,
    Set<JavascriptChannel> javascriptChannels: null,
    bool withJavascript: true,
    bool clearCache: false,
    bool clearCookies: false,
    bool hidden: false,
    bool enableAppScheme: true,
    Rect rect: null,
    String userAgent: null,
    bool withZoom: false,
    bool displayZoomControls: false,
    bool withLocalStorage: true,
    bool withLocalUrl: true,
    String localUrlScope: null,
    bool withOverviewMode: false,
    bool scrollBar: true,
    bool supportMultipleWindows: false,
    bool appCacheEnabled: false,
    bool allowFileURLs: false,
    bool useWideViewPort: false,
    String invalidUrlRegex: null,
    bool geolocationEnabled: false,
    bool debuggingEnabled: false,
    bool ignoreSSLErrors: false,
    bool allowsInlineMediaPlayback: null,
    bool androidOverScrollNever = false,
});
Future<String> evalJavascript(String code);
Future<Map<String, dynamic>> getCookies();
Future<Null> cleanCookies();
Future<Null> resize(Rect rect);
Future<Null> show();
Future<Null> hide();
Future<Null> reloadUrl(String url);
Future<Null> close();
Future<Null> reload();
Future<Null> goBack();
Future<Null> goForward();
Future<Null> stopLoading();
Future<bool> canGoBack();
Future<bool> canGoForward();

更多关于Flutter多WebView管理插件flutter_multiple_webview_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多WebView管理插件flutter_multiple_webview_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_multiple_webview_plugin 的代码示例。这个插件允许你在 Flutter 应用中管理多个 WebView 实例。

首先,你需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_multiple_webview_plugin: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是代码示例,展示了如何使用 flutter_multiple_webview_plugin 来管理多个 WebView 实例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Multiple WebView Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final FlutterMultipleWebviewPlugin _webviewPlugin = FlutterMultipleWebviewPlugin();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Multiple WebView Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                _webviewPlugin.launch(
                  url: 'https://www.google.com',
                  webViewId: 'webview1',
                );
              },
              child: Text('Open Google in WebView 1'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _webviewPlugin.launch(
                  url: 'https://www.flutter.dev',
                  webViewId: 'webview2',
                );
              },
              child: Text('Open Flutter.dev in WebView 2'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _webviewPlugin.close(webViewId: 'webview1');
              },
              child: Text('Close WebView 1'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _webviewPlugin.close(webViewId: 'webview2');
              },
              child: Text('Close WebView 2'),
            ),
          ],
        ),
      ),
    );
  }
}

在上面的代码中,我们创建了一个简单的 Flutter 应用,其中包含了两个按钮,分别用于在不同的 WebView 中打开不同的 URL。同时,也提供了关闭这些 WebView 的按钮。

为了显示 WebView,你需要在 Android 和 iOS 项目中进行一些配置。通常,这个插件会自动处理大部分配置,但在某些情况下,你可能需要手动添加一些权限或设置。

注意flutter_multiple_webview_plugin 插件的 API 和使用方法可能会随着版本更新而变化,请参考插件的官方文档以获取最新和最准确的信息。

此外,如果你需要在 WebView 之间共享数据或进行更多复杂的交互,你可能需要进一步了解该插件的高级功能,如 JavaScript 桥接等。

回到顶部