发现一个 ViewModel 的问题,不知道是 bug 还是 feature?

2020-03-20 18:02:55 +08:00
 insomnia1232
在 Fragment 里用 ViewModel, 构造参数传 Fragment 不传 activity, 然后无论 Fragment 和 Activity 谁 destroy 了 ViewModel 都不会走 onCleared()
5535 次点击
所在节点    Android
9 条回复
domosekai
2020-03-20 18:07:34 +08:00
viewmodel 的存在不就是为了 activity destroy 的时候他可以活着吗?
boileryao
2020-03-20 18:36:29 +08:00
看源码就好了(逃
androidx.activity.ComponentActivity 和 androidx.fragment.app.Fragment 都实现了 LifecycleOwner 和 VIewModelStoreOwner,但是只有 Activity 注册了 ondestroy 在非 configration change 情况下调用 ViewModelStore 的 clear 方法来 clear ViewModel。

======

综上,
自己加回调,可以参考 ComponentActivity 的构造函数:fragment.getLifecycle().addObserver(...)
或者构造 ViewModel 的时候传 Activity
insomnia1232
2020-03-20 22:26:25 +08:00
@domosekai 你真用过吗? viewmodel 在 activity 因为配置更改重建的时候会活着 正常 destroy 会 clear
insomnia1232
2020-03-20 22:28:25 +08:00
@boileryao 我觉得很可能是 bug, github 上有人提这个,然后说是 28 修复了,然后下面有人回复说 2020 年了问题还在…
insomnia1232
2020-03-20 22:34:21 +08:00
@boileryao 而且源码里这部分其实机制有点复杂,FragmentActivity 里会有一个叫 FragmentManagerViewModel 的东西, 通过 Fragment 注册的 viewmodel 会储存在这玩意里面,然后 Activity destroy 的时候这玩意会 clear 掉,但是里面储存的 viewmodel 并没有调用 onClear
john6lq
2020-03-21 01:03:51 +08:00
我都还没了解 viewmodel, fragment 套 fragment 就已经让我崩溃了,生命周期是真难管理。
crayygy
2020-03-21 07:49:17 +08:00
构造参数传 Fragment 是什么意思?有没有可能是有 leak 呢
我们项目中用的 Koin 来注入 ViewModel 的,我看到的 log 都是会在结束的时候调用到 onClear,虽然有别的问题但跟你这个应该不同。
hyyou2010
2020-03-21 10:17:54 +08:00
destroy 跟 finish 是一回事吗?是不是后者才收回 viewmodel ?
ysy950803
2020-03-22 14:42:16 +08:00
应该是 Bug,这个行为明显和绑定 Activity 的 ViewModel 不一致吧。Activity 销毁时,都是会走 onClear 的。

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

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

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

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

© 2021 V2EX