2025年4月5日土曜日

Kotlin Multiplatformで日時をフォーマットする

Kotlin Multiplatformで日付を言語ロケールに合わせてフォーマットしたい場合はどうしたらいいでしょうか。 Kotlin Multiplatformで日時を扱うには kotlinx-datetime ライブラリを利用することが一般的だと思います。このライブラリは基本的な日時操作機能を提供していますが、ロケールに合わせたフォーマット機能はありません。

expect/actualで実装する

現状では expect/actual 機構を使って、各プラットフォーム固有の日時フォーマットを実装するのが現実的です。 以下はその実装例です。

共通モジュールでの定義

まず、共通モジュールに機能を定義します。

// 共通モジュールに定義
expect class DateTimeFormatter() {
    fun format(instant: Instant, timeZone: TimeZone): String
}

JVM(Android)実装

JVMプラットフォームではJava標準ライブラリの日時フォーマット機能を使います。

2025年3月22日土曜日

Jetpack Composeのアニメーションとライフサイクル管理

Jetpack Composeでアニメーションを使用する場合、アプリがバックグラウンドの時でもアニメーションが動いたままでバッテリーを消費してしまうのではないかと心配してしまうかもしれません。
この記事ではアニメーションと画面のライフサイクルの関係について説明します。

アニメーションの動作

Jetpack ComposeのアニメーションはActivityのライフサイクルと連動して動作します。Activityがpause状態になるとその中に含まれるComposableのアニメーションも停止します。これは以下の流れで動作します。

  • Composableがアクティブな間はアニメーションが正常に動作します。この時Composeのアニメーションエンジンはフレームごとにアニメーション値を更新します。
  • Composableが一時停止状態(pause)に移行するとアニメーションも一時停止します。
  • Composableが再開(resume)するとアニメーションも再開します。

この仕組みによりJetpack Composeアプリケーションは効率的にリソースを管理しながらも滑らかなアニメーションを提供できます。

Composableのpause状態の検知方法

アニメーションの挙動をより細かく制御したい場合は、以下の方法でComposableのライフサイクル状態を検知できます。

2025年3月14日金曜日

Jetpack Compose: mutableStateOf の変更の検出の方法を変えるには

はじめに

Jetpack Composeで状態を管理する際に mutableStateOf をよく使うと思います。 その mutableStateOf を作成する際に、policy というパラメータを指定できることをご存知でしょうか?

val state = remember {
    mutableStateOf(initialValue, policy = structuralEqualityPolicy()) // policyを指定
}

この policy パラメータは、Stateオブジェクトの値が変更されたとみなす条件、つまり状態の変更をどのように検出するかを制御することができます。

policy を適切に設定することで不要な再コンポーズを避け、パフォーマンスを向上できる可能性があります。逆に policy を理解せずにデフォルトのまま使用していると、意図しない再コンポーズが発生しパフォーマンスに影響を与えるかもしれません。

この記事では、mutableStateOfpolicy で選択できる3つのポリシーを解説します。

mutableStateOfpolicy で選択できる3つのポリシー

mutableStateOfpolicy パラメータには以下の3つのポリシーを設定できます。

  1. structuralEqualityPolicy(): 構造的等価性ポリシー (デフォルト)
  2. referentialEqualityPolicy(): 参照的等価性ポリシー
  3. neverEqualPolicy(): 常に非等価ポリシー

それぞれ詳しく見ていきましょう。