有关 Android 生命周期的 ViewModel 和 LiveData,为什么谷歌设计只支持 Activity 和 Fragment

2022-07-29 19:58:22 +08:00
 KratosOmega

如题,谷歌为什么这么设计呢?

我个人比较喜欢用 view ,特别是 Activity 比较大,业务比较多时,喜欢拆分成各个部分变成自定义 view ,再自定义自己的 ViewModel 。

可官方的 ViewModel 不源生支持自定义 view ,用 Fragment 的话又太重。

1666 次点击
所在节点    程序员
12 条回复
kwanzaa
2022-07-29 20:08:59 +08:00
你想把 VM 写 View 里去?我觉得你该重学 MVVM 了。。。
KratosOmega
2022-07-29 20:48:41 +08:00
@kwanzaa 我是说为什么 view 不能像 activity 那样使用 viewmodel
kwanzaa
2022-07-29 23:43:58 +08:00
@KratosOmega 因为 View 在生成和绘制只占有生命周期中的一小部分。你想用它 Host 数据的话。。。
The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way.
The ViewModel class allows data to survive configuration changes such as screen rotations.
fromzero
2022-07-30 00:32:51 +08:00
因为 View 本身就没有完整的生命周期的概念,View 只有 attachWindow dettachWindow 这些,View 完全跟随 Fragment/Activity 的生命周期,View 属于 ui 组件,而不是 ui 容器,容器是用来装控件的,所以有生命周期的概念。而 ViewModel 的生成和销毁是需要伴随宿主的生命周期的。
fromzero
2022-07-30 00:36:05 +08:00
非要给自定义 View 加上 ViewModel 也不是不行,可以用自定义 View 创建一个自定义的容器,然后给他加上完整的生命周期,实现 ViewModelStoreOwner 接口的方法。
fromzero
2022-07-30 00:39:39 +08:00
但是最大的问题是,View 本身的生命周期就是依附于 Fragment/Activity 的,所以你不得不手动把生命周期往下传递给你的自定义 View 管理,挺麻烦的。
KratosOmega
2022-07-30 07:56:35 +08:00
@fromzero 是的,从实现的角度来看是可以实现的,但是为什么官方不去实现
是鼓励大家用 fragment 吗,但是这玩意又比 view 重很多
至少我认为在 view 中使用 livedata 很有价值
winterbells
2022-07-30 08:54:45 +08:00
jetpack comoose 里可以用 viewmodel ,虽然也是绑到 activity ,但看起来和用起来是绑到了 view
KratosOmega
2022-07-30 10:10:46 +08:00
@winterbells 为了用 livedata 让整个 app 迁移到 compose 代价太大了,而且目前个人不太喜欢 compose
janus77
2022-07-30 14:02:40 +08:00
view 自己硬要说的话没有生命周期,他的生命周期是随着 Activity/Fragment 变化的
KratosOmega
2022-07-30 18:19:39 +08:00
@janus77 是啊,要改的话,只能让 view 去感知 activity 的生命周期
本身就 onAttach onDetach
GLee9507
2022-08-04 10:56:57 +08:00
Fragment 就是轻量级的 View 容器,OP 说的重指的是什么重呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869539

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX