如何将私有 mutableStateOf 分配给 Android Jetpack 中的 State 变量?
How can I assign a private mutableStateOf to a State variable in Android Jetpack?
希望在SoundViewModel
里面设置_isRecording
class,希望把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 以获得完整的见解。
采用最简单的方法来完成工作,始终遵循经验法则。
希望在SoundViewModel
里面设置_isRecording
class,希望把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 以获得完整的见解。
采用最简单的方法来完成工作,始终遵循经验法则。