如题,谷歌为什么这么设计呢?
我个人比较喜欢用 view ,特别是 Activity 比较大,业务比较多时,喜欢拆分成各个部分变成自定义 view ,再自定义自己的 ViewModel 。
可官方的 ViewModel 不源生支持自定义 view ,用 Fragment 的话又太重。
1
kwanzaa 2022-07-29 20:08:59 +08:00 1
你想把 VM 写 View 里去?我觉得你该重学 MVVM 了。。。
|
2
KratosOmega OP @kwanzaa 我是说为什么 view 不能像 activity 那样使用 viewmodel
|
3
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. |
4
fromzero 2022-07-30 00:32:51 +08:00
因为 View 本身就没有完整的生命周期的概念,View 只有 attachWindow dettachWindow 这些,View 完全跟随 Fragment/Activity 的生命周期,View 属于 ui 组件,而不是 ui 容器,容器是用来装控件的,所以有生命周期的概念。而 ViewModel 的生成和销毁是需要伴随宿主的生命周期的。
|
5
fromzero 2022-07-30 00:36:05 +08:00
非要给自定义 View 加上 ViewModel 也不是不行,可以用自定义 View 创建一个自定义的容器,然后给他加上完整的生命周期,实现 ViewModelStoreOwner 接口的方法。
|
6
fromzero 2022-07-30 00:39:39 +08:00
但是最大的问题是,View 本身的生命周期就是依附于 Fragment/Activity 的,所以你不得不手动把生命周期往下传递给你的自定义 View 管理,挺麻烦的。
|
7
KratosOmega OP @fromzero 是的,从实现的角度来看是可以实现的,但是为什么官方不去实现
是鼓励大家用 fragment 吗,但是这玩意又比 view 重很多 至少我认为在 view 中使用 livedata 很有价值 |
8
winterbells 2022-07-30 08:54:45 +08:00 via Android
jetpack comoose 里可以用 viewmodel ,虽然也是绑到 activity ,但看起来和用起来是绑到了 view
|
9
KratosOmega OP @winterbells 为了用 livedata 让整个 app 迁移到 compose 代价太大了,而且目前个人不太喜欢 compose
|
10
janus77 2022-07-30 14:02:40 +08:00
view 自己硬要说的话没有生命周期,他的生命周期是随着 Activity/Fragment 变化的
|
11
KratosOmega OP @janus77 是啊,要改的话,只能让 view 去感知 activity 的生命周期
本身就 onAttach onDetach |
12
GLee9507 2022-08-04 10:56:57 +08:00
Fragment 就是轻量级的 View 容器,OP 说的重指的是什么重呢?
|