Kotlin で Jetpack Compose, Retrofit を使って API リクエスト、JSON パース して、グリッド表示するコードをファイル別に表示して

Kotlin で Jetpack Compose と Retrofit を使って API リクエスト、JSON パースして、グリッド表示するためには、以下のようにファイルを分けることができます。

 

1. API リクエストを行うための Retrofit インターフェースを定義するファイル


interface ApiService {

    @GET("/photos")
    suspend fun getPhotos(): List<Photo>
}

 

2. API レスポンスを表すデータクラスを定義するファイル


data class Photo(
    val id: Int,
    val title: String,
    val url: String
)

 

3. API レスポンスをパースして、表示するための画面を定義するファイル


@Composable
fun PhotoGrid() {
    val photos by remember { mutableStateOf<List<Photo>>(emptyList()) }

    LaunchedEffect(Unit) {
        val apiService = Retrofit.Builder()
            .baseUrl("https://jsonplaceholder.typicode.com")
            .addConverterFactory(Json {
                ignoreUnknownKeys = true
            }.asConverterFactory("application/json".toMediaType()))
            .build()
            .create(ApiService::class.java)

        photos = apiService.getPhotos()
    }

    LazyVerticalGrid(cells = GridCells.Adaptive(minSize = 128.dp)) {
        items(photos) { photo ->
            Card(
                modifier = Modifier.padding(4.dp),
                shape = RoundedCornerShape(8.dp),
                elevation = 4.dp
            ) {
                Column(
                    Modifier
                        .fillMaxWidth()
                        .height(128.dp)
                        .padding(8.dp)
                ) {
                    Text(
                        text = photo.title,
                        style = MaterialTheme.typography.subtitle1,
                        maxLines = 2,
                        overflow = TextOverflow.Ellipsis
                    )
                    Spacer(modifier = Modifier.weight(1f))
                    CoilImage(
                        data = photo.url,
                        contentScale = ContentScale.Crop,
                        modifier = Modifier.fillMaxSize()
                    )
                }
            }
        }
    }
}

 

4. 上記の画面を表示するための Activity もしくは Fragment を定義するファイル


class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PhotoGrid()
        }
    }
}

以上のように、ファイルを分けることで、API リクエストやパース、表示を分離し、コードを見やすく、メンテナンスしやすくすることができます。

 

■ 感想

ただ、一行問いかけただけ。

ChatGPT で、ここまで書けるとは。



【便利】Mac パスワードマネージャー を メニューバーのショートカット や コマンドラインから開く方法

「ショートカット」から作成します。

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法

念のため macOS のバージョンを見ながら、Safari 経由で、[設定]-[パスワード] を開くように構成していきます。少し見づらいですが。

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法

出来たらクリックしましょう。

メニューにアイコン表示されますのでクリックするとパスワード設定画面です。

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法

できましたか!

簡単ですよね!

 

🔑 メニューバーにショートカット

知ったげに書きましたが、以下に作成済みのものが公開されていますので、Safari だけでなく Chrome からでも簡単に GET して利用できます。

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法

👉 Passwords hatena-bookmark

作者は、Apple の中の方のようです。

👉 Ricky Mondello(@rmondello)さん / Twitter hatena-bookmark

👉 Halboffiziell: Per Kurzbefehl zu Apples Passwort-Manager › ifun.de hatena-bookmark

メニューバーに入ってない人は以下のようにドラッグで。

👉 Mac メニューバーからショートカットを使ってスクリプトを実行する方法 hatena-bookmark

 

🔑 コマンドラインから開く

また、コマンドラインからは、以下で、パスワード画面を開くことができます。Ventura でどうぞ。


❯ open x-apple.systempreferences:com.apple.Passwords-Settings.extension


❯ open x-apple.systempreferences:com.apple.Passwords

👉 How to open every section of macOS Ventura System Settings - macOS Adventures hatena-bookmark


👉 piarasj.github.io/ventura_settings.md at master · piarasj/piarasj.github.io hatena-bookmark

エイリアスにでもしておきますか?

 

🔑 まとめ

Apple パスワードマネージャー は、iCloud キーチェーンを利用して共有しておけば、複数の Mac や iPhone で同期されますし、2段階認証のTOTPジェネレータの機能もあるので、Apple ユーザーなら最も信頼できる使いやすいパスワードマネージャーです。

