作者回复: 不错的答案,赞~
作者回复: 哈哈哈……Android开发的领域整体确实趋向于饱和了,不过中、高级的Android开发者还是比较稀缺的。
作者回复: 如果你在flow当中,通过withContext()改变了它其中的Job层级,Flow就无法正常响应取消了。当然,withContext{}也可能只切换线程池,并不修改协程的父子结构,但Kotlin官方目前的做法是干脆全都禁止,想要切线程,就用统一的flowOn{}。否则,flow源码当中的判断条件会更加的复杂,这是Kotlin官方不愿意看见的。
作者回复: 请留意它的import,Kotlin源码中经常这么用: ``` import kotlinx.coroutines.flow.unsafeTransform as transform ``` 类似的,还有:unsafeFlow as flow。
作者回复: 因为它的扩展接收者是Flow呀,说实话,这部分的API挺巧妙的。
作者回复: 答案:是 flow {}.filter {}.collect {} 中终止操作符号 collect 传入的 FlowCollector。 这里用文字描述可能比较费劲,我试着解释一下: flow {}.filter {}.collect {}当中的 collect{} ,它传入的FlowCollector,是通过下面注释处,跟transform建立关系的。 ``` internal inline fun <T> unsafeFlow( crossinline block: suspend FlowCollector<T>.() -> Unit ): Flow<T> { return object : Flow<T> { override suspend fun collect(collector: FlowCollector<T>) { // 注意这里 collector.block() } } } ```
作者回复: 在你另一个回复里解答了哈~
作者回复: 答案是:是 flow{}.filter{}.collect{} 中,终止操作符传入的 FlowCollector 匿名内部类实例。 我在你另一个评论里解答了哈~
作者回复: 请留意你注释2处的,扩展接收者类型,它也是Flow。
作者回复: 是的