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 件のコメント:
コメントを投稿