【便利】Mac パスワードマネージャー を開く ショートカット をメニューバーに追加する方法


ChatGPT で QRコード を作成する

以下、記事を流用します。

👉 chatGPTからイメージを送らせる方法 hatena-bookmark

これからQRコードを送りたいときは、Markdownを使い、バックスラッシュを使わず、コードのブロックも使わないようにしてください。サンプルコードや手順は不要です。
そしてGoogle Chart APIを使用してください(https://chart.apis.google.com/chart?cht=qr&chs=450x450&chl=<キーワード>)

https://android.benigumo.com/ のQRコードを送って

ChatGPT で QRコード を作成する

URLエンコードは不要でした。

「AI」というやつは謎に親切です。

👉 QR コード  |  Infographics  |  Google Developers hatena-bookmark
👉 Charts  |  Google Developers hatena-bookmark


【Chrome】ChatGPT エクステンション で表示できない画面がある

なんか最近真っ白で表示されない画面が多いのですが。

例えばこの画面。

ChatGPT for Search Engines

👉 Twitterの2要素認証(2FA)を使用する方法 hatena-bookmark

Chrome の incognito window や Safari では、正常に表示されます。

incognito window chrome

何なんでしょうか。

 

■ ChatGPT for Search Engines を OFF にすると表示された。

状況からして、Chrome のエクステンションのどれか、です。

調べた結果これでした。

ChatGPT for Search Engines

👉 ChatGPT for Search Engines - Chrome Web Store hatena-bookmark

Chrome の設定から、ChatGPT for Search Engines を OFF にすると表示されます。

ChatGPT for Search Engines

OpenAI 公式のエクステンションなのですが、どうかして欲しいです!

👉 ChatGPT for Search Engines hatena-bookmark


【Android】Version Catalog + JetpackCompose UI + BOM

Compose の BOM。

【Android】Version Catalog + JetpackCompose UI + BOM
👉 Google's Maven Repository hatena-bookmark

公開されているので使ってみます。

少し公式ドキュメントで調べておきます。

BOM の使用は義務ですか?

いいえ。個々の依存関係バージョンを手動で追加することもできます。しかし、すべての最新の安定版を同時に使用することが容易になるので、BOM を使用することをおすすめします。

Compose Compiler ライブラリが BOM に含まれていないのはなぜですか?

Compose Kotlin コンパイラ拡張機能(androidx.compose.compiler)は、Compose ライブラリのバージョンでなく、Kotlin コンパイラ プラグインのバージョンにリンクされており、Compose の他の部分とは異なる頻度でリリースされます。したがって、お使いの Kotlin バージョンと互換性のあるバージョンを使用してください。

👉 Using the Bill of Materials  |  Jetpack Compose  |  Android Developers hatena-bookmark

公式サンプルコードを少し変更したものを準備しておきます。


# libs.versions.toml

[libraries]
compose-ui-bom = { module = "androidx.compose:compose-bom", version = "2023.01.00" }


// build.gradle

dependencies {
  implementation platform(libs.compose.ui.bom)
}

👉 BOM to library version mapping  |  Jetpack Compose  |  Android Developers hatena-bookmark

 

■ 実装

実装としては、以下でいけました。


# libs.versions.toml

[libraries]

compose-ui-bom = { module = "androidx.compose:compose-bom", version = "2023.01.00"}
compose-material = { module = "androidx.compose.material:material" }
compose-material-icons = { module = "androidx.compose.material:material-icons-extended" }
compose-ui = { module = "androidx.compose.ui:ui" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }


// build.gradle

dependencies {

  // compose-ui
  implementation platform(libs.compose.ui.bom)
  implementation libs.compose.material
  implementation libs.compose.material.icons
  implementation libs.compose.ui
  implementation libs.compose.ui.tooling.preview

}

 

■ まとめ

BOM を使っていなかったのですが、エラーが出始めたので、使うことにしました。

「整合性の適正化」と「グループ化」の機能を持っている「BOM」は、Kotlin, Firebase などでも公開されています。

便利に利用するべきでしょう。

しかし、AndroidStudio のコレ。

JetpackCompose UI で BOM

「null」 の表示。

どうにかなりませんかね。

👉 今はまだ必要な Android ライブラリ の Bill of Materials(BOM) のURLs hatena-bookmark