如何解决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 举报,一经查实,本站将立刻删除。