2FA などいちいち iPhone を手にとって見るのが面倒すぎる。
iPhone 側の
[設定] - [アプリ] - [メッセージ]
から。
表示される転送先 Mac を ON に。
Apple ID で紐付いてるんだって。
2FA などいちいち iPhone を手にとって見るのが面倒すぎる。
iPhone 側の
[設定] - [アプリ] - [メッセージ]
から。
表示される転送先 Mac を ON に。
Apple ID で紐付いてるんだって。
なんか、いろんな方法があるんだなあ、と。
👉 Lifecycle を Compose と統合する | App architecture | Android Developers
👉 ComposeでLifecycleを監視する(2023年9月バージョン) - Kenji Abe - Medium
いろいろ試しながらどこから使っていくのがいいか。を考える。
調べてみると、
DisposableEffect を中心に考えるのがいいだろう、
と思える。
@Composable
fun LifecycleEffect(
onCreate: () -> Unit = { },
onStart: () -> Unit = { },
onResume: () -> Unit = { },
onPause: () -> Unit = { },
onStop: () -> Unit = { },
onDestroy: () -> Unit = { },
onAny: () -> Unit = { }
) {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Event.ON_CREATE -> onCreate()
Event.ON_START -> onStart()
Event.ON_RESUME -> onResume()
Event.ON_PAUSE -> onPause()
Event.ON_STOP -> onStop()
Event.ON_DESTROY -> onDestroy()
Event.ON_ANY -> onAny()
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}
@Composable
fun LifecycleEffect(
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
onStart: (suspend () -> Unit)? = null,
onPause: (suspend () -> Unit)? = null,
onStop: (suspend () -> Unit)? = null
) {
val scope = rememberCoroutineScope()
val currentOnStart by rememberUpdatedState(onStart)
val currentOnPause by rememberUpdatedState(onPause)
val currentOnStop by rememberUpdatedState(onStop)
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
scope.launch {
when (event) {
Lifecycle.Event.ON_START -> currentOnStart?.invoke()
Lifecycle.Event.ON_PAUSE -> currentOnPause?.invoke()
Lifecycle.Event.ON_STOP -> currentOnStop?.invoke()
else -> {}
}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}
@Immutable
enum class LifecycleEvent {
OnStop
}
@Immutable
data class LifecycleHandler(
val id: String,
val event: LifecycleEvent,
val onEvent: () -> Unit
)
@Composable
fun <R : Any> DestinationScope<R>.LifecycleEffect(
event: LifecycleEvent,
onEvent: () -> Unit
) {
val id = remember { randomUUID() }
DisposableEffect(this, id, event, onEvent) {
navigator.update {
it.copy(lifecycleHandlers = it.lifecycleHandlers + LifecycleHandler(
id = id,
event = event,
onEvent = onEvent
))
}
onDispose {
navigator.update { dest ->
dest.copy(lifecycleHandlers = dest.lifecycleHandlers.filter { it.id != id })
}
}
}
}
まずは、ここらから記述していくのがいいのではないか。
@Composable
@NonRestartableComposable
fun DisposableLifecycleEffect(
lifecycle: Lifecycle = LocalLifecycleOwner.current.lifecycle,
onResume: () -> Unit,
onPause: () -> Unit,
) {
DisposableEffect(lifecycle) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> onResume()
Lifecycle.Event.ON_PAUSE -> onPause()
else -> { }
}
}
lifecycle.addObserver(observer)
onDispose {
lifecycle.removeObserver(observer)
}
}
}
記述位置は Screen。
@NonRestartableComposable の意味を考えながら書く。
フォアグラウンド、バックグラウンドの切り分けにも使えるか。
Android Studio の更新や
プロジェクトの設定時に、
毎回設定しているのですが、
毎回忘れて調べているので。
👉 Android Studioでエディタでファイルを表示したらProject Viewでも表示する方法 #AndroidStudio - Qiita
Project View に設定の歯車ボタンがなくなってる!!
いつ変更になったか知らんが、
毎回探すのに苦労しますわ。
Project View
↓
右クリック
↓
Behavior
↓
Always Select Opened File
「shift → shift」 から「always」で調べると早い。
GUI操作の変更は調べづらい。