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.

关于你的第二个问题,
observeAsStateLiveData 上的扩展函数,它将它转换为 State,在您的例子中是 State<List<TodoItem>>by 用于解包 State 并直接访问 List<TodoItem 然后提供给 TodoScreen。每当 todoViewModel.todoItems 的值发生变化时,items 将被初始化为新值并且 TodoActivityScreen 将被重新组合。