如何将私有 mutableStateOf 分配给 Android Jetpack 中的 State 变量?

How can I assign a private mutableStateOf to a State variable in Android Jetpack?

希望在SoundViewModel里面设置_isRecordingclass,希望把isRecording暴露给UI。

但是代码A是错误的,我该如何解决?

代码A

    class SoundViewModel @Inject constructor(): ViewModel() {
    
        private var _isRecording by mutableStateOf(false)
        val isRecording: State<Boolean> by _isRecording  //It's wrong
        //val isRecording: State<Boolean> = _isRecording  //It's wrong
        ..
    }

添加内容:

致 nglauber:谢谢!

我认为代码 B 会很好用。

你的代码和代码 B 哪个更好?

代码B

class SoundViewModel @Inject constructor(): ViewModel() {

   var isRecording by mutableStateOf(false)
              private set

}


@Composable
fun YourComposable(soundViewModel: SoundViewModel) {
   //I can use soundViewModel.isRecording directly
}

当您使用关键字 by 时,它基本上是 getValue/setValue 的别名。因此:

// _isRecording is a Boolean
private var _isRecording by mutableStateOf(false)
// _isRecording is a State<Boolean>
private var _isRecording = mutableStateOf(false)

这就是您收到此错误的原因。

你应该这样曝光:

class SoundViewModel @Inject constructor(): ViewModel() {

    private var _isRecording = mutableStateOf(false)
    val isRecording: State<Boolean> = _isRecording
}

然后这样消费:

@Composable
fun YourComposable(soundViewModel: SoundViewModel) {
    val isRecording by soundViewModel.isRecording

清楚 -- 代码 B 是最佳选择。这正是 Compose Docs 官方推荐的。 LiveData 对象采用带下划线的方法,但是当你转移到 Compose-compatible MutableState<T> 时,它只是 de-efficiencizing(?) 你的代码,如果你添加额外的下划线步骤。

查看 State-in-Compose 以获得完整的见解。

采用最简单的方法来完成工作,始终遵循经验法则。