首页 > 其他分享 >Android Compose 的导航(Navigation)

Android Compose 的导航(Navigation)

时间:2023-11-28 11:15:58浏览次数:32  
标签:info Compose 函数 val ViewModel Android 回调 Navigation 页面

基础知识

基本内容看官方吧: Android 使用 Compose 进行导航

B 回调数据给 A 内容

当您从 A 导航到 B 并且希望 B 将信息传回 A 时,您可以传递回调(此处onSelect):
有两者方法:自定义回调函数 and 使用相同ViewModel , 需要根据具体的应用场景和需求来选择适合的方法。

  • 如果仅需要简单的信息传递,回调函数可能是更直接和简单的选择。
  • 如果涉及到复杂的数据共享和状态管理,使用 ViewModel 可能更为合适和方便。

具体优缺点如下:
使用回调函数
优点:

  • 直接而简单:回调函数是一种直接的方式来传递信息,不需要引入额外的框架或组件。
  • 灵活性:可以通过定义不同的回调函数类型来传递不同类型的信息,适应不同的需求。
  • 易于理解和维护:回调函数的逻辑相对简单,易于理解和维护。

缺点:

  • 嵌套和管理:当存在多层回调时,可能需要嵌套回调函数,导致代码变得复杂。同时,需要仔细管理回调函数的生命周期和引用,以避免潜在的内存泄漏问题。

使用 ViewModel
优点:

  • 单一数据源:通过在共享的 ViewModel 中定义状态,可以实现页面间的数据共享和一致性。
  • 状态管理:ViewModel 提供了更好的状态管理机制,包括可观察的状态和状态更新的通知机制。
  • 生命周期感知:ViewModel 可以感知页面的生命周期,并确保数据在页面重建时正确保存和恢复。

缺点:

  • 引入依赖:使用 ViewModel 需要引入额外的依赖,例如 Jetpack Compose 中的 viewModel() 函数。
  • 需要关注作用域:需要注意 ViewModel 的作用域,以确保正确的共享和管理。

使用回调函数

:在页面 A 中定义一个回调函数,并将其作为参数传递给页面 B。页面 B 可以调用该回调函数并传递信息回到页面 A。
在页面 A 中:

// 定义回调函数类型
typealias OnInfoReturned = (info: String) -> Unit

// 导航到页面 B 并传递回调函数
val navigateToPageB: (OnInfoReturned) -> Unit = { onInfoReturned ->
    navController.navigate("pageB") {
        // 传递回调函数
        launchSingleTop = true
        popUpTo(navController.graph.startDestinationId) {
            inclusive = false
        }
        // 传递回调函数作为参数
        putSerializable("onInfoReturned", onInfoReturned as Serializable)
    }
}

在页面 B 中:

// 获取回调函数参数
val onInfoReturned = remember {
    // 从导航参数中获取回调函数
    arguments?.getSerializable("onInfoReturned") as? OnInfoReturned
}

// 在适当的时机调用回调函数
onInfoReturned?.invoke("返回的信息")

使用 ViewModel

在页面 A 和页面 B 中共享一个共享的 ViewModel,并在 ViewModel 中定义可观察的状态以传递信息。
在共享的 ViewModel 中:


class SharedViewModel : ViewModel() {
    private val _info = MutableStateFlow<String?>(null)
    val info: StateFlow<String?> = _info

    fun setInfo(info: String) {
        _info.value = info
    }
}

在页面 A 中:

val sharedViewModel: SharedViewModel = viewModel()

val navigateToPageB: () -> Unit = {
    navController.navigate("pageB") {
        launchSingleTop = true
    }
}

// 观察 ViewModel 中的状态
val info by sharedViewModel.info.collectAsState()

// 处理信息返回
LaunchedEffect(info) {
    info?.let { returnedInfo ->
        // 处理返回的信息
    }
}

在页面 B 中:

val sharedViewModel: SharedViewModel = viewModel()

// 设置信息并返回页面 A
sharedViewModel.setInfo("返回的信息")
navController.popBackStack()

