【问题标题】:What is the exact meaning of ViewModel syntax? (about Kotlin syntax, Jetpack Compose)ViewModel 语法的确切含义是什么? (关于 Kotlin 语法,Jetpack Compose)
【发布时间】:2021-11-16 05:42:03
【问题描述】:

做 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&lt;List&lt;TodoItem&gt;&gt; 并包含_todoItems 的值
在这个流程中,为什么todoItems 有那个类型?
为什么MutableLiveData(listOf&lt;TodoItem&gt;()) 的第一个类型等价于LiveData&lt;List&lt;TodoItem&gt;&gt;

第二
第二个问题是关于使用带有变量的视图模型。
这是代码。

@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&lt;TodoItem&gt;
以及为什么类型返回List&lt;TodoItem&gt;

【问题讨论】:

    标签: kotlin syntax android-jetpack-compose


    【解决方案1】:

    对于您的第一个问题,
    我们想要更新TodoItem 的列表,这就是我们需要MutableLiveData 的原因。但是我们不想将这个可变属性暴露给外界,因为没有一个外部视图模型应该能够修改这个列表。所以我们暴露了一个不可变的LiveData。由于MutableLiveData 扩展了LiveData,我们可以直接将_todoItems 分配给todoItems

    对于您的第二个问题,
    observeAsStateLiveData 上的扩展函数,它将其转换为 State,在您的情况下为 State&lt;List&lt;TodoItem&gt;&gt;by 用于解开State 并直接访问List&lt;TodoItem,然后将其提供给TodoScreen。每当todoViewModel.todoItems 的值发生变化时,items 将被初始化为新值,TodoActivityScreen 将被重新组合。

    【讨论】:

    • 有助于理解。谢谢。我怎样才能知道有关 jetpack compose 的这些详细信息?这只是常规用例吗?
    • 可以通过官方 Compose tutorialdocs。他们真的很好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多