Как выдавать значения из разных функций, но собирать их все в одном месте? Поток Котлин

В моей деятельности мне нужно выдавать разные значения потока для обратных вызовов, например:

  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 ответ

Как насчет этого?:

Создайте интерфейс для уведомления о каждом обратном вызове, переопределенном методе и т. Д., Которые вам нужны:

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

Внутри вашего класса объявите объект для реализации этого интерфейса:

private var notifier: Notifier<Int>? = null

Также объявите поток с callbackFlow Builder, в котором вы инициализируете объект уведомителя:

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 должным образом.

Другие вопросы по тегам