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

如何在Flutter应用中添加第二个Android Activity并共享Flutter引擎?

在Flutter应用中添加共享Flutter引擎的新Activity解决Google Tap&Pay验证码问题

要解决Flutter单Activity架构下,Google Wallet需要启动应用内验证码Activity的问题,你可以创建一个共享同一Flutter引擎的新Native Activity,具体步骤如下:

1. 在Application类中初始化并持有共享Flutter引擎

首先在自定义Application类中提前初始化Flutter引擎,确保所有需要共享引擎的Activity都能复用它:

class MyApplication : Application() {
    lateinit var flutterEngine: FlutterEngine

    override fun onCreate() {
        super.onCreate()
        // 初始化Flutter引擎
        flutterEngine = FlutterEngine(this)
        // 指定Flutter入口函数
        flutterEngine.dartExecutor.executeDartEntrypoint(
            DartExecutor.DartEntrypoint.createDefault()
        )
        // 预缓存引擎,提升启动速度
        FlutterEngineCache.getInstance().put("shared_engine", flutterEngine)
    }
}

别忘了在AndroidManifest.xml中指定这个Application:

<application
    android:name=".MyApplication"
    ...>
    <!-- 其他配置 -->
</application>

2. 创建共享引擎的验证码Activity

新建一个继承自FlutterActivity的VerificationActivity,重写provideFlutterEngine方法,复用Application中初始化的共享引擎:

class VerificationActivity : FlutterActivity() {
    override fun provideFlutterEngine(context: Context): FlutterEngine? {
        // 从缓存中获取共享引擎
        return FlutterEngineCache.getInstance().get("shared_engine")
    }
}

3. 配置AndroidManifest.xml

在Manifest中注册这个新Activity,根据需求设置启动模式(比如singleTop避免重复创建,确保能被Google Wallet正常启动):

<activity
    android:name=".VerificationActivity"
    android:launchMode="singleTop"
    android:theme="@style/LaunchTheme"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize">
</activity>

4. 处理Google Wallet的启动请求

当Google Wallet需要启动验证码页面时,确保启动的是我们创建的VerificationActivity,而不是默认的FlutterActivity。你可以在原生层处理Wallet的回调逻辑,直接启动该Activity:

// 示例:在原FlutterActivity中处理Wallet的启动请求
fun startVerificationForWallet() {
    val intent = Intent(this, VerificationActivity::class.java)
    // 传递验证码相关参数
    intent.putExtra("card_id", "xxx")
    startActivityForResult(intent, REQUEST_CODE_VERIFICATION)
}

5. Flutter端复用页面逻辑

因为两个Activity共享同一个Flutter引擎,你可以在Flutter代码中通过路由或参数判断,显示验证码页面。比如在main.dart中根据入口参数切换页面:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 获取原生传递的参数
  final initialRoute = WidgetsBinding.instance.platformDispatcher.defaultRouteName;
  runApp(MyApp(initialRoute: initialRoute));
}

class MyApp extends StatelessWidget {
  final String initialRoute;

  const MyApp({super.key, required this.initialRoute});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: initialRoute == "/verification" ? "/verification" : "/home",
      routes: {
        "/home": (context) => const HomePage(),
        "/verification": (context) => const VerificationPage(),
      },
    );
  }
}

这样,VerificationActivity启动后会直接加载Flutter的验证码页面,且与原Activity共享同一个引擎会话,不会导致原有实例失效。

内容的提问来源于stack exchange,提问作者sagar suri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:55:11