Jetpack Compose における状態の管理

#目次
1. 語句の確認
2. コンポーザブル内の状態
3. 実際に使ってみる
4. まとめ

##1.語句の確認

まず初めに、状態の管理の説明に移る前に語句の確認を行いたいと思います。
本記事において、重要な語句として次の4つを上げたいと思います。


**・コンポジション**
**・初回コンポーズ**
**・再コンポーズ**
**・再コンポジション**

それでは、順に説明していきます。

***

**・コンポジション**‥**コンポーザブル(Composable)**を実行した際に、**コンポジション(Composition)**を構成する。

```kotlin
@Composable
fun MyComposable() {
    Column {
        Text("Hello")
        Text("World")
    }
}
```

上記の[Sample Code](https://developer.android.com/jetpack/compose/lifecycle?hl=ja)において、**コンポジション**は以下のツリー構造を構成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512202/3ac95a8b-f42c-2ab4-b655-661352bda22d.png)

**コンポジション(Composition)**は、UIの構成要素を保存することができ、この時にUIの**状態(State)**も同時に保存することができる。

よって、状態(State)を正しく管理するためには、状態(State)がどのように管理されるかを知っておく必要があり、**コンポジション**の重要性が高いことがわかる。

***

次に、**コンポジション(Composition)**はいつ構成されるのかについて説明したいと思います。

**・初回コンポーズ**‥初めて**コンポーザブル(Composable)**を実行した際に、**コンポジション(Composition)**を構成すること。

また、データの変更をどのように読み取るかは次の**再コンポーズ**が重要になります。

**・再コンポーズ**‥何らかのデータの変更が行われた際に、**コンポジション(Composition)**を更新するために、**コンポーザブル(Composable)**を再実行すること。


この流れを次の[画像](https://developer.android.com/jetpack/compose/lifecycle?hl=ja)で表すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512202/50b15461-003c-1f1e-7050-5657e935ccaf.png)


**・再コンポジション**‥データの更新があった場合は、**再コンポーズ**を行って**コンポジション(Composition)**を更新しなければいけないこと

##2. コンポーザブル内の状態

まずは、次のサンプルコードを確認してください。

```kotlin
@Composable
fun EnterYourName() {
    var yourName by remember { mutableStateOf("") }
    
    TextField(
        value = yourName,
        onValueChange = { yourName = it },
        label = { Text(text = "Your Name") }
    )
}
```

コンポーザブルの中で、rememberを用いて状態の管理をしているのがわかると思います。このように、コンポーザブルの状態を管理するために、rememberを用いて状態を保持する必要があります。

では、ここでrememberがなかった場合を考え、次のサンプルコードを確認してください。

```kotlin
@Composable
fun EnterYourName() {

    TextField(
        value = yourName,
        onValueChange = { yourName = it },
        label = { Text(text = "Your Name") }
    )
}
```

この場合では、状態の更新を受け取る**value =**に対し、渡す状態がないのでこのコンポーザブルはエラーとして扱われます。

よって、状態を管理するためには状態をどう管理するのかを考えコンポーザブルを定義しましょう。
また、**ステートフル、ステートレス**などの状態をどこで受け取るか、
なぜ**Delegated Property**を使ってrememberを定義するかなど、より実践的な内容については、別記事で紹介したいと思います。

##3. 実際に使ってみる

ボタンをクリックし、クリックした回数を表示する簡単なコンポーザブルを定義したいと思います。

```kotlin
@Composable
fun EnterYourName() {

    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {

        var number by remember { mutableStateOf(0) }

        Text(
            text = "$number",
            fontSize = 20.sp
        )

        Button(
            onClick = {
                number++
            },
            colors = ButtonDefaults.buttonColors(
                ButtonBackgroundGreen
            )
        ) {
            Text(text = "Click!!")
        }
    }
}
```
![Screenrecorder-2022-01-18-21-35-08-773.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512202/706be338-d28b-b570-8d97-0fe314509e5a.gif)

**number**をrememberで状態(初期値=0)として管理し、**onClick**ごとに最初の値**+1**という処理を加えることで上記のように実装することができました。

##4. まとめ

Jetpack Composeを使っていくうえで重要な概念である、状態の管理について勉強したことをまとめてみました。この記事で紹介できなかったことは、また別の記事でまとめたいと思います。