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

@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 = ""
        }
    }
}

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

推荐答案

也许有更好的方法来解决这一问题,但你可以考虑我的方法.

我建议首先为"一次事件"创建一个数据 struct ,数据 struct 如下

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,我建议您访问这个post作为参考.

Android相关问答推荐

如何自定义所选的NavigationBar项目?

如何阻止Gradle在编译时生成app-metadata.properties

如何在DownloadManager Android中显示ProgressBar和Complete Listener

AndroidX Media3 迁移指南

Jetpack Compose X.dp 性能问题?

Android Compose - 为什么 Canvas 中的drawText在底部被切断而不是在顶部?

在 kotlin 上向适配器添加绑定视图功能

为什么我的 APK 中包含来自旧版 Android 支持库的类?

Spinner - onItemLongClick 从未执行

在 Material 3 TopAppBar 代码的哪个位置定义了填充?

设置背景图片组成Column

Android Studio:按下前缀键:切换 Logcat 格式

为什么集成React Native时compileSdkVersion错误?

compose 导航参数字符串包含花括号?

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

调用时 listFiles() nullpointerexception

在 Kotlin 客户端应用程序中发送 FCM 推送通知 - Firebase 云消息传递

使用 Jetpack Compose 的深层链接导航到可组合项

(Android) 如何在一对多关系中将子 ID 与父级匹配

在delphi中将Jnet_uri转换为Tbitmap