Fragment中的观察者有效,但在Activity中无效

问题描述 投票:1回答:1

我在一个片段中创建了一个观察器,该观察器工作正常(当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")
    })
}

活动(当我将观察者放入活动中时,它没有!]]]

    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有关,但我很茫然!

我在一个片段中创建了一个观察者,该观察者工作正常(当Int增加时,它会举杯祝酒,但是当我尝试将这段代码移到Activity中时,观察者似乎并没有连接,而是起作用了……) >

android android-livedata observers lifecycleowner
1个回答
2
投票

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

在片段中您正在使用上面的代码创建将片段上下文传递给viewmodel的loginviewmodel因此,Android要做的第一件事是检查,如果它包含与此片段关联的任何其他视图模型,如果包含它将不创建新的视图模型,它将返回旧的视图模型如果不包含它,则创建一个新的ViewView使用键值对创建。所以你的情况您正在创建每个片段和活动的总共两个视图模型,您正在更改片段的实时数据,但是您尝试使用活动视图模型在活动中观察它。如果要实现,则需要在活动和片段之间创建共享的视图模型。How to create shared viewmodel

© www.soinside.com 2019 - 2024. All rights reserved.