【发布时间】:2020-01-13 21:26:57
【问题描述】:
我曾经使用Channel 将点击事件从Anko View 类发送到Activity 类,但是越来越多的Channel 函数被标记为已弃用。所以我想开始使用Flow apis。
我迁移了以下代码:
private val btnProduceChannel = Channel<Unit>()
val btnChannel : ReceiveChannel<Unit> = btnProduceChannel
// Anko
button {
onClick {
btnProduceChannel.send(Unit)
}
}
到:
lateinit var btnFlow: Flow<Unit>
private set
button {
btnFlow = flow {
onClick {
emit(Unit)
}
}
}
我现在必须将流属性标记为var,这不像以前那么优雅了。这种方式对吗?我可以在定义属性时像 Flow 一样初始化 Rx Subject 吗?
编辑:
我把Channel带回来,然后用consumeAsFlow():
private val btnChannel = Channel<Unit>()
// This can be collected only once
val btnFlow = btnChannel.consumeAsFlow()
// Or add get() to make property can be collected multiple times
// But the "get()" can be easily forgotten and I don't know the performance of create flow every access
val btnFlow get() = btnChannel.consumeAsFlow()
// Send event with btnChannel
这似乎比lateinit var 更好,但是有什么方法可以完全摆脱Channel? (虽然Flow 本身像callbackFlow、channelFlow 都在使用频道)
【问题讨论】:
标签: android kotlin kotlin-coroutines anko