Room + LiveData と同様に SQLDelight でも簡単にFlow化できます。
val players: Flow<List<HockeyPlayer>> =
playerQueries.selectAll()
.asFlow()
.mapToList()
当然、クエリーの結果の変化を検知して emit します。
@JvmName("toFlow")
fun <T : Any> Query<T>.asFlow(): Flow<Query<T>> = flow {
val channel = Channel<Unit>(CONFLATED)
channel.trySend(Unit)
val listener = object : Query.Listener {
override fun queryResultsChanged() {
channel.trySend(Unit)
}
}
addListener(listener)
try {
for (item in channel) {
emit(this@asFlow)
}
} finally {
removeListener(listener)
}
}
使えます。
👉 SQLDelight で View を使うべし
👉 Turbine で Kotlin coroutine Flow をテストする | #android ファショ通