Android fragments 我能';在重新创建activty之后,无法从livedata访问更新的值

Android fragments 我能';在重新创建activty之后,无法从livedata访问更新的值,android-fragments,kotlin,viewmodel,koin,Android Fragments,Kotlin,Viewmodel,Koin,我正在我的应用程序中的活动和片段之间共享数据。我正在使用koin的sharedviewmodel功能。大体上当我登录时,我正在mainactivty中设置令牌值,并在片段中成功访问它。重新创建活动后,我正在设置令牌,但无法访问片段中更新的令牌值。我越来越老了 我试图删除ondestroy方法中的观察者,但毫无帮助。我不知道问题出在哪里 Viewmodel类 class SharedViewModel : ViewModel() { var token = MutableLiveData

我正在我的应用程序中的活动和片段之间共享数据。我正在使用koin的sharedviewmodel功能。大体上当我登录时,我正在mainactivty中设置令牌值,并在片段中成功访问它。重新创建活动后,我正在设置令牌,但无法访问片段中更新的令牌值。我越来越老了

我试图删除ondestroy方法中的观察者,但毫无帮助。我不知道问题出在哪里

Viewmodel类

class SharedViewModel : ViewModel() {

    var token = MutableLiveData<String>()

    fun setToken(t: String) {
        token.value = t
    }

}

信息太少,无法确定,但这是一种可能性:

如果您正在访问片段中的旧值,这意味着您可能正在引用片段中viewModel的旧实例。ViewModels不会永远存在,它们将随“活动”一起销毁,除非“活动”因配置更改而销毁,然后立即重新创建。根据:

ViewModel始终与作用域(片段或活动)关联创建,并且只要作用域处于活动状态,ViewModel就会被保留。例如,如果它是一项活动,则直到它完成为止

换句话说,这意味着如果所有者因配置更改(例如旋转)而被销毁,则ViewModel不会被销毁

为什么片段保留对旧ViewModel的引用?这意味着该片段不会被销毁并与活动一起重新创建,例如,因为您保留了对该片段的引用,或者因为该片段在另一个活动中使用


sharedViewModel()的
在片段对象的生命周期中,在第一次访问sharedViewModel属性时,只会传递ViewModel一次。

我已经解决了这个问题。不知何故,koin的实现中存在问题,但我无法解决

我更改了viewmodel实现,如下所示:

活动:

private lateinit var sharedViewModel: SharedViewModel
...
...
sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
片段:

private lateinit var sharedViewModel: SharedViewModel
...
...
activity?.let {
        sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
} 
它是有效的。
如果有人发现koin imp的问题,请告诉我,谢谢。

我刚刚检查了自己的应用程序,我在活动中使用了ViewModel及其子片段。我使用sharedViewModel()的
到处创建它。在本例中,您可以使用活动中的
by viewModel()
创建它。也许您可以通过sharedViewModel()更改为
,看看它是否有效?

这是有道理的,但我的所有片段都只附加到主活动。我认为它们应该在活动结束时销毁。@Berkay Kirecci你确定你没有在其他地方保留对片段的引用吗?我确定。我想这是关于koin实现的,我刚刚添加了一条注释。你能添加你的koin模块定义吗?我也有同样的问题,我总是通过使用“by sharedViewModel()”获取viewModels来解决。
val networkModule = module {
    ...
}

val viewModelModule = module {
    ...
    viewModel { SharedViewModel() }
}

val fragmentModule = module {
    ...
}
private lateinit var sharedViewModel: SharedViewModel
...
...
sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
private lateinit var sharedViewModel: SharedViewModel
...
...
activity?.let {
        sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
}