0
0

More than 1 year has passed since last update.

onNewIntentで状態を更新する(Jetpack Compose)

Posted at

はじめに

Jetpack Composeを使用している状況でActivityのonNewIntentonActivityResultでアプリの画面状態を更新する方法についての記事となります。
Jetpack Composeでは状態をMutableStateとして保持し、rememberを使用することで再Compose後も状態を保持することができます。ただしこれら基本的に特定のComposable関数以下のスコープ内に制限されてしまい、onNewIntentonActivityResultからどうやって更新すればいいんや~だったたのでコードを書いてみたという流れになります。

やったこと

方針としてはMutableStateをActivityのメンバとして保持し、その値をrememberでComposable関数に記憶させます。

1.Activityのメンバ変数にMutableStateで変数を持たせる。
ここで定義した値をonNewIntentonActivityResultで更新し、それらを読みこむComposable関数を更新させる算段です。

class MainActivity : ComponentActivity() {
  private val _message = mutableStateOf("initial message")
}

2.rememberで再Compose後も状態を保持する。

class MainActivity : ComponentActivity() {
 // 他省略
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
      val message by remember { _message }
      Text(text = message)
    }
  }
}

3.onNewIntentMutableStateを更新する。

class MainActivity : ComponentActivity() {
  // 他省略
  override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    _message.value = "onNewIntent"
  }
}

結果

  • onCreateの後にonNewIntentを呼び出しています。 Animation.gif

感想

結構簡単にできました。

ちなみに自分はほかのアプリから明示的Intentで起動できるアプリを作成しており、onNewIntentで値をもらってUIに反映するということがしたかったという背景があります。
またonNewIntentを呼ぶにはActivityのLaunchModelsingleTaskなどになるようにあらかじめ設定してあげましょう。

それと、今回の場合rememberは使わなくても良いのでしょうかね。rememberはComposition前後で値を保持し続けるための処理ですが、今回の場合値をメンバで保持しているため、rememberがなくても値は取得できていました。

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0