LoginSignup
0
1

KotlinのコルーチンにおけるFlowについて

Posted at

KotlinのコルーチンにおけるFlow, SharedFlow, StateFlowは、それぞれ異なるリアクティブなデータストリームを表現するためのツールです。それぞれの使い方と用途について詳しく説明します。

Flow

Flowは非同期データストリームを表現するために使用されます。これはCold Streamであり、コレクションが開始されるとデータの生成が始まります。

基本的な使い方

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun simpleFlow(): Flow<Int> = flow {
    for (i in 1..3) {
        delay(100) // 模擬的な非同期操作
        emit(i)   // データを発行
    }
}

fun main() = runBlocking {
    simpleFlow().collect { value ->
        println(value)
    }
}

SharedFlow

SharedFlowはHot Streamであり、複数のコレクターが同じデータストリームを共有します。SharedFlowはイベントを共有するために使用され、通常、複数のリスナーが存在する場合に利用されます。

基本的な使い方

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val sharedFlow = MutableSharedFlow<Int>()
    
    launch {
        sharedFlow.emit(1)
        sharedFlow.emit(2)
        sharedFlow.emit(3)
    }
    
    sharedFlow.collect { value ->
        println("Collector 1: $value")
    }

    sharedFlow.collect { value ->
        println("Collector 2: $value")
    }
}

StateFlow

StateFlowSharedFlowの特殊な形で、現在の状態を保持し、状態が変わるたびに更新を通知します。これもHot Streamであり、状態管理に適しています。

基本的な使い方

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val stateFlow = MutableStateFlow(0)
    
    launch {
        repeat(3) {
            delay(100)
            stateFlow.value = it
        }
    }
    
    stateFlow.collect { value ->
        println("Collector: $value")
    }
}

Flow vs SharedFlow vs StateFlow

  1. Flow:

    • Cold Stream。
    • コレクションが開始されたときにデータの生成が開始される。
    • 各コレクターは独自のデータストリームを受け取る。
  2. SharedFlow:

    • Hot Stream。
    • 複数のコレクターが同じデータストリームを共有する。
    • データの履歴を保存するため、遅れてコレクトを始めた場合でも過去のデータを受け取れる。
  3. StateFlow:

    • SharedFlowの特殊な形で、状態を保持するために使用。
    • 常に最新の状態を保持し、その状態が変わるたびに通知を送る。

使用例

状態の管理

StateFlowは、状態を管理するのに非常に便利です。たとえば、UIの状態を管理するために使われます。

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

class ViewModel {
    private val _state = MutableStateFlow("Initial State")
    val state: StateFlow<String> = _state

    fun updateState(newState: String) {
        _state.value = newState
    }
}

fun main() = runBlocking {
    val viewModel = ViewModel()
    
    launch {
        viewModel.state.collect { value ->
            println("State: $value")
        }
    }
    
    delay(1000)
    viewModel.updateState("New State")
}

このように、StateFlowを使ってUIの状態をリアクティブに管理することができます。SharedFlowはイベントストリームの共有に、Flowは非同期データストリームの処理にそれぞれ適しています。用途に応じて適切なツールを選択することで、Kotlinのコルーチンをより効果的に活用できます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1