Kotlin Android: делегат свойства должен иметь метод getValue (DashViewModel, KProperty *>). - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь следовать официальному руководству Android для ViewModels в Kotlin. Я буквально скопировал вставленный самый простой официальный пример , но синтаксис кажется незаконным.

Этот раздел вызывает проблему:

private val users: MutableLiveData<List<User>> by lazy {
    MutableLiveData().also {
        loadUsers()
    }
}

Предварительный просмотр дает мне эту ошибку:

Property delegate must have a 'getValue(DashViewModel, KProperty*>)' method. None of the following functions is suitable.

И если я хочу запустить приложение, я получаю эту ошибку:

Type inference failed: Not enough information to infer parameter T in constructor MutableLiveData<T : Any!>()
Please specify it explicitly.

Я не понимаю эти две ошибки, и другие вопросы с той же ошибкой, похоже, были вызваны что-то другое. Я предполагаю, что MutableLiveData().also вызывает проблему, но я не знаю почему. Это довольно странно, учитывая, что это официальный пример.

1 Ответ

4 голосов
/ 12 июля 2020

Ваша первая проблема заключается в том, что вы не объявили класс User.

Вторая проблема - еще одна ошибка документации , и вам необходимо указать тип в MutableLiveData вызов конструктора.

Итак, это работает:

package com.commonsware.myapplication

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class User

class MainViewModel : ViewModel() {
  private val users: MutableLiveData<List<User>> by lazy {
    MutableLiveData<List<User>>().also {
      loadUsers()
    }
  }

  fun getUsers(): LiveData<List<User>> {
    return users
  }

  private fun loadUsers() {
    // Do an asynchronous operation to fetch users.
  }
}

Это довольно странно, учитывая, что это официальный пример.

Вы очень optimisti c, когда дело доходит до этих примеров. В общем, считайте их иллюстрацией техники, а не тем, что вы бы скопировали и вставили в проект.

...