ViewModel 语法的确切含义是什么? (关于 Kotlin 语法,Jetpack Compose)
What is the exact meaning of ViewModel syntax? (about Kotlin syntax, Jetpack Compose)
在做 jetpack compose codelab(state),我认为在 ViewModel 中有些东西没有意义。
我很困惑,有一些问题。这是来自 codelab
的代码
VieModel
class TodoViewModel : ViewModel() {
private var _todoItems = MutableLiveData(listOf<TodoItem>())
val todoItems: LiveData<List<TodoItem>> = _todoItems
// ...
}
第一
这是我的想法。
todoItems
是包含 MutableLiveData 的变量,其中包含 TodoItems 列表。
todoItems
是具有类型 LiveData<List<TodoItem>>
并包含 _todoItems
的值
在这个流程中,为什么 todoItems
有那个类型?
为什么 MutableLiveData(listOf<TodoItem>())
中的第一个类型等同于 LiveData<List<TodoItem>>
?
第二
第二个问题是关于将视图模型与变量一起使用。
这是代码。
@Composable
private fun TodoActivityScreen(todoViewModel: TodoViewModel) {
val items: List<TodoItem> by todoViewModel.todoItems.observeAsState(listOf())
TodoScreen(
items = items,
onAddItem = { todoViewModel.addItem(it) },
onRemoveItem = { todoViewModel.removeItem(it) }
)
}
来自 ViewModel 的 items
只是 List<TodoItem>
.
为什么类型返回 List<TodoItem>
?
对于你的第一个问题,
我们想要更新 TodoItem
的列表,这就是我们需要 MutableLiveData
的原因。但是我们不想将这个可变 属性 暴露给外界,因为任何外部视图模型都不应该能够修改这个列表。所以我们公开了一个不可变的 LiveData
。由于 MutableLiveData
扩展 LiveData
我们可以直接将 _todoItems
分配给 todoItems
.
关于你的第二个问题,
observeAsState
是 LiveData
上的扩展函数,它将它转换为 State
,在您的例子中是 State<List<TodoItem>>
。 by
用于解包 State
并直接访问 List<TodoItem
然后提供给 TodoScreen
。每当 todoViewModel.todoItems
的值发生变化时,items
将被初始化为新值并且 TodoActivityScreen
将被重新组合。
在做 jetpack compose codelab(state),我认为在 ViewModel 中有些东西没有意义。
我很困惑,有一些问题。这是来自 codelab
VieModel
class TodoViewModel : ViewModel() {
private var _todoItems = MutableLiveData(listOf<TodoItem>())
val todoItems: LiveData<List<TodoItem>> = _todoItems
// ...
}
第一
这是我的想法。
todoItems
是包含 MutableLiveData 的变量,其中包含 TodoItems 列表。
todoItems
是具有类型 LiveData<List<TodoItem>>
并包含 _todoItems
的值
在这个流程中,为什么 todoItems
有那个类型?
为什么 MutableLiveData(listOf<TodoItem>())
中的第一个类型等同于 LiveData<List<TodoItem>>
?
第二
第二个问题是关于将视图模型与变量一起使用。
这是代码。
@Composable
private fun TodoActivityScreen(todoViewModel: TodoViewModel) {
val items: List<TodoItem> by todoViewModel.todoItems.observeAsState(listOf())
TodoScreen(
items = items,
onAddItem = { todoViewModel.addItem(it) },
onRemoveItem = { todoViewModel.removeItem(it) }
)
}
来自 ViewModel 的 items
只是 List<TodoItem>
.
为什么类型返回 List<TodoItem>
?
对于你的第一个问题,
我们想要更新 TodoItem
的列表,这就是我们需要 MutableLiveData
的原因。但是我们不想将这个可变 属性 暴露给外界,因为任何外部视图模型都不应该能够修改这个列表。所以我们公开了一个不可变的 LiveData
。由于 MutableLiveData
扩展 LiveData
我们可以直接将 _todoItems
分配给 todoItems
.
关于你的第二个问题,
observeAsState
是 LiveData
上的扩展函数,它将它转换为 State
,在您的例子中是 State<List<TodoItem>>
。 by
用于解包 State
并直接访问 List<TodoItem
然后提供给 TodoScreen
。每当 todoViewModel.todoItems
的值发生变化时,items
将被初始化为新值并且 TodoActivityScreen
将被重新组合。