首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >两个或多个屏幕轮转后,lifecycleScope.launchWhenCreated按预期停止工作

两个或多个屏幕轮转后,lifecycleScope.launchWhenCreated按预期停止工作
EN

Stack Overflow用户
提问于 2021-12-21 22:55:45
回答 1查看 503关注 0票数 1

我有这样的密码:

代码语言:javascript
运行
复制
    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内部的实际流发生了什么?onCreateonCreateView方法会发生什么?或者,launchWhenStartedlaunchWhenCreated在两次轮换后的表现是否不同?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-12-21 23:42:23

我发现问题出在哪里了。显然,导航组件扰乱了片段生命周期的顺序,如here所示。

因此,当屏幕旋转时,由于后台顺序,导航创建了另一个片段,该片段还在当前片段之前与ViewModel的ViewModel进行交互。因此,另一个片段onCreate方法向流发送了其他内容,因此扰乱了我当前的片段集合。

解决方案要么使流集合独立于片段生命周期,要么在其中一个故障片段中更改该集合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70442436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档