- androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" }
+ androidx-core = { module = "androidx.core:core", version.ref = "androidxCore" }
2026年7月6日月曜日
androidx の core-ktx の内容は core に含まれるようになった
core 1.19.0-alpha01 から core-ktx API は core library に統合されて、すべての Kotlin 拡張機能はメインの core artifact の一部になりました。
互換性のために core-ktx は空のアーティファクトとして残されていますが、空のアーティファクトを含める意味もないので早めに core に変更しておきましょう。
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 派である。
(実際これで問題になっていたコードを直したので、実装時に気をつけることが少ないほうがいいと思うんだ)
登録:
投稿 (Atom)