viewModelScope.launch { ... } は 新しいコルーチン
普通の関数の中で viewModelScope.launch { ... } を呼ぶ。そうすると、ブロックの中の処理が 非同期に実行される。
viewModelScope.launch { ... } は 新しいコルーチン を起動します。
コルーチンの中の処理は呼び出し元のスレッドをブロックせずに並行して動作します。
例えば
loadAllNoteIds() → getAllNoteIds() → allNoteIds.value → UI 側 collectAsState とある場合に
loadAllNoteIds() を呼んだ時点では、まだ getAllNoteIds() の結果は返ってきていません。
結果が取れたタイミングで _allNoteIds.value に値が代入され、それを監視している UI 側 (collectAsState 等) に反映されます。
まとめると
普通の関数(同期的に呼び出される)でも中に 非同期処理(コルーチン) を起動すると、結果が返るのは後。
そのため「呼び出した瞬間に値が返ってくる」わけではなく、後からFlowやStateFlow経由で反映される。
もし「関数の戻り値として同期的に List
でも構造的に「UI は StateFlow を購読する → ViewModel が非同期で流し込む」という形の場合は、非同期処理(コルーチン) を起動するやり方で良いのです。