ViewModelでdataStore変数を読むときの.first()の効果
Jetpack Composeの ViewModel で DataStore の値を .first() で読むと、「最初に流れてきた値を取得して、Flow の購読を自動で終了する(キャンセルする)」という効果があります。
主な効果と特徴
単発の読み込み: 状態の監視(リアクティブな購読)ではなく、その瞬間の値(スナップショット)を1回だけ取得したい場合に適しています。
リソースの節約: 値を受け取った直後に自動で購読がキャンセルされるため、メモリリークを防ぎ効率的です。
初期化処理向け: ViewModel の初期化時(init ブロックなど)に、一度だけユーザー設定を読み込んで初期状態を構築する、といった用途でよく使われます。
注意点(ComposeのリアクティブなUIとしては使えない)
.first() は「最初の1回」しか取得しないため、アプリ実行中に DataStore の値が変化しても Compose の画面は再描画されません。
値の変更を検知して UI に自動反映(リアクティブ化)させたい場合は、.first() ではなく .stateIn() を使用して StateFlow に変換し、Compose 側で collectAsState() を呼ぶ必要があります。