如何在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
相关产品推荐
相关产品推荐

