如何在Kotlin Jetpack挂起函数中整合Snackbar按钮响应
解决方案
1. 修改挂起函数,内部整合统一处理逻辑
将原本返回SnackbarResult的函数改为直接在内部处理ActionPerformed事件,无需外部再判断结果:
suspend fun snackBar( snackbarHostState: SnackbarHostState, context: Context, buttonText: Int = settings, snackbarText: Int = permission_access ) { val result = snackbarHostState.showSnackbar( context.resources.getString(snackbarText), context.resources.getString(buttonText), duration = SnackbarDuration.Short ) // 统一处理按钮点击逻辑 if (result == SnackbarResult.ActionPerformed) { // 安全转换Context为ComponentActivity,避免类型转换异常 (context as? ComponentActivity)?.let { activity -> activity.appSettings().apply { activity.startActivity(this) } } } }
2. 简化调用代码
修改后的函数无需外部再用when语句判断结果,直接调用即可:
val contextSnackBar = LocalContext.current snackBarScope.launch { snackBar(context = contextSnackBar, snackbarHostState = snackbarHostState) }
可选:保留自定义逻辑的灵活性
如果需要在统一逻辑之外支持额外的自定义操作,可以添加可选的lambda参数:
suspend fun snackBar( snackbarHostState: SnackbarHostState, context: Context, buttonText: Int = settings, snackbarText: Int = permission_access, customAction: (() -> Unit)? = null ) { val result = snackbarHostState.showSnackbar( context.resources.getString(snackbarText), context.resources.getString(buttonText), duration = SnackbarDuration.Short ) if (result == SnackbarResult.ActionPerformed) { // 执行统一逻辑 (context as? ComponentActivity)?.let { activity -> activity.appSettings().apply { activity.startActivity(this) } } // 执行传入的自定义逻辑(可选) customAction?.invoke() } }
调用时可按需传入自定义操作:
snackBarScope.launch { snackBar( context = LocalContext.current, snackbarHostState = snackbarHostState, customAction = { /* 这里添加额外的自定义操作 */ } ) }
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

