[Android] 002. kotlinx.coroutines.channels

今まで特に使う要件がなかったのでスルーしてたChannel
Queueみたいな感じで使えて、たとえば↓のように検索バーの入力中に最新の内容を検索するなどに使えそうです

import androidx.lifecycle.viewmodel.compose.viewModel

class SearchViewModel : ViewModel() {
    private val searchText = Channel<String>(100, BufferOverflow.DROP_OLDEST)

    init {
        viewModelScope.launch(Dispatchers.IO) {
            searchText.consumeEach {
                val text = it
                if (searchText.isEmpty) {
                    // 検索処理...
                }
            }
        }
    }

    suspend fun search(text: String) {
        searchText.send(text)
    }
}

val vm: SearchViewModel = viewModel()
val scope = rememberCoroutineScope()
var text by remember { mutableStateOf("") }
TextField(
    value = text,
    onValueChange = {
        text = it
        scope.launch {
            vm.search(text)
        }
    }
)

Flowとして使用することもできます

class InputViewModel : ViewModel() {
    private val _values = Channel<Int>(100, BufferOverflow.DROP_OLDEST)
    val values = _values.receiveAsFlow()

    fun input() = viewModelScope.launch {
        val value = (0..100).random()
        _values.send(value)
    }
}

val vm: InputViewModel = viewModel()
LaunchedEffect(Unit) {
    vm.values.collect {
        Log.d("", "$it")
    }
}
Button(onClick = { vm.input() }) {}

// または
val values = vm.values.collectAsState(0)
Button(onClick = { vm.update() }) {}
Text("${values.value}")

Android Studio Koala 2024.1.1 Patch 1 built on July 11, 2024