Android集成Flutter模块MethodChannel通信报MissingPluginException异常
问题根因
报MissingPluginException和传值失败是两个核心错误导致的:
- 启动的目标Activity错误:你调用
FlutterActivity.createDefaultIntent()生成的Intent,默认启动的是Flutter SDK内置的基础FlutterActivity,不是你自己实现了MethodChannel注册、Intent解析逻辑的自定义MainActivity,原生侧的方法处理器根本没注册到当前运行的Flutter引擎上,自然找不到对应方法实现。 - Intent参数不匹配判断逻辑:你在自定义MainActivity的
onCreate里,只处理Action为Intent.ACTION_SEND、MIME类型为text/plain的Intent,但启动时只传了extra参数,既没设置Action也没设置type,就算启动对了Activity,handleSendText也不会触发,sharedText始终为null。
修复方案
1. 替换启动Flutter页面的代码
显式指定启动你自定义的MainActivity,补全Intent要求的Action和type参数,替换原有启动逻辑:
Intent flutterIntent = new Intent(getApplicationContext(), MainActivity.class); flutterIntent.setAction(Intent.ACTION_SEND); flutterIntent.setType("text/plain"); flutterIntent.putExtra("myKey", "From Native Intent"); startActivity(flutterIntent);
2. 修正AndroidManifest配置
你的自定义MainActivity在com.izan.abc.host包下,原配置里的Activity路径写的是.MainActivity,会导致系统找不到对应类,修改为正确路径;如果不需要外部应用唤起Flutter页面,可以删掉SEND类型的intent-filter避免误唤起:
<activity android:name=".host.MainActivity" android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:exported="true"> <!-- 无外部唤起需求可删除以下intent-filter --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity>
3. 补全MethodChannel的默认返回逻辑
原有MethodCallHandler只处理了匹配mymethod的场景,未匹配时没有返回结果,会导致调用方永久等待,补充未实现的返回逻辑:
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .setMethodCallHandler( (call, result) -> { if (call.method.contentEquals("mymethod")) { result.success(sharedText); sharedText = null; } else { result.notImplemented(); } } );
4. 优化Flutter侧调用时机
原逻辑在initState里直接调用原生方法,可能遇到Flutter引擎未完全初始化的时序问题,调整为等首帧渲染完成后再调用:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { await getSharedText(); }); }
注意事项
不要直接修改Flutter模块下.android目录的文件,这个目录是Flutter自动生成的构建缓存目录,执行flutter clean、flutter pub get时会被完全重置,自定义原生逻辑需要写到宿主App的主android工程目录下。
内容的提问来源于stack exchange,提问作者Izan Majeed
相关产品推荐
相关产品推荐

