我用來保存用戶登錄資料的 ViewModel 遇到了問題。
用戶登錄后,我使用片段 A 中的用戶資料更新此 ViewModel,但是當我嘗試訪問片段 B 中的資料時,我剛剛設定的資料欄位始終為空。
當片段 B 被初始化時,userLiveData 欄位最初從未被觀察到,但是,當我user從片段 B觸發對物件的更改時,在片段 B 中正確觀察到更改。看來我的 ViewModel 中欄位的先前值永遠不會到達片段B,但新值確實如此。
為了進行完整性檢查,我創建了一個簡單的字串變數(甚至不是 LiveData 物件),我將其設定為片段 A 中的值,然后在導航到片段 BI 后列印該值:它每次都未初始化。就好像我注入片段 B 的 ViewModel 與我注入片段 A 的 ViewModel 完全分開。
我錯過了什么導致片段 B 中的 ViewModel 觀察最初不會用user片段 A 中最后一個已知的集合值觸發?
片段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()
})
}
}
視圖模型
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)
}
}
uj5u.com熱心網友回復:
您應該對兩個片段使用sharedViewModel。
在兩個片段中使用這些代碼行
private val viewModel: LoginViewModel by activityViewModels()
代替
private val viewModel: LoginViewModel by viewModel()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/364616.html
標籤:安卓 android-fragments 虚拟机 android-livedata android-viewmodel
