0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

( ..)φメモメモ - Androidアプリでの状態管理(ViewModel)

Posted at

MutableStateMutableStateFlowを使う

Copilotプロンプト
mutablestateとstateflowをメインで使うようにする。
stateflowはmutablestateflowと組み合わせて使う。

MutableStateStateFlowをメインで使い、さらにStateFlowMutableStateFlowと組み合わせる設計は、Androidアプリの状態管理をシンプルかつ効率的にする良い方法ですね。この方針に基づく基本的な流れと設計について解説します。


1. 基本設計の流れ

  1. ViewModelで状態を管理:

    • MutableStateFlowを使用して状態を変更可能な形で保持します。
    • 外部にはStateFlowとして公開して状態を読み取り専用にします。
  2. Composeで監視:

    • StateFlowcollectAsState()で監視し、再コンポーズをトリガーします。
    • 一時的なUI状態にはMutableState(またはremember)を利用します。

2. MutableStateFlowStateFlowの組み合わせ

以下のコード例で全体像を見てみましょう:

ViewModelでの状態管理

class MyViewModel : ViewModel() {
    // MutableStateFlowで内部状態を保持
    private val _uiState = MutableStateFlow(UiState())
    val uiState: StateFlow<UiState> get() = _uiState

    // 状態更新用の関数
    fun updateState(newTitle: String) {
        _uiState.value = _uiState.value.copy(title = newTitle)
    }
}

// 状態データクラス
data class UiState(
    val title: String = "初期タイトル",
    val count: Int = 0
)

ComposeでのUI連携

@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    // StateFlowをComposeで観察
    val uiState by viewModel.uiState.collectAsState()

    // UIを表示
    Column {
        Text(text = uiState.title)
        Button(onClick = { viewModel.updateState("新しいタイトル") }) {
            Text("更新")
        }
    }
}

3. MutableStateの活用

  • MutableStateFlowの状態以外に、UIで一時的に利用する状態はMutableStateを使います。
  • 以下はカウンタ機能を追加した例です:
@Composable
fun CounterScreen(viewModel: MyViewModel = viewModel()) {
    // StateFlowからの状態を取得
    val uiState by viewModel.uiState.collectAsState()

    // UIでカウント状態を一時的に管理
    var counter by remember { mutableStateOf(0) }

    Column {
        Text(text = "タイトル: ${uiState.title}")
        Text(text = "カウント: $counter")

        Button(onClick = { counter++ }) {
            Text("カウントアップ")
        }
        Button(onClick = { viewModel.updateState("カウント更新中") }) {
            Text("タイトル更新")
        }
    }
}

4. この組み合わせのメリット

  1. 責務の明確化:

    • 永続的なアプリケーション状態(ViewModel)と一時的なUI状態(MutableState)が分離されます。
  2. 安全性と再利用性:

    • MutableStateFlowはViewModel内に隠蔽され、外部から直接変更される心配がありません。
    • 状態管理が一元化され、アプリ全体で一貫性を保てます。
  3. Composeとのスムーズな連携:

    • collectAsState()を使うことで、状態変化に自動的に反応します。

この設計は、Jetpack Composeを利用したモダンなAndroidアプリ開発に非常に適しています。もし特定の実装についてもっと知りたいことがあれば、お気軽にどうぞ! 😊

Unidirectional Data Flow (UDF) の原則

Copilotプロンプト
Unidirectional Data Flow (UDF) の原則を説明する

Unidirectional Data Flow (UDF) の原則は、アプリケーションの状態を管理しやすくし、バグを減らすために設計されたアーキテクチャの概念です。特にJetpack ComposeやReactなどのフレームワークで重要な役割を果たしています。この原則を簡潔に説明します。


1. UDFの基本的な構造

UDFは、「データが一方向にのみ流れる」というシンプルな原則に基づいています。以下の流れが典型的なパターンです:

  1. データの発生源(Source of Truth):

    • 状態やデータを保持する唯一の場所(例えば、ViewModelやStateFlow)。
  2. 状態をUIに渡す:

    • データはViewModelからUIコンポーネント(Composable)に流れます。
    • UIはこれを受け取って描画を更新します(ComposeではcollectAsStateを使用)。
  3. UIからイベントが発生:

    • ユーザーがボタンを押すなどの操作を行うとイベントが発生します。
  4. イベントを状態管理の場所に送る:

    • UIで発生したイベントはViewModelなどの状態管理層に戻り、新しいデータや状態が生成されます。

2. UDFの重要なポイント

  • 単一方向の流れ:
    • データは一方向にのみ流れるため、変更がどこで行われたかを簡単に追跡可能です。
  • 状態の一元管理:
    • アプリ全体の状態は一つの「真実の源(Source of Truth)」で管理されます。
  • 予測可能性:
    • データの流れが明確であるため、アプリケーションの挙動が予測しやすくなります。

3. UDFをComposeで実現する例

以下は、UDFの原則をComposeで実装する例です:

ViewModelで状態を管理

class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow(UiState())
    val uiState: StateFlow<UiState> get() = _uiState

    fun onButtonClick(newText: String) {
        _uiState.value = _uiState.value.copy(title = newText)
    }
}

data class UiState(val title: String = "初期値")

Composeで状態を監視

@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    // 状態を監視
    val uiState by viewModel.uiState.collectAsState()

    Column {
        Text(text = uiState.title)
        Button(onClick = { viewModel.onButtonClick("新しいタイトル") }) {
            Text("タイトル更新")
        }
    }
}

4. UDFのメリット

  • コードの保守性向上:
    • 状態とUIが分離されているため、変更がしやすい。
  • デバッグが容易:
    • データの流れが単一方向であるため、問題の原因を追いやすい。
  • 再利用性の向上:
    • 状態管理ロジックがUIとは独立しているため、他のコンポーネントでも再利用可能。

UDFの原則を採用することで、アプリケーションの設計がシンプルで予測しやすくなるだけでなく、コードの品質や開発効率も向上します。特定の実装方法やさらなる質問があれば、ぜひ教えてください! 😊

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?