Flutter迁移AndroidX后如何使用flutter_webview_plugin及替代方案咨询
解决flutter_webview_plugin适配AndroidX的问题及替代方案
嘿,我来帮你搞定这个棘手的问题!首先得说,flutter_webview_plugin确实是个年头有点久的插件了,没跟上AndroidX的更新节奏,所以你迁移项目后就因为新旧库冲突导致崩溃。下面给你两种清晰的解决思路:
一、尝试修复flutter_webview_plugin适配AndroidX
如果你特别想用这个老插件,可以试试手动适配,但说实话有点折腾:
- 先确认你的Flutter项目已经开启AndroidX支持:打开
android/gradle.properties文件,确保下面两行配置存在且为true:android.useAndroidX=true android.enableJetifier=true - 接下来修改插件的Android端依赖和代码:
- 找到插件在本地的安装路径(一般在
~/.pub-cache/hosted/pub.dev/flutter_webview_plugin-[版本号]/android) - 打开
build.gradle文件,把所有以com.android.support开头的依赖替换成对应的AndroidX库,比如把com.android.support:appcompat-v7换成androidx.appcompat:appcompat:1.6.1,把com.android.support:support-v4换成androidx.legacy:legacy-support-v4:1.0.0 - 修改插件Java代码里的导入路径,比如把
android.support.v7.app.AppCompatActivity改成androidx.appcompat.app.AppCompatActivity - 重新运行项目,但要注意后续插件更新会覆盖你的修改,所以这种方法只是临时方案。
- 找到插件在本地的安装路径(一般在
二、更省心的替代插件推荐
直接换支持AndroidX的插件才是长期稳妥的选择,以下两个插件完全满足你监听重定向URL、获取授权码的需求:
1. webview_flutter(官方维护)
这是Flutter官方推出的WebView插件,稳定性拉满,完全适配AndroidX。监听重定向和提取授权码的示例代码如下:
import 'package:webview_flutter/webview_flutter.dart'; // 在Widget中使用 WebView( initialUrl: '你的授权登录页面URL', // 开启JS支持,多数登录页面需要这一步 javascriptMode: JavascriptMode.unrestricted, navigationDelegate: (NavigationRequest request) { // 拦截URL,检查是否包含授权码参数(比如code=xxx) if (request.url.contains('code=')) { final uri = Uri.parse(request.url); final authCode = uri.queryParameters['code']; // 这里处理你的授权逻辑,比如关闭WebView、保存授权码等 print('获取到授权码:$authCode'); // 阻止页面跳转,直接拦截 return NavigationDecision.prevent; } // 其他URL正常跳转 return NavigationDecision.navigate; }, )
2. flutter_inappwebview(功能更强大)
如果你需要更多高级功能(比如自定义WebView样式、Cookie管理、下载支持等),这个第三方插件是绝佳选择,同样完美适配AndroidX。示例代码:
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; // 在Widget中使用 InAppWebView( initialUrlRequest: URLRequest(url: Uri.parse('你的授权登录页面URL')), shouldOverrideUrlLoading: (controller, navigationAction) async { final currentUrl = navigationAction.request.url.toString(); // 检查URL是否包含授权码 if (currentUrl.contains('code=')) { final uri = Uri.parse(currentUrl); final authCode = uri.queryParameters['code']; // 处理授权逻辑 print('获取到授权码:$authCode'); // 取消页面跳转 return NavigationActionPolicy.CANCEL; } // 允许其他URL跳转 return NavigationActionPolicy.ALLOW; }, )
总结
原插件崩溃的核心原因是旧的Support库和AndroidX库冲突,如果不想折腾适配,优先选官方的webview_flutter;需要高级功能就用flutter_inappwebview,这两个都能完美解决你的需求。
内容的提问来源于stack exchange,提问作者Gijs Withagen
相关产品推荐
相关产品推荐

