Jetpack Compose 在应用程序加载之间保留数据

问题描述 投票:0回答:1

我正在构建一个 Android 手表应用程序。免责声明,我是一名 Java 工程师,在 Android 方面拥有一些早期经验,比如说 10 年前,所以我对 Kotlin 或 Jetpack Compose 不太熟悉。

我编写了一个 Android Wear 应用程序来作为裁判跟踪比赛中的得分,当应用程序被关闭时,我遇到了保留数据的问题。就目前情况而言,我已经实现了一个 ViewModel,并且它已正确连接到 UI 中,以在应用程序打开时跟踪分数/状态。 然而,由于滑动关闭手势会杀死应用程序,因此如果在游戏中意外发生这种情况,可能会造成灾难性的后果,因为统计的分数会丢失。我无法让 android 阻止滑动手势。

我尝试过无数在线教程,但找不到任何有效的方法。本质上,在我的脑海中,我对此的解释是: 我想连接到 onDestroy 回调以将数据保存到设备, 在 onResume 中,我想从设备读取数据并将其放入 viewModel 中,以便应用程序可以记住它的状态。如果有人在穿戴设备上使用过秒表应用程序,则无论是否关闭,该状态都会持续存在。 我如何在我的应用程序中执行此操作? 代码库(虽然很小)位于 https://github.com/mcgowanb/refscorekeeper

android android-jetpack-compose wear-os
1个回答
0
投票

这个想法是,一旦输入任何新数据,就始终将其保留在DataStore或像Room这样的数据库中。对于秒表来说,节省计时器启动的时间就足够了。然后,如果应用程序因任何原因关闭(用户将其刷开、崩溃或被 Android 系统杀死,...),则无需保存数据,所有相关数据is 已保存。这样您就可以在下次启动应用程序时恢复所有内容。

DataStore 为此特别容易使用,因为您可以使用它来存储键/值对并将其用作此数据的单一事实来源 - 当您的应用程序运行时,您不会只是从 DataStore 中读取数据意外关闭,即使应用程序正在运行并且用户输入一段数据,该数据也会首先保存到 DataStore,然后检索并显示在 UI 中。这听起来像是很大的开销,但 DataStore 会缓存它保存的所有数据,因此您可以立即检索它,而无需访问文件系统。此外,DataStore 的内容作为 Flow 进行检索。这样,如果有任何变化,您会自动获取更新。如果您为 UI 使用 Compose,UI 也会自动更新,无需涉及任何回调。

设置 DataStore 后,只需在提供的流程上调用

stateIn()
并将结果
StateFlow
保存在 ViewModel 的属性中:

val currentScore = dataStore.currentScore().stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5_000),
    initialValue = /* default value until the flow is started. */,
)
然后,Compose 可以从流中读取数据作为 State 对象,该对象可用于自动更新您的 UI:

val currentScore by viewModel.currentScore.collectAsStateWithLifecycle()
(需要在gradle中依赖

androidx.lifecycle:lifecycle-runtime-compose

现在,当输入新值时,只需将其保存在 DataStore 中,UI 就会相应地自动更新。如果您的应用程序关闭并重新启动,则会自动从 DataStore 读取最新分数并显示在 UI 中。

© www.soinside.com 2019 - 2024. All rights reserved.