Pokedex-AR DataBinding深度实践教程:用Bindables把Flow数据优雅绑定到View

发布时间:2026/8/27 15:08:05

Pokedex-AR DataBinding深度实践教程:用Bindables把Flow数据优雅绑定到View
Pokedex-AR DataBinding深度实践教程用Bindables把Flow数据优雅绑定到View【免费下载链接】Pokedex-AR Pokedex-AR demonstrates ARCore, Sceneform, and modern Android tech stacks — such as Hilt, Coroutines, Flow, Jetpack (Room, ViewModel, LiveData) based on MVVM architecture.项目地址: https://gitcode.com/gh_mirrors/po/Pokedex-ARPokedex-AR 是一个基于 ARCore SceneForm 的宝可梦增强现实演示项目其界面数据绑定完全依赖DataBinding Flow Bindables这套组合拳ViewModel 用协程 Flow 从 Room 数据库和网络获取数据再借助 Bindables 库一行代码把 Flow 变成可绑定的属性布局文件里用{表达式}直接驱动 View 更新全程无需手动 observe。本文带你完整拆解这条数据链路。为什么 Flow 和 DataBinding 是绝配传统 MVVM 里把数据送到 View 通常要走一条长链Flow → 转 LiveData → observe 收集 → 手动更新 Adapter / 控件每写一个页面都要重复这些模板代码。而 DataBinding 的思路是在 XML 里声明我要什么数据框架负责数据变了就自动刷新。缺的只是让 DataBinding 能感知 Flow 变化这一环——这正是 Bindables 库解决的。Pokedex-AR 的完整数据流向如下Room 数据库 / 网络请求 ↓ (Flow) Repository 层MainRepository / DetailRepository ↓ (Flow) ViewModelasBindingProperty 转成 Bindable 属性 ↓ (DataBinding 表达式 {...}) 布局 XMLactivity_main.xml / activity_detail.xml / item_pokemon.xml快速上手两步引入 Bindables 依赖第一步在 Gradle 中开启 DataBinding第二步加入 Bindables 依赖本项目使用的版本定义在 dependencies.gradle 中为 1.0.9// 开启 DataBinding android { buildFeatures { dataBinding true } } // Bindables 依赖版本见 dependencies.gradle implementation com.skydoves:bindables:1.0.9引入后你获得四个核心成员BindingViewModel、bindingProperty()、asBindingProperty()、BindingActivity后面会逐个用到。核心一行代码把 Flow 转成 Bindable 属性打开主列表的 MainViewModelapp/src/main/java/com/skydoves/pokedexar/ui/main/MainViewModel.kt核心就这几行HiltViewModel class MainViewModel Inject constructor(mainRepository: MainRepository) : BindingViewModel() { get:Bindable var errorMessage: String? by bindingProperty(null) private set private val pokemonListFlow mainRepository.getPokemonList( onStart { isLoading false }, onError { errorMessage it } ) get:Bindable val pokemonList: ListPokemon? by pokemonListFlow.asBindingProperty(viewModelScope, null) }这里有三个关键设计BindingViewModel基类继承它之后DataBinding 才能监听属性变化并触发 UI 刷新get:Bindable注解告诉编译器给这个属性的 getter 生成监听钩子漏掉它是最常见的绑定失效原因asBindingProperty(viewModelScope, null)在viewModelScope中收集 Flow生命周期安全、自动取消参数null是 Flow 发出第一个值之前的初始值。普通可变状态如errorMessage、isLoading则直接用bindingProperty(初始值)委托赋值即触发 UI 刷新。布局绑定用 {表达式} 声明式驱动 View看主列表布局 activity_main.xml数据声明只有两个变量data variable namevm typecom.skydoves.pokedexar.ui.main.MainViewModel / variable nameadapter typecom.skydoves.pokedexar.ui.adapter.PokemonAdapter / /data之后所有控件直接订阅数据androidx.recyclerview.widget.RecyclerView app:adapter{adapter} app:adapterPokemonList{vm.pokemonList} app:toast{vm.errorMessage} / TextView app:gone{!vm.pokemonList.empty} /vm.pokemonList变化时RecyclerView 自动拿到新数据加载完成、出错的瞬间空态提示和 Toast 也随之出现——Activity 里没有一行observe代码。详情页 activity_detail.xml 更进一步把宝可梦六维属性直接绑到进度条组件上app:progressView_progress{vm.pokemonInfo.hp}、app:bindPokemonTypes{vm.pokemonInfo.types}等数据一到属性条即刻填充。进阶用自定义 BindingAdapter 打通第三方组件DataBinding 原生不认识自定义 View 的属性BindingAdapter就是翻译官。项目的 ViewBinding.ktapp/src/main/java/com/skydoves/pokedexar/binding/ViewBinding.kt集中定义了一批适配器例如BindingAdapter(gone) fun bindGone(view: View, shouldBeGone: Boolean) { view.visibility if (shouldBeGone) View.GONE else View.VISIBLE }由此得到布局里app:gone{...}这种简洁写法。同文件里还有几个很实用的示范适配器作用toast文本非空时弹 Toast错误提示零样板paletteImage/paletteCard用 Glide 加载图片同时提取主色调染卡片背景progressView_progress/progressView_max给 ProgressView 组件绑定数值bindPokemonTypes为每种属性动态生成丝带标签RecyclerView 的适配也单独抽到 RecyclerViewBinding.ktapp:adapter{adapter}一行完成 Adapter 装配。RecyclerView 与 DataBinding 协作Adapter 绑定的两个要点列表项 item_pokemon.xml 声明了pokemon变量卡片标题用android:text{string/pokemon_name(pokemon.name, pokemon.hits)}直接格式化输出图片则走上面提到的paletteImage适配器。对应地PokemonAdapterapp/src/main/java/com/skydoves/pokedexar/ui/adapter/PokemonAdapter.kt只有两个要点// 创建 ViewHolder 时用 DataBinding 方式 inflate val binding DataBindingUtil.inflateItemPokemonBinding( inflater, R.layout.item_pokemon, parent, false) // 绑定时赋值变量并立即执行 override fun onBindViewHolder(holder: PokemonViewHolder, position: Int) { holder.binding.apply { pokemon items[position] executePendingBindings() } }忘记executePendingBindings()是列表数据不刷新的第一大坑——DataBinding 默认延迟执行绑定这一句强制立即生效。收尾用 BindingActivity 自动注入布局变量MainActivity 继承BindingActivityActivityMainBinding连取 binding 实例这一步都省了class MainActivity : BindingActivityActivityMainBinding(R.layout.activity_main) { val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding { lifecycleOwner thisMainActivity adapter PokemonAdapter() vm viewModel } } }binding { }块里给 XML 中声明的vm、adapter变量赋值DataBinding 自动执行并注册生命周期观察。整个 Activity 干净到只剩下业务点击事件。常见坑位与落地三步清单新手最常踩的三个坑属性加了委托却漏了get:Bindable表达式绑定成一次性赋值数据变了界面不动Adapter 中漏调executePendingBindings()列表首帧空白忘记给布局设置lifecycleOwner后台时仍收集数据、浪费资源。三步把这套模式搬进你自己的项目第一步开启dataBinding引入 Bindables 依赖第二步ViewModel 继承BindingViewModelFlow 一律asBindingProperty(viewModelScope, 初始值)转换第三步布局声明variable控件用{表达式}绑定第三方组件补一个BindingAdapter。想动手跑起来克隆仓库即可git clone https://gitcode.com/gh_mirrors/po/Pokedex-AR关键源码文件速查自定义绑定适配器app/src/main/java/com/skydoves/pokedexar/binding/ViewBinding.kt、app/src/main/java/com/skydoves/pokedexar/binding/RecyclerViewBinding.ktFlow 转 Bindable 的 ViewModelapp/src/main/java/com/skydoves/pokedexar/ui/main/MainViewModel.kt、app/src/main/java/com/skydoves/pokedexar/ui/details/DetailViewModel.kt声明式布局app/src/main/res/layout/activity_main.xml、app/src/main/res/layout/activity_detail.xml、app/src/main/res/layout/item_pokemon.xmlFlow 数据源app/src/main/java/com/skydoves/pokedexar/repository/MainRepository.kt、app/src/main/java/com/skydoves/pokedexar/repository/DetailRepository.kt掌握这条 Flow → asBindingProperty → {表达式} 的链路后你会发现 MVVM 项目里的胶水代码少了一大截——这或许才是 DataBinding 真正的价值所在。【免费下载链接】Pokedex-AR Pokedex-AR demonstrates ARCore, Sceneform, and modern Android tech stacks — such as Hilt, Coroutines, Flow, Jetpack (Room, ViewModel, LiveData) based on MVVM architecture.项目地址: https://gitcode.com/gh_mirrors/po/Pokedex-AR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CopyQ

