【发布时间】:2022-09-25 10:22:36
【问题描述】:
我无法理解为什么我观察到的值作为状态被正确传递到 Composable lambda 中,但不会触发可组合的重构。
这是我的设置。
屏幕
@Composable
fun Screen(
showBottomSheet: (@Composable () -> Unit) -> Unit,
viewModel: MyViewModel = hiltViewModel()
) {
val someValue = viewModel.someValue.observeAsState().value
MyController(
onShowBottomSheetClick = {
showBottomSheet {
Log.d(\"DEBUG\", \"value updated: $someValue\")
BottomSheetLayout(
someValue = someValue,
onUpdateClick = { newValue -> viewModel.setValue(newValue) }
)
}
}
)
}
我的控制器
@Composable
fun MyController(
onShowBottomSheetClick: () -> Unit
) {
Text(
text = \"show BottomSheet\",
modifier = Modifier.clickable { onShowBottomSheetClick() }
)
}
底页布局
@Composable
fun BottomSheetLayout(
someValue: Int,
onUpdateClick: (Int) -> Unit
) {
Text(
text = \"Some value: $someValue\",
modifier = Modifier.clickable { onUpdateClick(someValue + 1) }
)
}
我的视图模型
@HiltViewModel
class MyViewModel @Inject constructor(): ViewModel() {
private val _someValue: Int? = MutableLiveData(null)
val someValue: LiveData<Int?> = _someValue
fun setValue(newValue: Int) {
_someValue.value = newValue
}
}
当我运行它并查看输出时,日志不会显示更新的someValue。
value updated: 0
value updated: 0
value updated: 0
但是,如果我向 lambda 本身添加一个新的状态值,它就可以正常工作。
// Screen
// ..
showBottomSheet {
val currentValue = viewModel.someValue.observeAsState().value // <-- Note the difference
Log.d(\"DEBUG\", \"value updated: $currentValue\")
BottomSheetLayout(
someValue = currentValue,
onUpdateClick = { newValue -> viewModel.setValue(newValue) }
)
}
// ..
当我运行它并查看输出时,日志会显示正确更新的值。
value updated: 0
value updated: 1
value updated: 2
为什么会这样?有什么方法可以将第一个状态值传递给 showBottomSheet 可组合 lambda?
先感谢您。
-
尝试使用
collectAsState而不是observeAsState。这有什么改变吗? -
@m.reiter 抱歉,我的意思是 LiveData,而不是 StateFlow,因为我需要初始值为
nullD:我编辑了我的问题。
标签: android android-jetpack-compose kotlin-stateflow