Jetpack Compose チュートリアルをただやってみるだけの記事 #1

# 初めに
この記事は、Jetpack Compose未経験のしがないAndroidエンジニアが[チュートリアル](https://developer.android.com/jetpack/compose/tutorial?hl=ja)をやってみるだけの記事です。
先日のメルカリのイベント [Android Office Hours〜2022年の技術トレンド大予想！〜](https://www.youtube.com/watch?v=8-ifCGQ20tg)でも、Jetpack Composeは今後Android開発においてデファクトスタンダードになっていくだろうと予想されていました。
Android開発で食べていく以上触っておかないといけないだろうと思い、とりあえずチュートリアルをやってみることにしました。


# Jetpack Composeとは
Jetpack Composeは、GoogleがリリースしているAndroidのUI実装のツールで宣言的なUIフレームワークであるという特徴があります。
宣言的UIとは状態をUIに変換するという考え方です。
従来のXMLを用いた開発では、Viewが持つUI更新メソッドを開発者が手動で呼び出して管理する必要がありましたが、アプリの状態が変更されるとUI が自動的に更新される仕組みになっています。

# チュートリアルをやってみる
本題に入り、チュートリアルをやっていきます。

## プロジェクトの生成
AndroidStudioで`Empty Compose Activity` テンプレートを使用してアプリを作成すると、Jetpack Composeが導入された状態でプロジェクトが生成されます。
作成されたプロジェクトは下記のようになっており、既にいくつかCompose要素が定義されています。

```kotlin:MainActivity.kt
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeSampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    ComposeSampleTheme {
        Greeting("Android")
    }
}
```

他にも、ui.themeというパッケージに何やら色々定義されています。
<img width="300" alt="Screenshot_1643016305.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/f722fa5f-aed2-3f6c-d240-74eac6173a12.png">


今回は入門編のため、定義されている要素は使わずに1から実装してみます。
4ステップあるチュートリアルのうち下記の二つをやってみたいと思います
[1.ハローワールドをやってみる](#1-ハローワールドをやってみる)
[2.レイアウトをいじってみる](#2-レイアウトをいじってみる)

###1. ハローワールドをやってみる
お馴染みのHello worldを表示するコードはこちらです。

```kotlin:MainActivity.kt
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MessageCard("World")
        }
    }
}

@Composable
fun MessageCard(name: String) {
    Text(text = "Hello $name!")
}
```
通常の`AppCompatActivity`ではなく`ComponentActivity`を継承し、それが持つ`setContent`メソッドにてコンポーズ可能な関数を呼び出すことでUIを構築していくんですね。
コンポーズ可能な関数には`@Composable`アノテーションをつけると。

ちなみに、コンポーズ可能な関数に対して`@Preview`アノテーションをつけることで、アプリをインストールしなくてもAndroidStudioでデザインのプレビューができます。
プレビューするコンポーズ関数はデフォルト値が提供されている必要があるので、`MessageCard `のように引数を取る場合下記のようにプレビュー用のメソッドを用意する必要があるそうです。

```kotlin
@Preview
@Composable
fun PreviewMessageCard() {
    MessageCard("Android")
}
```

###2. レイアウトをいじってみる
次に、複数の要素を並べる実装をしてみます。
よくあるリストの要素を想定して、左側に画像があり右側にテキスト情報がある画面を作成します。
垂直に要素を並べたいときは`column`を、並行に並べたいときには`Row`を使用します。

```kotlin
data class Message(val author: String, val body: String)
@Composable
fun MessageCard(msg: Message) {
    Row {
        Image(
            painter = painterResource(R.drawable.ic_launcher_foreground),
            contentDescription = "Contact profile picture",
        )

        Column {
            Text(text = msg.author)
            Text(text = msg.body)
        }

    }
}
```
上記を実行した画面がこちらです。
<img width="300" alt="Screenshot_1643016305.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/54c959cc-0b89-69ca-3572-6b52d8e1e911.png">

指定した通り画像とテキストが水平に、テキスト同士が垂直に並んではいますが、細かい配置指定をしていないので気持ち悪いデザインになっていますね、調整します。


```kotlin
@Composable
fun MessageCard(msg: Message) {
    Row(modifier = Modifier.padding(all = 8.dp)) {
        Image(
            painter = painterResource(R.drawable.ic_banana),
            contentDescription = "Contact profile picture",
            modifier = Modifier
                .size(40.dp)
                .clip(CircleShape)
        )
        Spacer(modifier = Modifier.width(8.dp))

        Column {
            Text(text = msg.author)
            Spacer(modifier = Modifier.height(4.dp))
            Text(text = msg.body)
        }

    }

}
```

Modifier修飾子を使ってpaddingやSpacerのサイズを調整しています。
今回は触りませんが、ユーザー入力の処理などにもModifierを用いるらしいです。
上記を実行した画面がこちらです。

<img width="300" alt="Screenshot_1643016305.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/7bebdd78-a80c-a29e-7315-73dd04d4aa45.png">

# まとめ
本当にただただチュートリアルをやっただけでした。
今回はまだ状態の更新を試せていないので正直あまり旨味は感じられませんが、今後色々試せていければと思います。