Mark
08/30/2020, 2:33 AMclass FlowDelegate<T>: ReadWriteProperty<Any, Flow<T>> {
private val deferredFlow = CompletableDeferred<Flow<T>>()
override fun setValue(thisRef: Any, property: KProperty<*>, value: Flow<T>) {
deferredFlow.complete(value)
}
override fun getValue(thisRef: Any, property: KProperty<*>): Flow<T> {
return if (deferredFlow.isCompleted) {
deferredFlow.getCompleted()
} else {
flow {
emitAll(deferredFlow.await())
}
}
}
}
/** Usage */
class MySample {
private var _sampleFlow by FlowDelegate<String>()
val sampleFlow: Flow<String>
get() = _sampleFlow
fun init(args: ...) {
_sampleFlow = flow<String> { /* based on args */ }
}
}
Zach Klippenstein (he/him) [MOD]
08/30/2020, 2:01 PMMark
08/30/2020, 3:51 PMZach Klippenstein (he/him) [MOD]
08/30/2020, 3:54 PMDeferred<Flow<>>
directly for this seems more clear/less magical, and isn’t really that much boilerplate.Mark
08/30/2020, 4:10 PMZach Klippenstein (he/him) [MOD]
08/30/2020, 6:39 PMMark
08/31/2020, 3:53 AMclass MySample {
private val _sampleFlowChannel = ConflatedBroadcastChannel<Flow<String>>()
val sampleFlow: Flow<String>
get() = _sampleFlowChannel.asFlow().flattenConcat()
fun init(args: ...) {
val f = flow<String> { /* based on args */ }
_sampleFlowChannel.offer(f)
}
}
myanmarking
12/08/2020, 3:05 PMMark
12/09/2020, 5:06 AMmyanmarking
12/09/2020, 12:13 PM