从第二个片段访问ViewModel数据时丢失状态



我的ViewModel(用于保存用户登录数据(遇到问题。

用户登录后,我使用片段A中的用户数据更新此ViewModel,但当我尝试访问片段B中的数据时,我刚刚设置的数据字段始终为空。

当片段B被初始化时,userLiveData字段最初从未被观察到,然而,当我从片段B触发对user对象的更改时,在片段B中正确地观察到了更改。我的ViewModel中字段的以前值似乎从未到达片段B,但新值到达了。

为了进行健全性检查,我制作了一个简单的字符串变量(甚至不是LiveData对象(,将其设置为片段a中的值,然后,在导航到片段B后,我打印出该值:每次都未初始化。就好像我注入片段B的ViewModel与我注入片段A的ViewModel是完全分离的。

我缺少了什么,导致片段B中的ViewModel观察最初没有用片段A中设置的user的最后一个已知值触发?

片段A

class FragmentA : Fragment() {
private val viewModel: LoginViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.user.observe(this, {
it?.let {
//Called successfully every time
navigateToFragmentB()
}
})

val mockUserData = User()
viewModel.loginSuccess(mockUserData)
}
}

片段B

class FragmentB : Fragment() {
private val viewModel: LoginViewModel by viewModel()

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...

viewModel.user.observe(viewLifecycleOwner, { user ->
user?.let {
binding.initialsBubble.text = user.getInitials()
} ?: navigateAway()
})
}
}

ViewModel

class LoginViewModel(
private val loginRepo: LoginRepo
) : ViewModel() {
private val _user = MutableLiveData<User?>()
val user: LiveData<User?> = _user

fun loginSuccess(result: AuthenticationResult) {
val user = loginRepo.login(result)
_user.postValue(user)
}
}

您应该对两个片段都使用sharedViewModel。

在两个片段中使用这些代码行

private val viewModel: LoginViewModel by activityViewModels()

而不是

private val viewModel: LoginViewModel by viewModel()

相关内容

  • 没有找到相关文章

最新更新