如何修复问题,更新了哪个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的数据
1条答案
按热度按时间ehxuflar1#
你可以看看我的github repo完整的webview工作示例,使用最新的
flutter version 3.16
https://github.com/RamG222/flutter_webview_freemium