标签:info,Compose,函数,val,ViewModel,Android,回调,Navigation,页面
From: https://www.cnblogs.com/kingwz/p/17861410.html

相关文章

  • Android app兼容低版本Java环境
    原文地址:Androidapp兼容低版本Java环境-Stars-One的杂货小窝起因是修复一个Bug遇到的问题,找到了一个可以让app兼容低版本java的方法众所周知,Android版本更新后,其内置的JRE环境也随之更新了假如我们在app中用到了JDK8的特有的属性,而用户的手机设备系统还是比较低,而没......
  • 35岁大限?Android程序员的蜕变与转型
    前言国内一直流传这一句名言——程序员的开发生命只到35岁!!于是转型就成为了国内程序员们最关注的话题之一。一般来说程序员生涯中的重大转型,大致分为三种类型:技术上转型、向管理转型、创业转型。在开发生涯中,每个程序员都至少会面临一次这样的机会和挑战,其中,有成功、有失败,关键是如......
  • Android WorkManager 初探
    前言总结和学习AndroidWorkManager的相关用法。WorkManager有什么特殊之处在日常开发中,有些任务需要在异步线程执行,并且这些工作耗时较长,通过普通的子线程或后台服务无法胜任时,就需要WorkManager了。WorkManager适用于需要可靠运行的工作,即使用户导航离开屏幕、退出应用或重......
  • Android Compose 使用Pager (with TabRow)
    Pager基本内容看官方吧:AndroidCompose中的分页器不同页显示不同内容错误示范@ComposableHorizontalPager(state=pagerState,modifier.fillMaxHeight(),beyondBoundsPageCount=2,verticalAlignment=Alignment.Top){if(pagerState.currentPage==0){//使......
  • 2048 ,Android 休闲益智游戏开发
    A.项目描述《2048》是一款经典的益智小游戏,它的目标是通过合并相同数字来达到2048这个最高分。该游戏规则简单,玩家需要通过滑动屏幕来移动方块,相同数字的方块会合并成一个新的数字方块。这样的简单操作让人可以轻松上手。《2048》小游戏app的技术原理主要涉及游戏逻辑、用户界面和......
  • 轻松实现海报换脸!相芯SDK海报换脸功能的简单集成方法(Android)
    相芯SDK的海报换脸功能是一种面部合成技术,允许用户将自己的脸部特征与指定的海报或图片进行合成,实现换脸的效果。该功能可以用于各种娱乐应用、社交媒体、相机应用和虚拟试妆等场景。1.功能介绍逼真和自然的换脸效果:相芯SDK使用先进的人脸识别和图像合成技术,确保换脸效果的逼真和......
  • Android对重启原因的记录
    事后log中,可以在prop.txt中获取到他们:./prop.txt:259:[persist.sys.boot.reason]:[]./prop.txt:260:[persist.sys.boot.reason.history]:[kernel_panic,bug,52663./prop.txt:789:[sys.boot.reason]:[kernel_panic,bug]./prop.txt:790:[sys.boot.reason.last]:[kernel_p......
  • Android 模拟器横向视图
    HowtochangeAndroidemulatortolandscapemode?ctrl + fn + F11 on Mac to change the landscape to portrait and vice versa.left-ctrl + F11 on Windows 7.ctrl + F11 on Linux.......
  • Android Intent打开指定网页【问题与方法】
    方法一.Intentintent; PackageManagerpackageMgr=getPackageManager(); intent=packageMgr.getLaunchIntentForPackage("com.android.chrome");intent.setPackage(null); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(......
  • Android Studio XML文件没有提示
    长路漫漫唯剑作伴原因:项目从AS3.5.2转到AS4.2.2后出现xml文件没有提示。解决:1.build:gradle:3.5.2换成最新的build:gradle:4.2.22.gradle-wrapper.properties由gradle-5.4.1-all.zip换成4.2.2最低要求版本gradle-6.7.1-all.zip项目下载构建完成即可......