首页/新闻资讯/正文详情

把 XML 换成 Jetpack Compose 要动几刀?用 Sunflower 项目拆一遍

发布时间:2026/11/2 19:46:46 来源:云帆数科 栏目:资讯中心
把 XML 换成 Jetpack Compose 要动几刀?用 Sunflower 项目拆一遍
把 XML 换成 Jetpack Compose 要动几刀用 Sunflower 项目拆一遍【免费下载链接】sunflowerA gardening app illustrating Android development best practices with migrating a View-based app to Jetpack Compose.项目地址: https://gitcode.com/gh_mirrors/su/sunflowerSunflower 是一个园艺管理示例应用仓库里完整保留了一个 View XML 布局应用迁到 Jetpack Compose 的路径。这篇文章用仓库里的真实代码拆一遍先动哪个页面、ViewModel 的衔接位置、安全网怎么留以及把你自己应用迁到 Jetpack Compose 时的真实代价。维护老 XML 布局最头疼的三件事维护老应用时打开 res/layout/ 通常会撞见三件事。一是 UI 和逻辑分居两个文件列表项在 XML 里四行Fragment 里 findViewById、setData 又是十几行改一个字段要动两处。二是状态自己扛旋转屏幕时页面位置、筛选条件都要手动保存漏一个就是转屏回到首页的 bug。三是测试绑死资源 IDEspresso 的断言挂在 id/plant_name 上布局一改测试跟着崩。这三件事不是 XML 的错是命令式拼视图模型的税。Jetpack Compose 的方向是把拼装换成描述也就是 Android 声明式 UI 的核心数据进、界面出重组负责刷新。 Sunflower把迁移过程完整存档的样本Sunflower 原本是 Google 用来演示 Jetpack 各组件的园艺应用后来接了第二个任务记录把一个现成 View 应用迁到 Jetpack Compose 的全过程。可以克隆下来对照着看git clone https://gitcode.com/gh_mirrors/su/sunflower它值得读有两点。第一是策略文档仓库里的 docs/MigrationJourney.md 写明了三步走——先定自底向上策略、五个页面逐个重写、最后用 Navigation Compose 替换 Fragment 导航并删光 Fragment一步不缺。第二是终态应用入口 GardenActivity 的正文只剩 enableEdgeToEdge() 和 setContent { SunflowerTheme { SunflowerApp() } }res/layout/ 下只剩一个 XML 文件。首页分页、植物列表、植物详情、花园、图库五个页面全部住在 app/src/main/java/com/google/samples/apps/sunflower/compose/ 的子目录里。这是一个活体样本每个页面的 Composable 源码都在不只是前后对比截图。先动哪里从详情页开刀导航最后碰Sunflower 的迁移顺序很工程化五个页面逐个来先动最简单的植物详情页再是植物列表、图库、花园最后才动最复杂的、带 ViewPager2 分页的首页。而导航被刻意留到最后。导航为什么最后动因为每个页面重写期间仍由旧导航托管应用随时可装可用等页面全部重写完最后一步才把 Fragment 导航换成 Navigation Compose一次性删掉所有 Fragment。代价是两套导航体系并存一阵子收益是每次合并都很小、可回滚。页面内部列表项的写法是彻底换了一套。旧的是一份 XML 加 findViewById新的是一个 Composable 函数数据直接传进来!-- 旧写法id 定义在 XMLFragment 里 findViewById -- ImageView android:idid/plant_image / TextView android:idid/plant_name / // 新写法数据进UI 出 Composable fun PlantListItem(plant: Plant, onClick: () - Unit) { ImageListItem(plant.name, plant.imageUrl, onClick) }等最后一个页面完成整个导航被压缩成 Screen.kt 里的一个 sealed class 加 SunflowerApp.kt 里的一段 NavHostNavHost(navController, startDestination home) { composable(home) { HomeScreen(onPlantClick ...) } composable(plantDetail/{plantId}) { PlantDetailsScreen(...) } composable(gallery/{plantName}) { GalleryScreen(...) } }首页同理原来 ViewPager2 Fragment 的分页在 HomeScreen 里换成 HorizontalPager TabRow纯 Kotlin 完成。状态衔接ViewModel 原样不动只换消费者很多人担心迁 Compose 等于全量重写Sunflower 的答案是只换最后一公里。PlantListViewModel 的核心没变growZone 用一个 MutableStateFlow 承载flatMapLatest 出 LiveDataList growZone 的值同步写进 SavedStateHandle。这段逻辑迁移中一行没动变的只是消费端——旧 Fragment 用 observe 订阅新页面用 hiltViewModel() 拿到后收集。再往下的 Room、仓库层、Hilt 注入图、WorkManager 的数据库种子任务全部原样保留。这个决策的回报在细节里选一个生长区再旋转屏幕筛选状态还在干重活的是 SavedStateHandle 而不是 UI 框架。如果你要动手先检查你的状态住在 ViewModel 里还是 Fragment/View 里。状态在 UI 层的话迁移会变成重写——先把状态上提再谈换页面。⚖️ 取舍与坑Sunflower 做了、没做什么去掉教科书滤镜迁移里有几处值得抄有几处要警惕。做了先织安全网。app/src/androidTest/ 下每个 Compose 页面都有配套 instrumentation 测试例如 PlantListTest 用 createComposeRule 拉起页面再断言 Apple 可见。旧的资源 ID 断言换成了 onNodeWithText 的语义断言布局怎么改测试不再崩。做了数据层不动。自底向上每一步小、可回滚这是它敢一页一页推进的前提。留了尾巴试验性库。版本目录 gradle/libs.versions.toml 里列着 paging-compose 的 RC、glide compose 的 beta示例应用可以容忍生产项目要自己锁版本并盯变更。这套方式的真实代价是并存期的维护成本——Fragment 导航和 Navigation Compose 并行一阵子你得同时记住两套导航。如果你习惯大爆炸式重写先评估这笔账。下一步删掉最后一个 XML 的账Sunflower 已经走到UI 层只剩 Compose这类样本的下一站通常是状态全面 Compose 化、用 StateFlow 替代 LiveData。PlantListViewModel 已经做到一半——growZone 本身就是 StateFlow只是出口套了 asLiveData。想看迁移后的性能底数仓库里还有 macrobenchmark/ 目录启动和帧率基准都已经就位。留一个问题给你你维护的应用res/layout/ 现在还有几个页面按 Sunflower 的顺序套一遍——最简单的页面先动、导航最后碰、测试当安全网——你项目里最后一个 XML 被删掉需要几个月【免费下载链接】sunflowerA gardening app illustrating Android development best practices with migrating a View-based app to Jetpack Compose.项目地址: https://gitcode.com/gh_mirrors/su/sunflower创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

