今まで特に使う要件がなかったのでスルーしてた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