我有这样的密码:
private val appViewModel: AppViewModel by activityViewModels()
private lateinit var user: User
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// This sets the variable user to the value collected from a StateFlow from appViewmodel
lifecycleScope.launchWhenCreated {
appViewModel.user.collect { flowUser -> user = flowUser }
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// This method utilizes the lateinit user variable
lifecycleScope.launchWhenStarted {
doThingWithUser()
}
return binding?.root
}
由于StateFlow的值即使在被收集之后仍然存在,所以在屏幕旋转第一个lifecycleScope.launchWhenCreated
之后,再次从流中收集flowUser,将它分配给延迟的user
变量,doThingWithUser
稍后被调用,一切都正常。
但是经过两次或更多的轮转之后,这种情况就不再发生了,因为某些原因,kotlin.UninitializedPropertyAccessException.没有初始化user
,调用了doThingWithUser
,并且应用程序崩溃了
我做错了什么?StateFlow的值会在两个集合/屏幕轮转之后消失吗?ViewModel内部的实际流发生了什么?onCreate
和onCreateView
方法会发生什么?或者,launchWhenStarted
和launchWhenCreated
在两次轮换后的表现是否不同?
谢谢。
发布于 2021-12-21 23:42:23
我发现问题出在哪里了。显然,导航组件扰乱了片段生命周期的顺序,如here所示。
因此,当屏幕旋转时,由于后台顺序,导航创建了另一个片段,该片段还在当前片段之前与ViewModel的ViewModel进行交互。因此,另一个片段onCreate
方法向流发送了其他内容,因此扰乱了我当前的片段集合。
解决方案要么使流集合独立于片段生命周期,要么在其中一个故障片段中更改该集合。
https://stackoverflow.com/questions/70442436
复制相似问题