2021年5月28日金曜日

Jetpack Compose : Lifecycle.Event で処理をトリガーする

通知が有効になっているかどうか調べる処理 (NotificationManagerCompat.from(context).areNotificationsEnabled()) を毎 onResume で行い場合はこんな感じになる。
  1. @Composable  
  2. fun SampleScreen(  
  3.     notificationEnabled: Boolean,  
  4.     onCheckNotification: () -> Unit  
  5. ) {  
  6.     val lifecycleObserver = remember(onCheckNotification) {  
  7.         LifecycleEventObserver { _, event ->  
  8.             if (event == Lifecycle.Event.ON_RESUME) {  
  9.                 onCheckNotification()  
  10.             }  
  11.         }  
  12.     }  
  13.     val lifecycle = LocalLifecycleOwner.current.lifecycle  
  14.     DisposableEffect(lifecycle) {  
  15.         lifecycle.addObserver(lifecycleObserver)  
  16.         onDispose {  
  17.             lifecycle.removeObserver(lifecycleObserver)  
  18.         }  
  19.     }  
  20.   
  21.     if (!notificationEnabled) {  
  22.         Text("通知設定がオフです")  
  23.     }  
  24. }  
state hoisting だとこんな感じだけど、引数 ViewModel にするならこんな感じ。
  1. @Composable  
  2. fun SampleScreen(  
  3.     viewModel: SampleViewModel = viewModel(),  
  4. ) {  
  5.     val lifecycleObserver = remember(viewModel) {  
  6.         LifecycleEventObserver { _, event ->  
  7.             if (event == Lifecycle.Event.ON_RESUME) {  
  8.                 viewModel.updateNotificationEnabledState()  
  9.             }  
  10.         }  
  11.     }  
  12.     val lifecycle = LocalLifecycleOwner.current.lifecycle  
  13.     DisposableEffect(lifecycle) {  
  14.         lifecycle.addObserver(lifecycleObserver)  
  15.         onDispose {  
  16.             lifecycle.removeObserver(lifecycleObserver)  
  17.         }  
  18.     }  
  19.   
  20.     if (!viewModel.notificationEnabled.value) {  
  21.         Text("通知設定がオフです")  
  22.     }  
  23. }  



0 件のコメント:

コメントを投稿