在Jetpack Compose中使用ViewModel实现startActivity的最佳实践 &



例如,我有这样一个简单的可组合函数

@Composable
fun TextExample(model: SomeViewModel = viewModel()) {
TextButton(onClick = { model.onClick() }) {
Text(text = "Test")
}
}

SomeViewModel:

class SomeViewModel : ViewModel() {
private val _text = mutableStateOf("Test")
val text: String
get() = _text.value
fun onClick() {
if (text.isEmpty()) {
// TODO: need to start some activity
} else {
_text.value = ""
}
}
}

我点击这个按钮,然后模型必须处理这个点击。在某些情况下,我需要开始另一项活动。正确的做法是什么?

可能有更好的方法,但你可以考虑我的方法。

我建议首先为"一次性事件"创建一个数据结构。具有这样的Sealed Class

sealed class Events {
object ToActivityA: Events()
object ToActivityB: Events()
data class ToastMessage(val message: String): Events()
}

在ViewModel中声明一个SharedFlow来发出这些事件

private val _events = MutableSharedFlow<Events>()
val events: SharedFlow<Events> = _events

,在你的例子中,从你的onClick视图函数发出一个事件,像这样

fun onClick() {
if (text.isEmpty()) {
viewModelScope.launch {
_events.emit(Events.ToActivityA) // or ToActivityB, or for a Toast 
}
} else {
_text.value = ""
}
}

现在在你的可组合,只是观察LaunchedEffect像这样

LaunchedEffect(key1 = Unit) {
viewModel.events.collectLatest {
when (it) {
Events.ToActivityA -> {
// to activity A
}
Events.ToActivityB -> {
// to activity B
}
is Events.ToastMessage -> {
// show toast message
}
}
}
}

如果你还没有准备好调用startActivity,我建议你访问这篇文章作为参考。

相关内容

  • 没有找到相关文章

最新更新