Jetpack Compose にてSwipeRefreshLayout
を実現したい場合、Accompanist のSwipeRefresh
を使用するのが一般的です。
以下は上記サイトに掲載されている例です。
val viewModel: MyViewModel = viewModel()
val isRefreshing by viewModel.isRefreshing.collectAsState()
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = { viewModel.refresh() },
) {
LazyColumn {
items(30) { index ->
// TODO: list items
}
}
}
基本的にはこの例の通りに使えば問題ないですが、SwipeRefreshLayout
と 1 点異なる点がありました。
それは、「Pull-to-Refresh 時、プログレス表示を明示的に行わなければすぐに表示が消えてしまう」ことです。
Pull-to-Refresh時、プログレス表示を明示的に行わなければすぐに表示が消えてしまう
SwipeRefresh
を定義する際、以下のように定義します。
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = { viewModel.refresh() },
) {
...
}
これにより、isRefreshing
がtrue
の場合はプログレスが表示され、false
の場合はプログレスが表示されなくなります。
SwipeRefresh
で Pull-to-Refresh 時、isRefreshing
は自動的にtrue
になりません。
そのため、viewModel.refresh()
の中などでisRefreshing
をtrue
にしないとすぐに表示が消えてしまいます。
SwipeRefreshLayout
で Pull-to-Refresh を行った際はすぐに表示が消えず、何もしなければプログレスが表示されっぱなしになるため、盲点でした。
更新リクエストに応答する | Android デベロッパー | Android Developers
まとめ
Jetpack Compose にてSwipeRefreshLayout
を実現したい場合、Accompanist のSwipeRefresh
を使用するのが一般的です。
その際の注意点として、プログレス非表示はもちろん、プログレス表示の制御を明示的に行うようにしてください。