How can I repair the problems and which WebView element was up to date?
Oh expensive, I am actually scuffling with this downside and it is inflicting fairly a headache! I’ve tried all the pieces I can consider, however I can not seem to discover a answer. Would you be so form as to supply some knowledge and assist me out? I would be eternally grateful!
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'bundle:flutter/materials.dart';
import 'bundle:supplier/supplier.dart';
import 'bundle:flutter_inappwebview/flutter_inappwebview.dart' as inAppWebView;
import 'bundle:url_launcher/url_launcher.dart';
import 'bundle:webview_flutter/webview_flutter.dart' as webViewFlutter;
import '../helpers/extensions/string_ext.dart';
import '../suppliers/webview_provider.dart';
import '../screens/webview_screen.dart';
import '../screens/virtual_attendance_screen.dart';
class WebViewWidget extends StatefulWidget {
const WebViewWidget(this.args, {Key? key}) : tremendous(key: key);
ultimate WebViewArguments args;
@override
State<WebViewWidget> createState() => _WebViewWidgetState();
}
class _WebViewWidgetState extends State<WebViewWidget> {
ultimate Completer<webViewFlutter.WebViewController> _controller =
Completer<webViewFlutter.WebViewController>();
ultimate Completer<inAppWebView.InAppWebViewController> _inAppWebViewController =
Completer<inAppWebView.InAppWebViewController>();
@override
void initState() {
tremendous.initState();
WidgetsBinding.occasion?.addPostFrameCallback((_) async {});
// Allow digital show.
// if (Platform.isAndroid) {
// webViewFlutter.WebView.platform = webViewFlutter.AndroidWebView();
// }
}
@override
void dispose() async {
tremendous.dispose();
if (widget.args.clearCacheOnDispose) {
await _controller.future.then((worth) => worth.clearCache());
await _inAppWebViewController.future.then((worth) => worth.clearCache());
}
}
void updateIsLoading(bool worth) {
if (Supplier.of<WebViewProvider?>(context, pay attention: false) != null) {
Supplier.of<WebViewProvider>(context, pay attention: false)
.updateIsLoading(worth);
}
}
void updatePercentage(String worth) {
if (Supplier.of<WebViewProvider?>(context, pay attention: false) != null) {
Supplier.of<WebViewProvider>(context, pay attention: false)
.updatePercentage(worth);
}
}
void updateIsError(bool worth) {
if (Supplier.of<WebViewProvider?>(context, pay attention: false) != null) {
Supplier.of<WebViewProvider>(context, pay attention: false).updateIsError(worth);
}
}
void onHandleOpenWebView(String url) {
strive {
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) {
strive {
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() {
strive {
Navigator.of(context)
.pushNamed(VirtualAttendanceScreen.routeName)
.then((_) async {
await onSubscribeInAppWebSMSListener();
});
} catch (_) {}
}
Future<void> onSubscribeInAppWebSMSListener() async {
strive {
if (Platform.isAndroid) {
await _inAppWebViewController.future.then((controller) async {
strive {
await controller.addWebMessageListener(
inAppWebView.WebMessageListener(
jsObjectName: "openWebViewPage",
onPostMessage:
(message, sourceOrigin, isMainFrame, replyProxy) {
onHandleOpenWebView(message.toString());
}));
} catch (_) {}
strive {
await controller.addWebMessageListener(
inAppWebView.WebMessageListener(
jsObjectName: "openWebViewPageNoClearCache",
onPostMessage:
(message, sourceOrigin, isMainFrame, replyProxy) {
onHandleOpenWebViewNoClearCache(message.toString());
}));
} catch (_) {}
strive {
await controller.addWebMessageListener(
inAppWebView.WebMessageListener(
jsObjectName: "openAttendanceCheck",
onPostMessage:
(message, sourceOrigin, isMainFrame, replyProxy) {
onHandleOpenAttendanceCheck();
}));
} catch (_) {}
strive {
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 ? Colours.clear : null,
zoomEnabled: false,
initialUrl: args.webURL,
javascriptMode: webViewFlutter.JavascriptMode.unrestricted,
javascriptChannels: {
webViewFlutter.JavascriptChannel(
title: "openWebViewPage",
onMessageReceived: (webViewFlutter.JavascriptMessage message) {
onHandleOpenWebView(message.message);
}),
webViewFlutter.JavascriptChannel(
title: "openWebViewPageNoClearCache",
onMessageReceived: (webViewFlutter.JavascriptMessage message) {
onHandleOpenWebViewNoClearCache(message.message);
}),
webViewFlutter.JavascriptChannel(
title: "openAttendanceCheck",
onMessageReceived: (webViewFlutter.JavascriptMessage message) {
onHandleOpenAttendanceCheck();
}),
webViewFlutter.JavascriptChannel(
title: "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.full(webViewController);
},
onPageStarted: (worth) {
updateIsLoading(true);
},
onPageFinished: (worth) {
updateIsLoading(false);
},
onProgress: (worth) {
updatePercentage(worth.toString());
},
onWebResourceError: (worth) {
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.full(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 construct(BuildContext context) {
return webViewRender(context, widget.args);
}
}
[![The Errors][1]][1]