CopyQ

2026/8/27 15:08:05

Clipboard manager with advanced features 功能强大的剪贴板管理器 CopyQ is an advanced clipboard manager with powerful editing and scripting features. CopyQ 是一款功能强大的剪贴板管理器,具备强大的编辑和脚本功能。 有时候真是能感觉到人家快把一个功…

http-proxy-ipv6-pool 部署完整指南:如何在 Vultr 服务器路由整段 /64 IPv6 子网

http-proxy-ipv6-pool 部署完整指南:如何在 Vultr 服务器路由整段 /64 IPv6 子网

2026/8/27 15:08:05

http-proxy-ipv6-pool 部署完整指南:如何在 Vultr 服务器路由整段 /64 IPv6 子网 【免费下载链接】http-proxy-ipv6-pool Make every request from a separate IPv6 address. 项目地址: https://gitcode.com/gh_mirrors/ht/http-proxy-ipv6-pool http-proxy-…

Phlex fetchers 模块拆解:如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务

Phlex fetchers 模块拆解:如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务

2026/8/27 15:08:05

Phlex fetchers 模块拆解:如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务 【免费下载链接】Phlex A super-sexy voice interface for the Plex HTPC 项目地址: https://gitcode.com/gh_mirrors/phl/Phlex Phlex 是一个面向 Plex 家庭影院(HT…

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来

