我曾经使用Channel
从Anko View类向Activity类发送click事件,但是越来越多的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
,这不像以前那么优雅。这种方式是正确的吗?我可以在定义属性时初始化一个Rx Subject
,如Flow
?
编辑:
我带回了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
也在使用通道)
2条答案
按热度按时间mmvthczy1#
虽然我在我的项目中没有使用Anko,但我编写了这个函数来使用常规的按钮引用,看看它是否对你有帮助:
可能使用的示例是:
更新
正如@Micer在对原始答案的评论中提到的那样,
Channel#offer
方法已被弃用,转而支持Channel#trySend
方法。更新版本:
3pmvbmvn2#
献给Kotlin爱好者
使用
callbacFlow
使用
Channel
eventActor