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) {},
),
),
),
]),
),
),
),
);
}
}
Привет, ребята, я использую inAppWebview во флаттере, и кажется, что некоторые веб-сайты, такие как youtube, не позволяют оценивать javascript после первоначального URL-адреса или загрузки. Хотя на некоторых веб-сайтах это работает так, как задумано, я пробовал stackoverflow, flutter.dev, но не на YouTube.
Может кто-нибудь объяснить почему?
Спасибо
Я использую InAppWebview 5.
1 ответ
оценка javascript должна вызываться при остановке загрузки, а не при запуске загрузки, поскольку ваша функция javascript может быть недоступна до полной загрузки страницы.