🎞️ ローディングインジケーターの作成
まずは、簡単にテキストで「読み込み中」を表示する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 を確認して表示を切り替えれば良いです。


