我是Kotlin和Android开发的新手,我对一些事情感到困惑.来自NodeJS,我了解了一点关于J.C.的概念.但我不知道它在Kotlin中是如何运作的.

所以我有这个数据类:

@Entity(tableName = "counters")
data class Counter(
    @PrimaryKey(autoGenerate = true) var id: Int = 0,
    var name: String,
)

我做了这把刀

@Dao
interface CounterDao {
    @Query("SELECT * FROM counters")
    suspend fun getAllCounters(): List<Counter>

    @Insert
    suspend fun insertCounter(counter: Counter): Int

    @Update
    suspend fun updateCounter(counter: Counter)

    @Delete
    suspend fun deleteCounter(counter: Counter)
}

我也做了这项服务

class CounterService(context: Context) {
    private val database = DatabaseProvider.provideDatabase(context)
    private val counterDao = database.counterDao

    suspend fun getAllCounters(): List<Counter> {
        return counterDao.getAllCounters()
    }
}

我已经成功地添加、删除、更新内容,并使用这个变量在我的viewModel类中观察了这些内容的状态.

private var counters: SnapshotStateList<Counter> = mutableStateListOf()

现在我想集成到RoomDatabase和当前视图模型.那么,我如何运行getAllCounters()并在加载时将流传输到counters变量?或者是否有其他方法从本地存储传输数据?

推荐答案

您应该将CounterDaoCounterService中的getAllCounters声明更改为:

fun getAllCounters(): Flow<List<Counter>>

这样,您可以检索flow个计数器列表.如果列表中有任何变化,这一点非常重要:每当数据库中有任何变化时,您都会得到一个更新的列表.这就是流动的目的.

在Compose中处理流非常简单:在视图模型中,引入一个新变量,定义如下(service作为CounterService的实例):

val counters: StateFlow<List<Counter>> = service.getAllCounters()
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5_000),
        initialValue = emptyList(),
    )

StateFlow是一种特殊类型的流,它只包含基础流的newest值.

在你的组合中,你现在可以像这样声明你的counters变量(viewModel作为你的视图模型的实例):

val counters: List<Counter> by viewModel.counters.collectAsStateWithLifecycle()

你需要在gradle中使用依赖性androidx.lifecycle:lifecycle-runtime-compose. 这样做的是从视图模型的状态流中检索当前值,并将其保存在composite状态对象中.然后它的值被委托(通过by关键字)给counters变量.该变量现在始终包含存储在数据库中的当前计数器列表.如果该列表在数据库中被更改,该变量将自动更新.现在,您可以使用counters在"编写"中显示列表.

Android相关问答推荐

Android Kotlin DSL Gradle找不到自定义存储库中的依赖项

如何使禁用状态下的material 3按钮与启用状态下的 colored颜色 相同?

合成 colored颜色 的GSON反序列化

如何go 除回调流中不可用的状态?

如何从LazyColumn中的图标异步获取可绘制的加载?

在Jetpack Compose中将导航绘图显示在顶部栏下方、底部栏上方

如何在Jetpack Compose中实现前后动画?

kotlin中&&和and的区别

为什么第二个代码可以安全地在 map 中进行网络调用,因为它已被缓存?

我的自定义小吃店不适合我的全宽屏幕尺寸

具有管理员权限的 Kotlin 中的多用户系统

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

导航组件中预期的函数调用map(...)

获取模板向导配方类 Intellij 中的应用程序包名称

Jetpack Compose Alignment - 误解了 alignBy 修饰符

Jetpack Compose:SpanStyle 的 TextAlign(垂直居中)

Gradle 构建错误:找不到 semver4j-0.16.4-nodeps.jar

使用 Jetpack Compose 时,如何以简单的方式在 Color.kt 中定义 colored颜色 ?

在alert 对话框生成器中启动协程

在 Android Studio 中保存数据