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 で、ここまで書けるとは。



アプリを使った 2段階認証 (2FA) を分かりやすく整理する

使いながらもなんか

ややこしい。

セキュリティ的に向上するのは分かるが、なんか

面倒くさい。

なので、一度整理してスッキリしておきます。

 

🔑 2段階認証 (2FA) とは

これまでのログイン。

アプリを使った 2段階認証 (2FA) を分かりやすく整理する

IDパスワード を入力してログインします。

そして、2段階認証。

アプリを使った 2段階認証 (2FA) を分かりやすく整理する

IDパスワード に加えて ワンタイムパスワード を入力してログインします。

 

🔑 ワンタイムパスワード

ワンタイムパスワード は、シークレットキー を保存している ワンタイムパスワード生成アプリ で生成します。

アプリを使った 2段階認証 (2FA) を分かりやすく整理する

シークレットキーワンタイムパスワード生成アプリ 内に保存しておくことになります。

アプリを使った 2段階認証 (2FA) を分かりやすく整理する

 

🔑 シークレットキー

シークレットキー は、ログインしたいサービス のサイトやアプリから発行されます。

そのサービスの 設定画面などから 2段階認証 を ON にして発行します。

アプリを使った 2段階認証 (2FA) を分かりやすく整理する

 

🔑 まとめ

以上の図をまとめておきます。

左(水色)が ログインしたいサービス で、右(灰色)が ワンタイムパスワード生成アプリ です。

例えば、水色が Twitter で、灰色が Google認証システムアプリ(Autenticator)
アプリを使った 2段階認証 (2FA) を分かりやすく整理する

👉 Google 認証システム - Google Play のアプリ hatena-bookmark

それぞれの要素の意味合いを把握できていれば、画面遷移やサービスによる言葉の変化にも対応して読み替えることができます。

SMS(ショートメール) を使った2段階認証で受信するテキストの意味も分かると思います。


【iPhone】勝手な「使ってないアプリをアンインストールする」機能を無効化する方法

👉 あまり使わない決済アプリが勝手にアンインストールされていた - ケータイ Watch hatena-bookmark

勝手にアンインストールされると、イラッとする人向け。

そこまで自動にしたくない。


設定

 ↓

App Store

 ↓

非使用のAppを取り除く → OFF

あまり使わない決済アプリが勝手にアンインストールされていた

スマホのおせっかいは本当にうざいです。

👉 Android で使用していないアプリを削除、無効化、管理する - Android ヘルプ hatena-bookmark