【要約】rememberViewModelStoreProviderを使ったScoped ViewModel [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
以下の課題を解決する。
- ・Dialog 再表示時に、前回の ViewModel 状態が残ってしまう。
- ・Pager 内でページごとに ViewModel を分離する実装が煩雑。
- ・ViewModel の生存期間が不適切で、不要なメモリ消費や状態の混入が発生する。
// Approach
以下の手順で ViewModel のスコープを限定する。
1.
rememberViewModelStoreProvider で ViewModelStore を作成。2.
rememberViewModelStoreOwner でその Provider を持つ Owner を生成。3.
CompositionLocalProvider を使い、LocalViewModelStoreOwner に Owner を提供。4.そのスコープ内で
viewModel() を呼び出し、限定的な生存範囲を持たせる。// Result
以下の改善が見込める。
- ・Pager 内で
viewModel(key = XXX)を使う従来手法と同様の制御が可能。 - ・Dialog 表示ごとに、新しい ViewModel インスタンスを確実に生成できる。
- ・ViewModel の生存期間を Composable のスコープに厳密に一致させられる。
Senior Engineer Insight
> UI の局所的な状態管理において、極めて強力な武器となる。Dialog や Pager のような、ライフサイクルが複雑なコンポーネントでの状態汚染を防げる。大規模開発では、ViewModel の生存範囲を明示的に制御することで、メモリ管理の予測可能性が高まる。ただし、API が新しいため、ライブラリの安定性を慎重に見極める必要がある。実戦投入時は、バージョンアップによる破壊的変更に注意せよ。