dart 在将我的Flutter项目版本2.10.0更新到最新版本后,WebView出现了问题,它无法正常工作

yzckvree  于 5个月前  发布在  Flutter
关注(0)|答案(1)|浏览(80)

如何修复问题,更新了哪个WebView组件?

哎呀,我真的在纠结这个问题,它让我很头疼!我已经尝试了我能想到的一切,但我似乎找不到一个解决办法。你能不能好心地提供一些智慧,帮助我?我将永远感激!

import 'dart:async';
import 'dart:convert';
import 'dart:io';

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

import 'package:flutter_inappwebview/flutter_inappwebview.dart' as inAppWebView;
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart' as webViewFlutter;

import '../helpers/extensions/string_ext.dart';
import '../providers/webview_provider.dart';
import '../screens/webview_screen.dart';
import '../screens/virtual_attendance_screen.dart';

class WebViewWidget extends StatefulWidget {
  const WebViewWidget(this.args, {Key? key}) : super(key: key);
  final WebViewArguments args;

  @override
  State<WebViewWidget> createState() => _WebViewWidgetState();
}

class _WebViewWidgetState extends State<WebViewWidget> {
  final Completer<webViewFlutter.WebViewController> _controller =
      Completer<webViewFlutter.WebViewController>();
  final Completer<inAppWebView.InAppWebViewController> _inAppWebViewController =
      Completer<inAppWebView.InAppWebViewController>();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addPostFrameCallback((_) async {});

