在 Android Compose 函数中,将可为 null 的 LiveData 变量转换为 Compose 状态的最佳方法是什么?

In Android Compose function, what's the best way to convert a nullable LiveData variable to Compose state?

对于视图模型中的普通 LiveData 变量,例如

val data = MutableLiveData<City>()

我们可以使用

观察它
data.observeAsState()

我的问题是,假设我有一个可选的 LiveData 变量,例如

var data: MutableLiveData<City>? = null

在可组合函数中处理它的正确方法是什么?

当时,我能看到的最好方法是解包可组合函数之外的所有内容

group?.let {
  it.observe(this) { groupData ->
      Content(groupData)
  }
}?: run {
  Content(null)       
}


@Compasable
fun Content(group: Group?) {
  ...
}

是否有更面向 Compose 的方式来做到这一点?

您可以从 Composable 函数观察它,就像使用 NonNull LiveData 一样,只需使用一些 kotlin null-safe 运算符:

val group: Group? = data?.observeAsState()?.value

我猜你的大部分困惑来自于使用 by 属性 委托,它对 Nullable LiveData 并没有真正起作用(弊大于利)。首先,你将不得不做类似下面的例子,这不是很好,然后你将无法使用 Kotlin 的智能转换,因为 "group 是一个 属性 已经打开或自定义 getter"。但是,使用 .value 相当于 by 委派,在某些情况下更好。

// this is nice
val group: Group by data.observeAsState()
// you can also do this, but don't
val group: Group? by (data?.observeAsState() ?: mutableStateOf(null))