如题,谷歌为什么这么设计呢?
我个人比较喜欢用 view ,特别是 Activity 比较大,业务比较多时,喜欢拆分成各个部分变成自定义 view ,再自定义自己的 ViewModel 。
可官方的 ViewModel 不源生支持自定义 view ,用 Fragment 的话又太重。
1 kwanzaa 2022-07-29 20:08:59 +08:00 ![]() 你想把 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 300 2022-07-30 08:54:45 +08:00 via Android jetpack comoose 里可以用 viewmodel ,虽然也是绑到 activity ,但看起来和用起来是绑到了 view |
9 KratosOmega OP @winterbells 为了用 livedata 让整个 app 迁移到 compose 代价太大了,而且目前个人不太喜欢 compose |
![]() | 10 rb6221 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 说的重指的是什么重呢? |