gpt4 book ai didi

带有单个事件的 Android Compose

转载 作者:行者123 更新时间:2023-12-04 23:40:07 30 4
gpt4 key购买 nike

现在我在 ViewModel 中有一个 Event 类,它以这种方式公开为 Flow:

abstract class BaseViewModel() : ViewModel() {

...

private val eventChannel = Channel<Event>(Channel.BUFFERED)
val eventsFlow = eventChannel.receiveAsFlow()

fun sendEvent(event: Event) {
viewModelScope.launch {
eventChannel.send(event)
}
}

sealed class Event {
data class NavigateTo(val destination: Int): Event()
data class ShowSnackbarResource(val resource: Int): Event()
data class ShowSnackbarString(val message: String): Event()
}
}
这是可组合的管理它:
@Composable
fun SearchScreen(
viewModel: SearchViewModel
) {
val events = viewModel.eventsFlow.collectAsState(initial = null)
val snackbarHostState = remember { SnackbarHostState() }
val coroutineScope = rememberCoroutineScope()
Box(
modifier = Modifier
.fillMaxHeight()
.fillMaxWidth()
) {
Column(
modifier = Modifier
.padding(all = 24.dp)
) {
SearchHeader(viewModel = viewModel)
SearchContent(
viewModel = viewModel,
modifier = Modifier.padding(top = 24.dp)
)
when(events.value) {
is NavigateTo -> TODO()
is ShowSnackbarResource -> {
val resources = LocalContext.current.resources
val message = (events.value as ShowSnackbarResource).resource
coroutineScope.launch {
snackbarHostState.showSnackbar(
message = resources.getString(message)
)
}
}
is ShowSnackbarString -> {
coroutineScope.launch {
snackbarHostState.showSnackbar(
message = (events.value as ShowSnackbarString).message
)
}
}
}
}
SnackbarHost(
hostState = snackbarHostState,
modifier = Modifier.align(Alignment.BottomCenter)
)
}
}
我使用来自 here 的 Flow 遵循单个事件的模式.
我的问题是,事件仅在第一次被正确处理(SnackBar 显示正确)。但在那之后,似乎不再收集事件。至少在我离开屏幕回来之前。在这种情况下,所有事件都会连续触发。
看不到我做错了什么。调试时,事件会正确发送到 Channel,但似乎状态值未在可组合项中更新。

最佳答案

而不是将您的逻辑放在可组合的内部

// Runs only on initial composition 
LaunchedEffect(key1 = Unit) {
viewModel.eventsFlow.collectLatest { value ->
when(value) {
// Handle events
}
}
}
而且,与其将其用作状态,不如从 LaunchedEffect 中的流中收集值(value)。堵塞。这就是我在应用程序中实现单个事件的方式

关于带有单个事件的 Android Compose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69351948/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com