You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:46