无法理解 android 开发站点上的视图模型示例

Tar*_*wla 6 android viewmodel

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

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

    private fun loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试以这种方式实现而不是编译:

class MyViewModel : ViewModel() {
    private val users: MutableLiveData<List<String>> by lazy {
        return MutableLiveData().also {
            loadUsers()
        }
    }

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

    private fun loadUsers() {
        users.postValue(listOf("Tarun", "Chawla"))
    }
}
Run Code Online (Sandbox Code Playgroud)

主要是不理解这里的懒惰。android 网站上的示例似乎是错误的,因为 loadUsers() 没有返回任何可以作为用户委托的内容 。你能帮我理解上面的代码吗?

================================================== ======

我是这样实现的:

    private val users : MutableLiveData<List<String>> by lazy {
        MutableLiveData<List<String>>().also {
            loadUsers(it)
        }
    }
    init {
        Log.e("Tarund", "View Model created")
    }

    override fun onCleared() {
        super.onCleared()
        Log.e("Tarund", "View Model deleted")
    }

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

    private fun loadUsers(users : MutableLiveData<List<String>>) {
        users.postValue(listOf("Tarun", "Chawla"))
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果有人可以确认我从上面复制粘贴的第一个示例代码:https : //developer.android.com/topic/libraries/architecture/viewmodel#kotlin是错误的

小智 7

Android 文档中的代码是错误的。

惰性结构本身很好:loadUsers()不需要返回任何东西,因为该函数被定义为:

inline fun <T> T.also(block: (T) -> Unit): T
Run Code Online (Sandbox Code Playgroud)

这意味着在这里:

private val sources: String by lazy {
    String().also {
      loadSources()
    }
}
Run Code Online (Sandbox Code Playgroud)

该块也 {}将返回使用 String() 创建的空字符串,可以使用延迟初始化将其分配给 val用户

尝试编译 Android 文档代码的错误是:

类型推断失败:没有足够的信息来推断构造函数 MutableLiveData() 中的参数 T

这意味着编译器无法推断使用没有类型的构造函数创建的 MutableLiveData 实例的类型。

如果没有 apply 块,编译器将能够编译它,因为它可以很容易地从 val 定义中推断出类型:

private val sources: MutableLiveData<List<User>> by lazy {      
    MutableLiveData()
}
Run Code Online (Sandbox Code Playgroud)

但是添加 apply 块会返回到泛型类型并且编译器无法推断它。因此,正如您所做的那样,解决方案是在MutableLiveData容器中指定保留类型:

private val sources: MutableLiveData<List<User>> by lazy { 
    MutableLiveData<List<User>>().also {
        loadSources()
    }
}
Run Code Online (Sandbox Code Playgroud)