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.pswp.cn/bicheng/92220.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92220.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92220.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web存储技术详解:sessionStorage、localStorage与Cookie

一、核心特性对比特性CookielocalStoragesessionStorage存储大小4KB左右5-10MB5-10MB生命周期可设置过期时间永久存储&#xff08;除非手动清除&#xff09;会话期间有效&#xff08;标签页关闭即清除&#xff09;作用域同源的所有窗口同源的所有窗口仅当前标签页自动发送每次H…

3. 为什么 0.1 + 0.2 != 0.3

总结 底层是二进制实现概述 在 JavaScript 中&#xff0c;0.1 0.2 的结果并不是精确的 0.3&#xff0c;而是 0.30000000000000004。这个现象并不是 JavaScript 的“bug”&#xff0c;而是由于浮点数在计算机底层的二进制表示方式导致的精度丢失问题。一、计算机如何表示小数&a…

股票数据接口哪家好?专业评测各主流接口的优势与不足

Python股票接口实现查询账户&#xff0c;提交订单&#xff0c;自动交易&#xff08;1&#xff09; Python股票程序交易接口查账&#xff0c;提交订单&#xff0c;自动交易&#xff08;2&#xff09; 股票量化&#xff0c;Python炒股&#xff0c;CSDN交流社区 >>> 股票…

如何用分布式架构视角理解宇宙稳定性?从精细调参到微服务的类比思考

在调试一段多线程分布式代码时&#xff0c;我忽然意识到一个不合理的事实&#xff1a;为什么现实世界这么稳定&#xff1f;为什么没有“宇宙蓝屏”或“感知崩溃”&#xff1f;为什么每天醒来&#xff0c;我们还能看到同样的物理规律、感知同一个自我&#xff1f;站在程序员的角…

游戏画面总是卡顿怎么办 告别延迟畅玩游戏

玩游戏最让人头疼的问题之一就是画面卡顿&#xff0c;影响操作流畅度与游戏体验。卡顿可能由硬件性能、系统设置、网络延迟等多种因素导致。本文将从不同角度出发&#xff0c;为你提供五个有效解决方法&#xff0c;帮助你快速提升游戏流畅度。 一、降低游戏画质设置 高画质虽然…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码

在现代Web应用中&#xff0c;密码重置功能是用户账户安全体系中不可或缺的一部分。本文将详细介绍如何使用Vue.js前端框架和SpringBoot后端框架实现一个基于邮箱验证的密码重置功能。功能概述本密码重置功能包含以下核心流程&#xff1a;用户输入注册邮箱系统发送验证码到该邮箱…

华为云云产品的发展趋势:技术创新驱动数字化未来

近年来&#xff0c;随着5G、人工智能&#xff08;AI&#xff09;、大数据、物联网&#xff08;IoT&#xff09;和边缘计算等新兴技术的快速发展&#xff0c;全球云计算产业正迎来新一轮变革。作为中国领先的云服务提供商&#xff0c;华为云依托华为集团在ICT&#xff08;信息与…

防御保护07-08

CIDR 可变长子网掩码 VLSM 无类域间路由NET 用少量的私有地址替换大量的共有地址私网地址不能再互联网上去使用、去分配。这里的互联网指的是公网。服务器映射--用来使外部用户能访问私网服务器。静态映射--公网地址和私网地址进行一对一的映射。地址池--中存在多个公网IP地址时…

PDF转图片工具技术文档(命令行版本)

PDF转图片工具技术文档&#xff08;命令行版本&#xff09; 1. 功能概述 本工具是一个基于PyMuPDF库的PDF转图片命令行工具&#xff0c;能够&#xff1a; 通过命令行参数接收PDF文件路径将PDF的每一页转换为PNG格式的图片自动创建输出目录&#xff08;./static&#xff09;保存…

k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC

为响应政策&#xff0c;最近在捣鼓国产化云原生平台的搭建。在搭建过程中遇到了问题记录下来&#xff0c;以备后续查找。 我选用了中国电子云的云平台来搭建K8S集群&#xff0c;选用的技术栈是华为开源的openeulerk8sisulad框架&#xff0c;参考官网文档资料&#xff1a;iSula…