NSG与VNet Peering深度指南:DevOps Insiders Batch 18控制跨虚拟网络访问的完整方法
NSG与VNet Peering深度指南:DevOps Insiders Batch 18控制跨虚拟网络访问的完整方法

【免费下载链接】azure-aws-gcp-devsecops-mlops-batch-18 Welcome to the official repository for Batch18! 📚👩‍💻 Here, youll find a organized collection of class notes, assignments, and code snippets generated during our ses… · 2026/11/2 19:46:49

BrowserSkill bsk update 升级指南:daemon 重启的 3 条路径、Windows 分阶段替换与升级后 30 秒验证
BrowserSkill bsk update 升级指南:daemon 重启的 3 条路径、Windows 分阶段替换与升级后 30 秒验证

BrowserSkill bsk update 升级指南:daemon 重启的 3 条路径、Windows 分阶段替换与升级后 30 秒验证 【免费下载链接】BrowserSkill Let AI agents use your real, logged-in browser without interrupting your work. CLI extension for browser automation acros… · 2026/11/2 19:44:36

Jasna 马赛克修复选型手册:6 个检测模型与 3 个阈值,新手 3 分钟快速定稿
Jasna 马赛克修复选型手册:6 个检测模型与 3 个阈值,新手 3 分钟快速定稿

