Android navigation组件

本文介绍了Android Navigation组件的用途,强调了它在组织和管理页面跳转中的优势,如数据共享和状态管理。通过一个包含登录页和详情页的demo,详细讲解了如何导入、设计导航图、设置目的地以及传递数据。还提到了处理返回事件和页面状态的问题,并提供了官方资源链接。
摘要由CSDN通过智能技术生成

lzyprime 博客 (github)
创建时间:2020.11.24
qq及邮箱:2383518170

kotlin & android 笔记


λ:

navigation 组件Android Jetpack重要组成部分,推出3年左右,2018谷歌I/O大会也曾介绍过。主要用于组织Fragment,通过Fragment来实现不同内容片段的显示。包括同级之间切换,不同级之间跳转(如 列表item跳详情页),代替以往跳转Activity的方式,推出单Activity模式

navigation 官网地址

Activity相比好处:

  1. 拿到同一份Activity ViewModelViewModelActivity为单位共享,同一Activity下的Fragment可以拿到同一份ViewModel,所以如果直接跳转Activity数据共享要自己解决,传递或者全局缓存里取,同时还要考虑副本一致性,也就是我在一个页面修改数据,其他用到此数据的页面也应该同步修改。

flutter Navigator1.0里以Route组织页面,用Provider插件实现状态管理时,除非把Provider包在的MaterialApp的外层,否则,跳转其他Route就无法通过Provider.of(context)获取,数据处理就如同Android Activity, 包在最外层好使是因为MaterialApp生成时会构造一个Navigator来组织所有页面。通过List<_RouteEntry> _historyGlobalKey<OverlayState> _overlayKey保存信息。所以所有页面都是MaterialApp的子节点。

最近的flutter 1.22推出Navigator2.0, 可以用List<Page<dynamic>> pages组织页面,也就类似Android navigation组件,flutter Page好比Android Fragment

  1. 导航图可以靠可视化工具拖框完成。每一个页面称作“目的地”, 通过之间连线、设置参数来实现页面跳转约束,同时可以设置过渡动画等。所有导航资源存在资源文件夹下的navigation文件夹里。也支持Kotlin DSL代码完成导航设置。

  2. Safe Args传递数据。Safe Arges 官网地址。保证安全的传递数据。

有句话: ***“通常情况下,强烈建议您仅在目的地之间传递最少量的数据。例如,您应该传递键来检索对象而不是传递对象本身,因为在 Android 上用于保存所有状态的总空间是有限的。”***, 这同样适用于flutter。在flutter里并没有太好的副本一致性方案,所以我在Bean也就是数据解析时做了缓存,同一数据只会构造一次,之后全从缓存中取或者更新。利用factory构造函数将数据缓存、生成、更新、获取等操作隐形,达到简单的Loc的效果。(TODO: 有空再总结)

需要注意:

  1. 系统返回按钮和事件的处理。跳转Fragment时,要拦截并设置好Activity的返回按钮事件,否则整个Activity就关闭了。同时其他组件的状态更新也需要自己维护, 参考:使用 NavigationUI 更新界面组件

这个问题在flutter Navigator2.0里同样存在。

  1. 同级Fragment切换需要重新构建,并不记录状态。通过把当前的FragmentManager交给navigation来实现页面切换时,每切换一次都要重建Fragment

demo: 添加登录页,详情页

从之前demo继续开发。

# android navigation demo
# 仓库地址: https://github.com/lzyprime/android_demos
# branch: navigation

git clone -b navigation https://github.com/lzyprime/android_demos

1. 导入

使用入门 官网地址

如果用Safe Args则要在最顶层引入插件,或者用Bundle代替Safe Args实现传递

// project gradle
buildscript {
    repositories {
        google()
    }
    // Safe Args
    dependencies {
        ...
        def nav_version = "2.3.1"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}
// module gradle
plugin {
    ...

    id "androidx.navigation.safeargs.kotlin"
}

dependencies {
    ...

    // navigation
    def nav_version = "2.3.1"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    // Feature module Support
    //implem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值