当前位置: 首页 > news >正文

Android与Flutter混合开发:页面跳转与通信完整指南

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页面

五、最佳实践建议

  1. 引擎管理

    • 高频页面预加载多个引擎
    • 低频页面使用withNewEngine()
  2. 通信方式选择

    • 简单数据:路由参数
    • 复杂数据:MethodChannel
  3. 性能优化

    • 添加跳转过渡动画
    • 限制Flutter引擎的ABI架构
  4. 调试技巧

    # 查看Flutter模块路由
    flutter run --route=/debug# 检查混合栈状态
    adb shell dumpsys activity activities
    

通过以上实现,可以构建稳定高效的混合页面导航系统

http://www.dtcms.com/a/316588.html

相关文章:

  • 深入剖析 RAG 检索系统中的召回方式:BM25、向量召回、混合策略全解析
  • Go语言 string
  • stm32项目(21)——基于STM32和MPU6050的体感机械臂开发
  • 跨尺度目标漏检率↓82.4%!陌讯多尺度融合算法在占道经营识别的实战优化
  • 结构化开发方法详解:软件工程的奠基性范式
  • 机器学习——贝叶斯
  • Android 之 Kotlin中的协程(Dispatchers.IO)
  • Android UI 组件系列(十一):RecyclerView 多类型布局与数据刷新实战
  • ara::log::LogStream::WithTag的概念和使用案例
  • 鸿蒙开发--web组件
  • Java技术栈/面试题合集(5)-SpringBoot篇
  • SpringBoot3.x入门到精通系列:4.1 整合 MongoDB 详解
  • 《四种姿势用Java玩转AI大模型:从原生HTTP到LangChain4j》
  • Ubuntu24.04环境下非DOCKER方式安装Mysql5.7
  • 今日行情明日机会——20250805
  • 呼叫中心系统录音管理功能的应用
  • 初学docker
  • 深度拆解Dify:开源LLM开发平台的架构密码与技术突围
  • QUdpSocket发送组播和接受组播数据
  • 【类与对象(上)】C++封装之美:类与this指针解析
  • Nginx 单一端点上高效部署多个 LLM 模型
  • ES 模块动态导入
  • 海上电磁波传播:两径模型 vs 抛物方程模型传播损耗对比
  • 37.字典树
  • Redis集群模式下确保Key在同一Slot的实现方法
  • 按位运算 - C++
  • Velero 简介和部署
  • Linux进程信号——初步认识信号、信号的产生
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • IAR软件中变量监控的几种方法