无法理解 android 开发站点上的视图模型示例
Not able to understand viewmodel example on android dev site
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"))
}
}
主要是我不理解这里的 by lazy。 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() 不需要 return 任何东西,因为函数 also定义为:
inline fun <T> T.also(block: (T) -> Unit): T
这意味着在这里:
private val sources: String by lazy {
String().also {
loadSources()
}
}
块 也{} 将 return 使用 String() 创建的空字符串,可以使用惰性初始化分配给 val 用户
尝试编译 Android 文档代码的错误是:
Type inference failed: Not enough information to infer parameter T in constructor MutableLiveData()
这意味着编译器无法推断使用没有类型的构造函数创建的 MutableLiveData 实例的类型。
没有 apply 块,编译器将能够编译它,因为它可以很容易地从 val 定义中推断出类型:
private val sources: MutableLiveData<List<User>> by lazy {
MutableLiveData()
}
但是添加 apply 块会返回泛型类型,编译器无法推断它。因此,正如您所做的那样,解决方案是在 MutableLiveData 容器中指定 hold 类型:
private val sources: MutableLiveData<List<User>> by lazy {
MutableLiveData<List<User>>().also {
loadSources()
}
}
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"))
}
}
主要是我不理解这里的 by lazy。 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() 不需要 return 任何东西,因为函数 also定义为:
inline fun <T> T.also(block: (T) -> Unit): T
这意味着在这里:
private val sources: String by lazy {
String().also {
loadSources()
}
}
块 也{} 将 return 使用 String() 创建的空字符串,可以使用惰性初始化分配给 val 用户
尝试编译 Android 文档代码的错误是:
Type inference failed: Not enough information to infer parameter T in constructor MutableLiveData()
这意味着编译器无法推断使用没有类型的构造函数创建的 MutableLiveData 实例的类型。
没有 apply 块,编译器将能够编译它,因为它可以很容易地从 val 定义中推断出类型:
private val sources: MutableLiveData<List<User>> by lazy {
MutableLiveData()
}
但是添加 apply 块会返回泛型类型,编译器无法推断它。因此,正如您所做的那样,解决方案是在 MutableLiveData 容器中指定 hold 类型:
private val sources: MutableLiveData<List<User>> by lazy {
MutableLiveData<List<User>>().also {
loadSources()
}
}