android 如何使用Navigation Compose将数据从Activity的onNewIntent()发送到屏幕的VM?

j9per5c4  于 2022-12-25  发布在  Android
关注(0)|答案(1)|浏览(264)

我正在使用Jetpack Compose和Navigation Compose开发一个Android应用程序。该应用程序是一个多模块应用程序,由使用导航库导航到不同屏幕的单个Activity组成。我目前正在通过单点登录实现登录(SSO),使用Chrome自定义选项卡。当用户成功登录且应用收到包含必要数据的深度链接时,我可以从主Activity的Intent中检索这些数据,但是,我不知道如何将这些数据转发到当前显示的登录屏幕的视图模型。
我希望有一个通用的解决方案来将通过深度链接Intent提供的数据发送到当前显示的屏幕的ViewModel,无论它是哪个屏幕。是否有一个等效的onNewIntent()的导航合成,可用于将数据发送到屏幕上的当前目标?我尝试使用launchSingleTop导航到相同的目标,但我不知道如何将数据发送到VM。

wgmfuz8q

wgmfuz8q1#

您可以通过保留生命周期观察器的DiposableEffect并检查启动回调来访问登录屏幕中的Intent、主编写函数,当我们将Activity launchMode="singleTask"保留在清单中时,onNewIntent将触发。

val context = LocalContext.current
val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
//handle deepLinks/noti. in home screen
DisposableEffect(lifecycleOwner) {
   
   
    // Create an observer that triggers our remembered callbacks
    // for sending analytics events
    val observer = LifecycleEventObserver { _, event ->
        if (event == Lifecycle.Event.ON_START) {
           val activity = context.findActivity()
    val intent = activity?.intent
    val destination = intent?.getStringExtra("destinationScreen")
    val queryParameter = intent?.data?.getQueryParameter("destinationScreen")
           //send this data to your viewmodel
        }
    }

    // Add the observer to the lifecycle
    lifecycleOwner.lifecycle.addObserver(observer)

    // When the effect leaves the Composition, remove the observer
    onDispose {
        lifecycleOwner.lifecycle.removeObserver(observer)
    }
}

下面是findActivity扩展函数。

fun Context.findActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null

}

相关问题