1

我在 Fragment 中创建了一个完美工作的观察者(当 Int 增加时它会触发祝酒词),但是当我尝试将此代码移动到活动中时,观察者似乎没有连接,并且当 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")
    })
}

活动(当我将观察者放在活动中时它没有!):

    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()  }

回购(从 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 有关,但我不知所措!

4

1 回答 1

3

loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)

在 Fragment 中,您使用上面的行来创建将片段的上下文传递给 viewmodel 的 loginviewmodel,因此,android 做的第一件事就是检查它是否包含与该片段关联的任何其他 viewmodel,如果它包含它将不会创建新的 Viewmodel如果它不包含它,将返回旧的创建一个新的。Viewmodel 是使用键值对创建的。因此,在您的情况下,您正在为片段和活动创建总共两个视图模型,您正在更改片段的实时数据,但您正在尝试使用活动视图模型在活动中观察它。如果你想实现你需要在活动和片段之间创建共享视图模型。如何创建共享视图模型

于 2020-01-27T19:52:48.453 回答