Flutter应用第二次调用原生Activity触发MissingPluginException问题
问题分析与修复方案
问题根源
首次调用原生Activity正常,但第二次返回Flutter后调用方法触发MissingPluginException,核心原因是:
- 返回Flutter时使用
withNewEngine()会创建全新的FlutterEngine实例,这个新引擎没有注册StartSecondActivity的方法处理器,导致找不到实现。 - 之前尝试缓存引擎崩溃,是因为缓存的引擎绑定的
MainActivity上下文已被系统回收,复用失效上下文引发异常。
修复步骤
1. 在Application级别初始化缓存FlutterEngine
将FlutterEngine的初始化移到Application类中,利用其更长的生命周期避免上下文失效:
public class MyApp extends Application { public static final String CACHED_ENGINE_ID = "cab_flutter_id"; @Override public void onCreate() { super.onCreate(); // 预初始化FlutterEngine并缓存 FlutterEngine flutterEngine = new FlutterEngine(this); // 设置初始路由 flutterEngine.getNavigationChannel().setInitialRoute("/wb"); // 注册MethodChannel及方法处理器 new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "com.test_ops") .setMethodCallHandler((call, result) -> { if (call.method.equals("StartSecondActivity")) { Intent intent = new Intent(getApplicationContext(), IntentWedgeSample.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); result.success("ActivityStarted"); } else { result.notImplemented(); } }); // 缓存引擎 FlutterEngineCache.getInstance().put(CACHED_ENGINE_ID, flutterEngine); } }
在AndroidManifest.xml中配置自定义Application:
<application android:name=".MyApp" <!-- 其他原有配置 --> > </application>
2. 修改MainActivity复用缓存引擎
让MainActivity直接使用缓存好的引擎,无需重复初始化:
public class MainActivity extends FlutterActivity { @Override public String getCachedEngineId() { return MyApp.CACHED_ENGINE_ID; } }
3. 调整原生Activity返回Flutter的逻辑
从IntentWedgeSample返回时,关闭自身并复用缓存引擎启动Flutter,同时清理栈避免多实例:
// 关闭当前原生Activity finish(); // 启动缓存引擎的FlutterActivity Intent flutterIntent = FlutterActivity.withCachedEngine(MyApp.CACHED_ENGINE_ID) .build(IntentWedgeSample.this); // 确保回到同一个Flutter实例,清理冗余栈 flutterIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(flutterIntent);
4. Flutter端补充优化
确保MethodChannel全局唯一,避免重复创建(比如在main函数初始化):
final platform = MethodChannel('com.test_ops'); void main() { runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者Mr 8991
相关产品推荐
相关产品推荐

