2026年6月8日月曜日

onSubscription で load を開始するとはまる問題

class ItemListViewModel(...) : ViewModel() { val uiState: StateFlow<UiState> = baseFlow .onSubscription { loadInitialPage() } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5000), initialValue = UiState.Initial ) このコードで取得した ItemList を ItemListScreen で表示している。ItemList にはページングがあり、loadInitialPage() は初期ページを読み込む処理である。

この画面から別の画面、例えば ItemDetailScreen に行って戻ってくる場合、5秒以上経ってから戻ってくると onSubscription { } が再度呼ばれる。そのため、スクロールして2ページ目以降を読み込んで表示している場合、5秒以上経ってから戻ってくると1ページ目に戻されてしまう。

val uiState: StateFlow<UiState> = baseFlow .onSubscription { if (uiState.value == UiState.Initial) { loadInitialPage() } } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5000), initialValue = UiState.Initial ) このように状態チェックを入れればいいのだが、それなら init { loadInitialPage() } でいいじゃん。と思うのである。私は init 派である。

(実際これで問題になっていたコードを直したので、実装時に気をつけることが少ないほうがいいと思うんだ)



0 件のコメント:

コメントを投稿