🎞️ ローディングインジケーターの作成
まずは、簡単にテキストで「読み込み中」を表示するViewを作ります。
JetpackCompose なら簡単に実装できます。
テキストアニメーションで Progress Indicator https://t.co/gEp3CkFunh #kmm #プログラミング pic.twitter.com/yQ9dFtEfaW
— chanzmao (@maochanz) May 9, 2023
こんな無限ループでさえ、Jetpack Compose はメモリーリークを起こしません。きちんと捨ててます。
上の動画内コードから抜粋。
val texts = listOf("○○○", "️●○○", "️●●○", "️●●●", "️●●○", "️●○○")
var dots by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
while (true) {
texts.indices.forEach { index ->
delay(500)
dots = texts[index]
}
}
}
これを LazyColumn の item の表示に使います。
🎞️ Flow<List<Item>> の一時的な付け替え
まず、ローディング表示のよくあるパターン。
リクエストの開始時に _loading
を true
に、レスポンス取得時に false
にすることで List<Item>
を更新します。
private val _loading = MutableStateFlow(false)
val loading = _listening.asStateFlow()
val items: Flow<List<Item>> = _loading.flatMapLatest { loading ->
repository.items
}
これを少し変更します。
List<Item>
は、レスポンスが帰ってくるまで変化がないですが、この間にダミーの「読み込み中を表す Item
」を最後に追加しておきます。
もちろん読み込みが終われば元に戻す。
val items: Flow<List<Item>> = _loading.flatMapLatest { loading ->
repository.items.map { list ->
list.toMutableList().apply {
if (loading) add(dummyLoadingItem)
}.toList()
}
}
あとは、各メッセージを表示する Composable で Item
を確認して表示を切り替えれば良いです。