【发布时间】:2020-05-10 21:22:23
【问题描述】:
我在 Fragment 中创建了一个完美运行的观察者(当 Int 增加时它会触发祝酒词),但是当我尝试将此代码移动到 Activity 中时,观察者似乎没有连接,并且它不会更新LiveData 发生变化。
片段(这行得通!):
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
loginViewModel.getLoginAttemptCount().observe(this, Observer { count ->
if (count > 0) makeToast("Authentication failed")
})
}
Activity(当我将观察者放入 Activity 时它没有!):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.login_activity)
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
loginViewModel.getLoginAttemptCount().observe(this, Observer { count ->
if (count > 0) makeToast("Authentication failed")
})
}
ViewModel(在 VM 中都调用相同的函数):
fun getLoginAttemptCount(): MutableLiveData<Int> {
Log.d(TAG, "getLoginAttemptCount()")
return firestoreRepository.getLoginAttemptCount() }
Repo(从 VM 调用):
fun getLoginAttemptCount(): MutableLiveData<Int>{
Log.d(TAG, "getLoginAttemptCount()")
return loginAttempt
}
每次登录尝试时,loginAttempt.value 都会增加,我已经验证了这在 Logcat 中有效..
关于信息,makeToast 只是一个创建合理 Toast(文本和位置)的函数:
private fun makeToast(message: String) {
val centeredText: Spannable = SpannableString(message)
centeredText.setSpan(
AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
0, message.length - 1,
Spannable.SPAN_INCLUSIVE_INCLUSIVE
)
val toast = Toast.makeText(this, centeredText, Toast.LENGTH_LONG)
toast.setGravity(Gravity.CENTER,0,0)
toast.show()
Log.d(TAG, "Toast message: $message")
}
我假设它与 lifeCycleOwner 有关,但我不知所措!
【问题讨论】:
-
您是否尝试过手动将一些数据发布到您的活动内的
AttemptCount以查看它是否被触发? -
我正在记录流程的每个部分,并且存储库中的 LiveData 正在更改 - 创建 Activity 时观察者只是没有连接到 LiveData(正如我所说,它可以正常工作片段中的代码)..
标签: android android-livedata observers lifecycleowner