Наблюдатель во Фрагменте работает, но не в Деятельности - PullRequest
1 голос
/ 24 января 2020

Я создал Обозреватель во Фрагменте, который отлично работает (он запускает тост, когда увеличивается 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 это не делает! ):

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

Репо ( вызывается с ВМ ):

        fun getLoginAttemptCount(): MutableLiveData<Int>{
            Log.d(TAG, "getLoginAttemptCount()")
            return loginAttempt
    }

loginAttempt.value увеличивается при каждой попытке входа в систему, и я подтвердил это работает в Logcat ..

Для информации, makeToast - это просто функция для создания оправданного тоста (текст и позиция):

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, но я в растерянности!

1 Ответ

2 голосов
/ 27 января 2020

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

В Fragment вы используете строку выше для создания loginviewmodel, передавая контекст фрагмента в viewmodel, поэтому первая android делает то, что он проверяет, если он содержит любую другую модель представления, связанную с этим фрагментом, если он содержит, он не создаст новую модель представления, он вернет старую, если она не содержит, создаст новую. Создана модель представления используя пару ключ-значение. Таким образом, в вашем случае вы создаете всего две видовые модели каждого из фрагмента и действия, вы изменяете действующие данные фрагмента, но вы пытаетесь наблюдать их в действии, используя видоизменение активности. Если вы хотите добиться того, что вам нужно создать общую модель представления среди действия и фрагмента. Как создать общую модель представления

...