Android與Flutter混合開發:頁面跳轉與通信完整指南
一、Android跳轉Flutter頁面的實現方式
1. 基礎跳轉方法
(1)使用全新引擎跳轉(每次新建)
startActivity(FlutterActivity.withNewEngine().initialRoute("/home") // 指定Flutter初始路由.build(context)
)
(2)使用緩存引擎(推薦,性能更優)
// Application中預初始化
class MyApp : Application() {override fun onCreate() {super.onCreate()val flutterEngine = FlutterEngine(this).apply {dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())}FlutterEngineCache.getInstance().put("default_engine", flutterEngine)}
}// 跳轉時使用緩存引擎
startActivity(FlutterActivity.withCachedEngine("default_engine").initialRoute("/detail") // 可覆蓋引擎初始路由.build(context)
)
2. 參數傳遞方式
(1)通過路由傳參
.initialRoute("/detail?id=123&name=flutter")
(2)通過Intent附加數據
FlutterActivity.withNewEngine().build(context).apply {putExtra("key", "value")}
(3)通過MethodChannel實時通信
// Android端發送數據
MethodChannel(flutterEngine.dartExecutor, "data_channel").invokeMethod("initData", mapOf("key" to "value"))// Flutter端接收
const channel = MethodChannel('data_channel');
channel.setMethodCallHandler((call) async {if(call.method == "initData") {print(call.arguments); // {key: value}}
});
二、Flutter返回Android的實現方式
1. 基礎返回
// 直接關閉當前FlutterActivity
Navigator.pop(context); // 或使用系統級返回
SystemNavigator.pop();
2. 帶參數返回
(1)通過MethodChannel
// Flutter端發送返回數據
const channel = MethodChannel('return_channel');
channel.invokeMethod('returnWithData', {'result': 'success'});// Android端接收
MethodChannel(flutterEngine.dartExecutor, "return_channel").setMethodCallHandler { call, _ ->if (call.method == "returnWithData") {val result = call.argument<String>("result")finish() // 關閉Activity}
}
(2)通過startActivityForResult
// Android端啟動
startActivityForResult(FlutterActivity.withNewEngine().build(this),REQUEST_CODE
)// Flutter端觸發返回
SystemNavigator.pop(animated: true);// Android端接收結果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {if (requestCode == REQUEST_CODE) {// 處理返回數據}
}
三、完整配置示例
1. AndroidManifest.xml
<activity android:name="io.flutter.embedding.android.FlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize" />
2. Flutter路由配置
void main() {runApp(MaterialApp(initialRoute: '/',routes: {'/': (context) => HomePage(),'/detail': (context) => DetailPage(),},),);
}
3. 跳轉封裝工具類
object FlutterRouter {private const val ENGINE_ID = "default_engine"fun init(application: Application) {FlutterEngine(application).apply {dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())FlutterEngineCache.getInstance().put(ENGINE_ID, this)}}fun open(context: Context, route: String, params: Map<String, Any>? = null) {val intent = FlutterActivity.withCachedEngine(ENGINE_ID).initialRoute(route).build(context)params?.forEach { (key, value) ->intent.putExtra(key, value.toString())}context.startActivity(intent)(context as? Activity)?.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)}
}
四、常見問題解決方案
問題現象 | 解決方案 |
---|---|
黑屏/白屏 | 設置backgroundMode(FlutterActivity.BackgroundMode.opaque) |
路由不生效 | 檢查Flutter端MaterialApp 的路由表配置 |
內存泄漏 | 在onDestroy 中調用flutterEngine.destroy() |
返回鍵無效 | 使用WillPopScope 組件包裹Flutter頁面 |
五、最佳實踐建議
-
引擎管理
- 高頻頁面預加載多個引擎
- 低頻頁面使用
withNewEngine()
-
通信方式選擇
- 簡單數據:路由參數
- 復雜數據:MethodChannel
-
性能優化
- 添加跳轉過渡動畫
- 限制Flutter引擎的ABI架構
-
調試技巧
# 查看Flutter模塊路由 flutter run --route=/debug# 檢查混合棧狀態 adb shell dumpsys activity activities
通過以上實現,可以構建穩定高效的混合頁面導航系統