如何从不同的函数发出值,但将所有值收集在一个地方?流科特林

时间:2020-05-03 10:35:31

标签: android kotlin-coroutines kotlin-flow kotlin-coroutines-flow

在我的活动中,我需要在类似

的回调中发出不同的流值
  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    emit(1)
  }


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    emit(1)
}

并收集另一个类,例如:

collect{value->
  when(value){
    1->..
    2->..
  }
}

有可能吗?

1 个答案:

答案 0 :(得分:1)

如何?

使接口可以在您需要的每个回调,重写的方法等上进行通知。

interface Notifier<T> {
    fun notify(t: T)
}

在您的类内部声明一个对象以实现该接口:

private var notifier: Notifier<Int>? = null

还使用callbackFlow构建器声明一个Flow,您将在其中初始化通知程序对象:

val myFlow = callbackFlow<Int> {
    notifier = object: Notifier<Int> {
        override fun notify(t: Int) {
            launch {
                channel.send(t)
            }
        }
    }
    awaitClose()
}

您的方法内部会通知您的数据

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    notifier?.notify(1)
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    notifier?.notify(2)
}

最后像这样消耗Flow:

val job = launch(Dispatchers.Default) {
    myClassReference.myFlow
        .collect {
            when(it) {
                1 -> { println("It's one") }
                2 -> { println("It's two") }
            }
        }
}

并确保正确取消job