微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter Webview 或 InAppWebview 不会每次都评估 javascript

如何解决Flutter Webview 或 InAppWebview 不会每次都评估 javascript

import 'dart:io';

import 'package:Flutter/material.dart';
import 'package:Flutter_inappwebview/Flutter_inappwebview.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isAndroid) {
    await AndroidInAppWebViewController.setWebContentsDebuggingEnabled(true);

    var swAvailable = await AndroidWebViewFeature.isFeatureSupported(
        AndroidWebViewFeature.SERVICE_WORKER_BASIC_USAGE);
    var swInterceptAvailable = await AndroidWebViewFeature.isFeatureSupported(
        AndroidWebViewFeature.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST);

    if (swAvailable && swInterceptAvailable) {
      AndroidServiceWorkerController serviceWorkerController =
          AndroidServiceWorkerController.instance();

      serviceWorkerController.serviceWorkerClient = AndroidServiceWorkerClient(
        shouldInterceptRequest: (request) async {
          print(request);
          return null;
        },);
    }
  }
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',theme: ThemeData(
        primarySwatch: Colors.blue,),home: MyHomePage(title: 'Flutter Demo Home Page'),);
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  InAppWebViewController? webViewController;
  InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
      crossplatform: InAppWebViewOptions(
        useShouldOverrideUrlLoading: true,mediaplaybackRequiresUserGesture: false,javaScriptCanopenWindowsAutomatically: true,useShouldInterceptFetchRequest: true,android: AndroidInAppWebViewOptions(
        useShouldInterceptRequest: true,useHybridComposition: true,ios: IOSInAppWebViewOptions(
        allowsInlinemediaplayback: true,));

  String url = "";

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        return Future.value(false);
      },child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            centerTitle: true,title: const Text('InAppWebView Example'),leading: IconButton(
              icon: Icon(Icons.arrow_back),onpressed: () {
                Navigator.pop(context);
              },body: Container(
            child: Column(children: <Widget>[
              Container(
                padding: EdgeInsets.all(20.0),child: Text(url),Expanded(
                child: Container(
                  decoration: Boxdecoration(
                      border: Border.all(color: Colors.blueAccent)),child: InAppWebView(
                    initialUrlRequest:
                        URLRequest(url: Uri.parse("https://youtube.com")),initialOptions: options,onWebViewCreated: (InAppWebViewController controller) {
                      webViewController = controller;
                    },onLoadStart: (controller,url) async {
                      
                      setState(() {
                        this.url = url.toString();
                        controller
                            .evaluateJavascript(source: """alert('Hello')""");
                      });
                    },onLoadStop: (controller,url) async {
                      
                    },androidOnPermissionRequest:
                        (controller,origin,resources) async {
                      return PermissionRequestResponse(
                          resources: resources,action: PermissionRequestResponseAction.GRANT);
                    },shouldOverrideUrlLoading:
                        (controller,navigationAction) async {
                      var uri = navigationAction.request.url!;

                      // if (![ "http","https","file","chrome",//   "data","javascript","about"].contains(uri.scheme)) {
                      //   if (await canLaunch) {
                      //     // Launch the App
                      //     await launch(
                      //       url,//     );
                      //     // and cancel the request
                      //     return NavigationActionPolicy.CANCEL;
                      //   }
                      // }

                      // return NavigationActionPolicy.ALLOW;
                    },onUpdateVisitedHistory: (controller,url,androidisReload) {
                      setState(() {
                        this.url = url.toString();
                      });
                    },onProgressChanged:
                        (InAppWebViewController controller,int progress) {},]),);
  }
}

大家好,我在 Flutter 中使用 inAppWebview 并且似乎像 youtube 这样的一些网站不允许在初始 url 或加载后评估 javascript。尽管这在某些网站上按预期工作,但我尝试过 stackoverflow、Flutter.dev,但在 youtube 上没有。

谁能解释一下原因?

谢谢

我使用的是 InAppWebview 5。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。