android - 无法理解 android 开发网站上的 viewmodel 示例

标签 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.
    }
}

我试图以这种方式实现并且它不编译:
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"))
    }
}

主要是不理解 作者:懒惰 这里。 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"))
    }
}

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

最佳答案

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

懒惰的结构本身很好: loadUsers() 不需要返回任何东西,因为函数 还有定义为:

inline fun <T> T.also(block: (T) -> Unit): T

这意味着在这里:
private val sources: String by lazy {
    String().also {
      loadSources()
    }
}

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

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

Type inference failed: Not enough information to infer parameter T in constructor MutableLiveData()



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

如果没有 apply block ,编译器将能够编译它,因为它可以轻松地从 val 定义中推断出类型:
private val sources: MutableLiveData<List<User>> by lazy {      
    MutableLiveData()
}

但是添加应用 block 会回到泛型类型,编译器无法推断它。因此,正如您所做的那样,解决方案是在 中指定类型保持。可变实时数据 容器:
private val sources: MutableLiveData<List<User>> by lazy { 
    MutableLiveData<List<User>>().also {
        loadSources()
    }
}

关于android - 无法理解 android 开发网站上的 viewmodel 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61639474/

相关文章:

android - 解析 XML 时出错 : not well-formed (invalid token)

android - 无法解析 : com. android.support :support-v4:23. 0.0

SwiftUI ViewModel 不更新计算变量

design-patterns - 两种模型 View 设计以及模型之间的通信

javascript - 在没有new关键字的情况下制作javascript基因 knockout View 模型

java - LayoutInflater 不更新 TextView

java - 无法在 Android 中导入 com.google.cloud.speech.v1.SpeechGrpc

java - Android FacebookSDK 4.6.0 共享位图问题

Android - 我可以以编程方式进行数据绑定(bind)吗? - 没有布局 XML

android - 如何更改 ViewModel 中 xml 对象的可见性?