我曾经使用Channel
从Anko View类发送点击事件到Activity类,但是越来越多的Channel
函数被标记为过时。因此,我想开始使用Flow
API。
我迁移了下面的代码:
private val btnProduceChannel = Channel<Unit>()
val btnChannel : ReceiveChannel<Unit> = btnProduceChannel
// Anko
button {
onClick {
btnProduceChannel.send(Unit)
}
}
to:
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
的方法?(尽管像callbackFlow
,channelFlow
这样的Flow
本身也在使用通道。)
RxView.clicks(view)
:) - Ryan AmarallifecycleScope.launch
和.launchIn(lifecycleScope)
有什么区别? - IgorGanapolskyonEach()
。 - Aceoffer
is deprecated and should be replaced bytrySend
- Micer