项目地址: github.com/bineanzhou/…
webview_flutter 0.3.14+1扩展 部分功能官方不支持,需要自己实现,目前支持
support Android consoleMessageDelegate
(iOS暂时拿不到 console只能通过注册javascriptChannels方式打印日志)
WebView(
consoleMessageDelegate: (ConsoleMessage consoleMessage) {
print('consoleMessageDelegate $consoleMessage}');
return NavigationDecision.navigate;
},
);
support Android jsAlert
js报错信息
webview_flutter Unable to create JsDialog without an Activity
由于WebViewFactory create 参数是 SingleViewPresentation.PresentationContext 无法拿到Activity
修改为 containerView.getContext()即可

public final class WebViewFactory extends PlatformViewFactory {
private final BinaryMessenger messenger;
private final View containerView;
WebViewFactory(BinaryMessenger messenger, View containerView) {
super(StandardMessageCodec.INSTANCE);
this.messenger = messenger;
this.containerView = containerView;
}
@SuppressWarnings("unchecked")
@Override
public PlatformView create(Context context, int id, Object args) {
Map<String, Object> params = (Map<String, Object>) args;
// return new FlutterWebView(context, messenger, id, params, containerView);
return new FlutterWebView(containerView.getContext(), messenger, id, params, containerView);
}
}
SingleViewPresentation.PresentationContext context = new SingleViewPresentation.PresentationContext(this.getContext(), this.state.windowManagerHandler);
if (this.state.platformView == null) {
this.state.platformView = this.viewFactory.create(context, this.viewId, this.createParams);
}
support iOS jsAlert

添加_webView.UIDelegate = self;
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler();
}])];
[_viewController presentViewController:alertController animated:YES completion:nil];
}
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
// DLOG(@"msg = %@ frmae = %@",message,frame);
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
completionHandler(NO);
}])];
[alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler(YES);
}])];
[_viewController presentViewController:alertController animated:YES completion:nil];
}
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.text = defaultText;
}];
[alertController addAction:([UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler(alertController.textFields[0].text?:@"");
}])];
[_viewController presentViewController:alertController animated:YES completion:nil];
}