Почему LiveData.getValue возвращает ноль, если не было вызвано наблюдение? - PullRequest
1 голос
/ 02 мая 2020

У меня есть ViewModel со свойством типа LiveData<UserData>, считываемое из базы данных Room.

Его код выглядит следующим образом:

class UserDataViewModel(application: Application) : AndroidViewModel(application) {

    private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
    val userData: LiveData<UserData?> = userDataDao.getUserData()

}

В связанном активность, я получаю ссылку на модель представления:

private val viewModel: UserDataViewModel by viewModels()

В этом упражнении мне нужно получить значение UserData при нажатии кнопки:

private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}

Сейчас теоретически, если пользователь не нажимает кнопку до загрузки данных, он никогда не должен быть нулевым.

Однако, поскольку код остается в силе, вызов viewModel.userData.value всегда равен нулю, а блок let никогда не выполняется.

Но, , если я добавлю этот оператор в onCreate, блок let в обработчике щелчков выполняется как требуется :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel.userData.observe(this, Observer {
        // do nothing
    })
}

My вопрос в том, зачем мне вызывать функцию наблюдения, даже если я ничего не делаю с событием изменения, чтобы получить действительные ответы от LiveData::getValue?

Ответы [ 2 ]

3 голосов
/ 02 мая 2020

У меня такой вопрос: зачем мне вызывать функцию наблюдения, даже если я ничего не делаю с событием изменения, чтобы получить действительные ответы от LiveData :: getValue?

Поскольку ComputableLiveData, возвращаемый из комнаты, DAO выполняет запрос только в том случае, если в LiveData имеется хотя бы один активный наблюдатель (внутри LiveData.onActive()). Затем он выполняется асинхронно в другом потоке, и в какой-то момент в будущем он будет опубликован в LiveData.

0 голосов
/ 02 мая 2020

Вам не нужно вызывать observe() для того, чтобы получить LiveData для присвоения значения, отличного от нуля. LiveData всегда содержит и возвращает ноль изначально, пока что-то не установит его значение. Если вам не нужно это начальное нулевое значение, вам следует вместо этого сразу установить другое значение, прежде чем LiveData станет доступным для любых других компонентов. Если вы хотите узнать, когда оно впервые содержит ненулевое значение, вам нужно будет использовать наблюдателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...