    // Enable virtual display.
    // if (Platform.isAndroid) {
    //   webViewFlutter.WebView.platform = webViewFlutter.AndroidWebView();
    // }
  }

  @override
  void dispose() async {
    super.dispose();
    if (widget.args.clearCacheOnDispose) {
      await _controller.future.then((value) => value.clearCache());
      await _inAppWebViewController.future.then((value) => value.clearCache());
    }
  }

  void updateIsLoading(bool value) {
    if (Provider.of<WebViewProvider?>(context, listen: false) != null) {
      Provider.of<WebViewProvider>(context, listen: false)
          .updateIsLoading(value);
    }
  }

  void updatePercentage(String value) {
    if (Provider.of<WebViewProvider?>(context, listen: false) != null) {
      Provider.of<WebViewProvider>(context, listen: false)
          .updatePercentage(value);
    }
  }

  void updateIsError(bool value) {
    if (Provider.of<WebViewProvider?>(context, listen: false) != null) {
      Provider.of<WebViewProvider>(context, listen: false).updateIsError(value);
    }
  }

  void onHandleOpenWebView(String url) {
    try {
      Map<String, dynamic> json = jsonDecode(url);
      if (json["url"] != null && json["url"] != StringExtension.emptyString) {
        Navigator.of(context)
            .pushNamed(
          WebViewScreen.routeName,
          arguments: WebViewArguments(
            json["title"],
            json["url"],
          ),
        )
            .then((_) async {
          await onSubscribeInAppWebSMSListener();
        });
      }
    } catch (_) {}
  }

  void onHandleOpenWebViewNoClearCache(String url) {
    try {
      Map<String, dynamic> json = jsonDecode(url);
      if (json["url"] != null && json["url"] != StringExtension.emptyString) {
        Navigator.of(context)
            .pushNamed(
          WebViewScreen.routeName,
          arguments: WebViewArguments(
            json["title"],
            json["url"],
            clearCacheOnDispose: false,
          ),
        )
            .then((_) async {
          await onSubscribeInAppWebSMSListener();
        });
      }
    } catch (_) {}
  }

  void onHandleOpenAttendanceCheck() {
    try {
      Navigator.of(context)
          .pushNamed(VirtualAttendanceScreen.routeName)
          .then((_) async {
        await onSubscribeInAppWebSMSListener();
      });
    } catch (_) {}
  }

  Future<void> onSubscribeInAppWebSMSListener() async {
    try {
      if (Platform.isAndroid) {
        await _inAppWebViewController.future.then((controller) async {
          try {
            await controller.addWebMessageListener(
                inAppWebView.WebMessageListener(
                    jsObjectName: "openWebViewPage",
                    onPostMessage:
                        (message, sourceOrigin, isMainFrame, replyProxy) {
                      onHandleOpenWebView(message.toString());
                    }));
          } catch (_) {}
          try {
            await controller.addWebMessageListener(
                inAppWebView.WebMessageListener(
                    jsObjectName: "openWebViewPageNoClearCache",
                    onPostMessage:
                        (message, sourceOrigin, isMainFrame, replyProxy) {
                      onHandleOpenWebViewNoClearCache(message.toString());
                    }));
          } catch (_) {}
          try {
            await controller.addWebMessageListener(
                inAppWebView.WebMessageListener(
                    jsObjectName: "openAttendanceCheck",
                    onPostMessage:
                        (message, sourceOrigin, isMainFrame, replyProxy) {
                      onHandleOpenAttendanceCheck();
                    }));
          } catch (_) {}
          try {
            await controller.addWebMessageListener(
                inAppWebView.WebMessageListener(
                    jsObjectName: "openURLLauncherExternal",
                    onPostMessage:
                        (message, sourceOrigin, isMainFrame, replyProxy) {
                      var messageData = jsonDecode(message.toString());
                      launchUrl(Uri.parse(messageData["url"].toString()),
                          mode: LaunchMode.externalApplication);
                    }));
          } catch (_) {}
        });
      }
    } catch (_) {}
  }

  Widget webViewRender(BuildContext context, WebViewArguments args) {
    if (Platform.isIOS) {
      return webViewFlutter.WebView(
        backgroundColor: args.transparentBackground ? Colors.transparent : null,
        zoomEnabled: false,
        initialUrl: args.webURL,
        javascriptMode: webViewFlutter.JavascriptMode.unrestricted,
        javascriptChannels: {
          webViewFlutter.JavascriptChannel(
              name: "openWebViewPage",
              onMessageReceived: (webViewFlutter.JavascriptMessage message) {
                onHandleOpenWebView(message.message);
              }),
          webViewFlutter.JavascriptChannel(
              name: "openWebViewPageNoClearCache",
              onMessageReceived: (webViewFlutter.JavascriptMessage message) {
                onHandleOpenWebViewNoClearCache(message.message);
              }),
          webViewFlutter.JavascriptChannel(
              name: "openAttendanceCheck",
              onMessageReceived: (webViewFlutter.JavascriptMessage message) {
                onHandleOpenAttendanceCheck();
              }),
          webViewFlutter.JavascriptChannel(
              name: "openURLLauncherExternal",
              onMessageReceived: (webViewFlutter.JavascriptMessage message) {
                var messageData = jsonDecode(message.message.toString());
                launchUrl(Uri.parse(messageData["url"].toString()),
                    mode: LaunchMode.externalApplication);
              }),
        }.toSet(),
        onWebViewCreated: (webViewFlutter.WebViewController webViewController) {
          _controller.complete(webViewController);
        },
        onPageStarted: (value) {
          updateIsLoading(true);
        },
        onPageFinished: (value) {
          updateIsLoading(false);
        },
        onProgress: (value) {
          updatePercentage(value.toString());
        },
        onWebResourceError: (value) {
          updateIsError(true);
        },
      );
    } else {
      return inAppWebView.InAppWebView(
        initialUrlRequest: inAppWebView.URLRequest(url: Uri.parse(args.webURL)),
        initialOptions: inAppWebView.InAppWebViewGroupOptions(
          crossPlatform: inAppWebView.InAppWebViewOptions(
              javaScriptEnabled: true,
              javaScriptCanOpenWindowsAutomatically: true,
              useOnDownloadStart: true,
              useOnLoadResource: true,
              transparentBackground: args.transparentBackground,
              cacheEnabled: false,
              clearCache: args.isClearCache),
          android: inAppWebView.AndroidInAppWebViewOptions(
            // useHybridComposition: true,
            cacheMode: inAppWebView.AndroidCacheMode.LOAD_NO_CACHE,
          ),
          ios: inAppWebView.IOSInAppWebViewOptions(
            allowsInlineMediaPlayback: true,
          ),
        ),
        onWebViewCreated: (controller) async {
          // await controller.addWebMessageListener(
          //     inAppWebView.WebMessageListener(
          //         jsObjectName: "openWebViewPage",
          //         onPostMessage:
          //             (message, sourceOrigin, isMainFrame, replyProxy) {
          //           onHandleOpenWebView(message.toString());
          //         }));
          // await controller.addWebMessageListener(
          //     inAppWebView.WebMessageListener(
          //         jsObjectName: "openWebViewPageNoClearCache",
          //         onPostMessage:
          //             (message, sourceOrigin, isMainFrame, replyProxy) {
          //           onHandleOpenWebViewNoClearCache(message.toString());
          //         }));
          // await controller.addWebMessageListener(
          //     inAppWebView.WebMessageListener(
          //         jsObjectName: "openAttendanceCheck",
          //         onPostMessage:
          //             (message, sourceOrigin, isMainFrame, replyProxy) {
          //           onHandleOpenAttendanceCheck();
          //         }));
          _inAppWebViewController.complete(controller);
          await onSubscribeInAppWebSMSListener();
        },
        onLoadStart: (controller, url) {
          updateIsLoading(true);
        },
        onLoadStop: (controller, url) {
          updateIsLoading(false);
        },
        onProgressChanged: (controller, progress) {
          updatePercentage(progress.toString());
        },
        onLoadError: (controller, url, code, message) {
          updateIsError(true);
        },
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return webViewRender(context, widget.args);
  }
}
[![The Errors][1]][1]

字符串
x1c 0d1x的数据

ehxuflar

ehxuflar1#

你可以看看我的github repo完整的webview工作示例,使用最新的flutter version 3.16
https://github.com/RamG222/flutter_webview_freemium

相关问题