2026年7月6日月曜日

androidx の core-ktx の内容は core に含まれるようになった

core 1.19.0-alpha01 から core-ktx API は core library に統合されて、すべての Kotlin 拡張機能はメインの core artifact の一部になりました。 互換性のために core-ktx は空のアーティファクトとして残されていますが、空のアーティファクトを含める意味もないので早めに core に変更しておきましょう。 - androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } + androidx-core = { module = "androidx.core:core", version.ref = "androidxCore" }

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 派である。

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