Jasna 马赛克修复选型手册:6 个检测模型与 3 个阈值,新手 3 分钟快速定稿 【免费下载链接】jasna Video restoration tool 项目地址: https://gitcode.com/GitHub_Trending/ja/jasna Jasna 是一款开源的视频马赛克修复工具:检测模型先… · 2026/11/2 21:52:00

StepFun/Step-3.7-Flash-NVFP4震撼发布:1980亿参数稀疏MoE模型如何重塑多模态AI格局?
StepFun/Step-3.7-Flash-NVFP4震撼发布:1980亿参数稀疏MoE模型如何重塑多模态AI格局?

StepFun/Step-3.7-Flash-NVFP4震撼发布:1980亿参数稀疏MoE模型如何重塑多模态AI格局? 🎉 在人工智能快速发展的今天,阶跃星辰(StepFun)正式发布了革命性的Step 3.7 Flash-NVFP4模型!这个拥有19… · 2026/11/3 1:35:15

vLLM vs SGLang:Step-3.7-Flash-NVFP4推理引擎性能对比与选型指南
vLLM vs SGLang:Step-3.7-Flash-NVFP4推理引擎性能对比与选型指南

vLLM vs SGLang:Step-3.7-Flash-NVFP4推理引擎性能对比与选型指南 Step-3.7-Flash-NVFP4作为阶跃星辰StepFun推出的高效AI模型,支持多种主流推理引擎,其中vLLM和SGLang凭借出色的性能表现成为开发者的热门选择。本文将深入对比这两款推理引擎… · 2026/11/3 1:35:15

Step-3.7-Flash-NVFP4视觉编码技术详解:从图像输入到结构化代码生成
Step-3.7-Flash-NVFP4视觉编码技术详解:从图像输入到结构化代码生成

Step-3.7-Flash-NVFP4视觉编码技术详解:从图像输入到结构化代码生成 阶跃星辰StepFun的Step-3.7-Flash-NVFP4是一款强大的视觉编码模型,它能够将图像输入转化为结构化代码,为开发者提供了一种全新的编程方式。本文将详细介绍该模型的视觉编码… · 2026/11/3 1:35:15

MoE路由机制原理解析:Step-3.7-Flash-NVFP4如何实现11B参数动态激活?
MoE路由机制原理解析:Step-3.7-Flash-NVFP4如何实现11B参数动态激活?

MoE路由机制原理解析:Step-3.7-Flash-NVFP4如何实现11B参数动态激活? Step-3.7-Flash-NVFP4作为阶跃星辰推出的高效多模态大语言模型,其核心创新在于采用了先进的MoE(Mixture of Experts)路由机制,实现了1… · 2026/11/3 1:35:15

Step-3.7-Flash-NVFP4 benchmark全解析:SimpleVQA 79.2分背后的视觉推理能力
Step-3.7-Flash-NVFP4 benchmark全解析:SimpleVQA 79.2分背后的视觉推理能力

Step-3.7-Flash-NVFP4 benchmark全解析:SimpleVQA 79.2分背后的视觉推理能力 🎯 Step 3.7 Flash 是阶跃星辰最新推出的1980亿参数稀疏混合专家视觉语言模型,在SimpleVQA视觉问答基准测试中获得了令人瞩目的79.2分!这个成绩不仅刷… · 2026/11/3 1:35:15

深入理解TabFM 1.0.0 PyTorch参数配置:256维嵌入到24层Transformer的技术细节
深入理解TabFM 1.0.0 PyTorch参数配置:256维嵌入到24层Transformer的技术细节

深入理解TabFM 1.0.0 PyTorch参数配置:256维嵌入到24层Transformer的技术细节 TabFM 1.0.0是Google Research推出的零样本表格基础模型,专为结构化数据设计。这个创新的PyTorch实现通过独特的256维嵌入架构和24层Transformer堆叠,实现了无需微… · 2026/11/3 1:34:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码