chatgpt plus简单得,不需要求人,不需要野卡,不需要合租,不需要昂贵的价格

ChatGPT Plus&#xff1a;开启智能对话的新纪元 引言&#xff1a;AI助手的时代已经到来 在当今信息爆炸的时代&#xff0c;人工智能助手已经成为我们工作、学习和生活中不可或缺的伙伴。作为AI领域的佼佼者&#xff0c;ChatGPT自问世以来就以其强大的语言理解和生成能力赢得了…

鸿蒙OS 系统安全

鸿蒙OS 系统安全 在搭载 HarmonyOS 的分布式终端上&#xff0c;可以保证“正确的人&#xff0c;通过正确的设备&#xff0c;正确地使用数据”。 • 通过“分布式多端协同身份认证”来保证“正确的人”。 • 通过“在分布式终端上构筑可信运行环境”来保证“正确的设备”。 • …

【Dify学习笔记】:保留原所有数据,升级Dify版本

【Dify学习笔记】&#xff1a;保留原所有数据&#xff0c;升级Dify版本原版本1.4.0 升级最新版1.7.1由于是升级成功后才记录的笔记&#xff0c;没法获取旧页面的版本了&#xff0c;先看下镜像信息&#xff0c;上面的拉取的新容器&#xff0c;下面的之前的旧容器1、关闭旧docker…

微信小程序功能实现:页面导航与跳转

1. 声明式导航&#xff08;navigator组件&#xff09;声明式导航通过在WXML页面中使用 <navigator> 组件来实现页面跳转&#xff0c;使用起来较为直观简便&#xff0c;语法格式如下&#xff1a;<navigator url"目标页面路径" open-type"跳转类型"…

GenieWizard: Multimodal App Feature Discovery with LargeLanguage Models

GenieWizard:使用LargeLanguage模型发现多模式应用程序功能 以下是对论文《GenieWizard: Multimodal App Feature Discovery with Large Language Models》的详细总结,结合教育技术学视角的分析: 一、核心问题与背景 问题背景: 多模态交互(如语音+触摸)比传统图形交互更灵…

[硬件电路-120]:模拟电路 - 信号处理电路 - 在信息系统众多不同的场景,“高速”的含义是不尽相同的。

一、按照维度区分在信息系统中&#xff0c;“高速”是一个相对且多维的概念&#xff0c;其核心在于信号或数据的动态变化速率远超传统系统处理能力&#xff0c;导致必须采用专门的设计技术来保障传输质量与实时性。这一概念可从以下四个维度解析&#xff1a;1、频率维度&#x…

React ahooks——副作用类hooks之useThrottleFn

useThrottleFn 用于创建一个节流函数&#xff0c;确保该函数在指定时间内最多执行一次。一、基本使用import { useThrottleFn } from ahooks; import { Button, Space } from antd;const ThrottleDemo () > {const { run, cancel, flush } useThrottleFn((message) > {…

PostgreSQL——函数

PostgreSQL函数一、数学函数1.1、绝对值函数ABS(x)和圆周率函数PI()1.2、平方根函数SQRT(x)和求余函数MOD(x,y)1.3、取整函数CEIL(x)、CEILING(x)和FLOOR(x)1.4、四舍五入函数ROUND(x)和ROUND(x,y)1.5、符号函数SIGN(x)1.6、幂运算函数POW(x,y)、POWER(x,y)和EXP(x)1.7、对数运…

ffmpeg下载windows教程

1.百度搜索ffmpeg&#xff0c;进入官网2.点击Download3.点击windows图标&#xff0c;选择蓝色框内的点击4.点击蓝色框内带有win64下载5.下载完好打开bin&#xff0c;看到3个exe文件6.打开cmd文件输入 ffmpeg -version &#xff0c;出现以下画面证明安装成功7.然后添加环…

解锁高并发LLM推理:动态批处理、令牌流和使用vLLM的KV缓存秘密

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…