2026/8/27 16:08:08

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来 【免费下载链接】iina The modern video player for macOS. 项目地址: https://gitcode.com/gh_mirrors/iin/iina IINA 是一款基于 mpv 引擎的免费开源 macOS 视频播放器,M…

MATLAB相关性分析实战:Pearson、Spearman、Kendall系数详解与数模应用

MATLAB相关性分析实战:Pearson、Spearman、Kendall系数详解与数模应用

2026/8/27 16:08:08

1. 项目概述:相关性分析在数模中的核心地位在数学建模竞赛和数据分析的实战中,我们常常会面对一个最基础也最核心的问题:这两个变量之间有关系吗?如果有,关系有多强?是正相关还是负相关?这个问题…

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南

2026/8/27 16:08:08

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 装好之后,一台家庭版Windows也能开多用户远程桌面,2到15个人同时连进同…

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文

2026/8/27 16:08:08

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity Auto Translator 是一款面向 Unity 引擎游戏的实时自动汉…

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成

2026/8/27 16:08:08

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON 结论先行:VBA-JSON 解决什么问题 VBA-JSON 是一…

如果关注瑞德克斯规则边界做得细吗?

如果关注瑞德克斯规则边界做得细吗?

2026/8/27 15:58:07

谈到瑞德克斯使用规范边界做得细吗,比起空泛判断,更值得看的是完成身份确认里的实际细节。页面组织是否顺手、提示是否靠前、提示是否能接得上,这些位置处理得稳,瑞德克斯在规则边界上的整体质感就会更完整。 用户关心资金安排时&…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…