如何处理 Jetpack Compose 中的一次性操作?

2024-03-17

Note- 这个问题与this one https://stackoverflow.com/q/68496045/9636037.
我正在寻找更好的方法(如果有的话)。

As per 安卓文档 https://developer.android.com/jetpack/guide/ui-layer/events#consuming-trigger-updates,

一旦显示了瞬时消息,UI 需要通知 ViewModel 的,导致另一个 UI 状态更新:

例如,当我在单击按钮时显示 Toast 消息时,UI 是否应该通知 ViewModel Toast 已成功显示?
这是处理诸如吐司、小吃店等一次性操作的最佳方法吗?

示例代码,

@Composable
fun OneShotOperation(
    viewmodel: OneShotOperationViewModel = viewModel(),
) {
    val context = LocalContext.current

    LaunchedEffect(
        key1 = viewmodel.toastMessage,
    ) {
        if (viewmodel.toastMessage.isNotBlank()) {
            Toast.makeText(
                context,
                viewmodel.toastMessage,
                Toast.LENGTH_SHORT,
            ).show()
            viewmodel.toastMessage = "" // Is this the correct way?
        }
    }

    Button(
        onClick = {
            viewmodel.toastMessage = "Sample Toast"
        },
    ) {
        Text(text = "Show Toast")
    }
}

class OneShotOperationViewModel : ViewModel() {
    var toastMessage by mutableStateOf(
        value = "",
    )
}

如果我删除这一行,
viewmodel.toastMessage = "" // Is this the correct way?
Toast 仅显示一次,随后按下按钮不会显示 Toast,因为可变状态尚未更改。


我更喜欢使用SharedFlow对于这样的工作。

请注意,如果您从另一个视图发送消息collect没有运行,当你最终启动它时,它不会显示 toast。它不存储该值,仅将其传递给当前连接的所有收集器。

class OneShotOperationViewModel : ViewModel() {
    private val _toastMessage = MutableSharedFlow<String>()
    val toastMessage = _toastMessage.asSharedFlow()

    fun sendMessage(message: String) {
        viewModelScope.launch {
            _toastMessage.emit(message)
        }
    }
}

@Composable
fun TestScreen() {
    val context = LocalContext.current

    val viewModel = viewModel<OneShotOperationViewModel>()
    LaunchedEffect(Unit) {
        viewModel
            .toastMessage
            .collect { message ->
                Toast.makeText(
                    context,
                    message,
                    Toast.LENGTH_SHORT,
                ).show()
            }
    }
    Button(
        onClick = {
            viewModel.sendMessage("Sample Toast")
        },
    ) {
        Text(text = "Show Toast")
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Jetpack Compose 中的一次性操作? 的相关文章

  • 使用街景图像

    我想获取街景图片 注明纬度和经度 并显示在对话框中 这可能吗 我在这里看到了一些示例 但没有找到一个向我展示如何在对话框中显示图像的示例 抱歉 如果网站中已经存在这个问题 但我在搜索时没有找到 是的你可以 作为 URL 根 你可以使用这个h
  • Android 的 Firestore 超时

    我目前正在构建一个应用程序 将用户的博客文章保存在Firestore服务器 一切正常 但我发现该帖子在不稳定的互联网连接下无法上传 我尝试设置一个超时到Firestore实例 但 Firestore 库似乎没有超时选项 问题是 由于没有超时
  • 地理编码器返回长度为零的地址

    地理编码器直到今天都工作正常 它开始返回长度为 0 的字符串 注意 这不是 Geocoder 线程的重复 我在启动线程之前使用意图服务和 AsyncTask 来获取它 并且 AsyncTask 方法在 8 个月内工作正常 检查这段代码 ht
  • 如何立即开始执行 Kotlin 协程

    我想立即启动一个协程 我有一段代码 class SampleActivity AppCompatActivity CoroutineScope private var job Job Job override val coroutineCo
  • Material Design 与 Android 5.0 以下版本的兼容性?

    Android 5 0以下版本可以使用Material Design主题吗 根据这个链接 https developer android com design material index html 情况并非如此 材料设计是视觉 动作和设计
  • Android MultiSelectListPreference,java.lang.String 无法转换为 java.util.Set

    我尝试为我的设置视图实现 MultiSelectListPreference
  • MLKit Firebase android - 如何将 FirebaseVisionFace 转换为图像对象(如位图)?

    我已将 MLkit FaceDetection 集成到我的 Android 应用程序中 我已参考以下网址 https firebase google com docs ml kit android detect faces https fi
  • 使用actionBar推送视图的正确方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是一名新的 Android 开发人员 所以我更喜欢询问正确的方法来解决我的问题 我有一个 FragmentActivity 和多个片段
  • 如何让按钮的角变圆?

    我想制作一个角button圆形的 在 Android 中是否有一种简单的方法可以实现这一点 如果你想要这样的东西 这是代码 1 在您的可绘制文件夹中创建一个 xml 文件 如 mybutton xml 并粘贴以下标记
  • Gradle 构建失败 - 无法解压

    我正在使用 android studio 做一个项目 最近它显示了一个错误your SDK is missing or out of date所以 我再次下载了SDK 现在它显示一个错误 Gradle Build failed 错误如下 E
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • NoClassDefFoundError:解析失败:Lio/realm/internal/LinkView

    我正在使用领域 我安装了 Stetho Realm 来查看领域数据 这就是我所做的 buildscript repositories google jcenter dependencies classpath com android too
  • 无法将库添加到我的 Android 项目

    我正在创建一个新应用程序 我想使用一些像这样的库 https github com JakeWharton Android ViewPagerIndicator https github com JakeWharton Android Vi
  • Android 视图可见性消失

    如果我设置了一个视图可见性 它被夸大了 消失了 它会加快我的 UI 速度吗 它将加快 UI 的实际绘制速度 因为 好吧 您不必再绘制它 但它仍然会膨胀 并且膨胀过程不会更快
  • @android的含义

    我想问一下是什么意思 android as in android id android id list 我在不同的 android 示例和教程中看到过它 我也用谷歌搜索过它 我发现的唯一解释是 列表和空 ID 是由 Android 平台为我
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 只需更新一个小部件 RemoteViews 而不是完全创建一个新小部件?

    在 AppWidgetProvider 类的 onUpdate 方法中 我最终执行了大量代码 以便我可以完全重新创建一个新的 RemoteView 对象 现实是 每次更新时 我实际上只需要在 RemoteView 中的 TextView 之
  • 在 IntelliJ IDEA 11 中编译期间未检测到模块依赖性

    我正在开发一个 Android 应用程序 我正在尝试包含图形视图 https github com jjoe64 GraphView绘制一些图表 需要将其作为模块依赖项包含在内 执行此操作后 IntelliJ IDE 会正确检测到包 我可以
  • iOS:如何实现像Android的startActivityForResult这样的行为

    我是一名 Android 开发人员 正在开发我们应用程序的 iOS 版本 我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为 我需要显示一个新的视图控制器 然后在新的视图控制器关闭时将控制权

随机推荐