lzyprime 博客 (github)
创建时间:2020.11.24
qq及邮箱:2383518170
kotlin & android 笔记
λ:
navigation 组件
是 Android Jetpack
重要组成部分,推出3年左右,2018谷歌I/O大会也曾介绍过。主要用于组织Fragment
,通过Fragment
来实现不同内容片段的显示。包括同级之间切换,不同级之间跳转(如 列表item跳详情页),代替以往跳转Activity
的方式,推出单Activity模式
。
与Activity
相比好处:
- 拿到同一份
Activity ViewModel
。ViewModel
以Activity
为单位共享,同一Activity
下的Fragment
可以拿到同一份ViewModel
,所以如果直接跳转Activity
数据共享要自己解决,传递或者全局缓存里取,同时还要考虑副本一致性,也就是我在一个页面修改数据,其他用到此数据的页面也应该同步修改。
flutter Navigator1.0
里以Route
组织页面,用Provider
插件实现状态管理时,除非把Provider
包在的MaterialApp
的外层,否则,跳转其他Route
就无法通过Provider.of(context)
获取,数据处理就如同Android Activity
, 包在最外层好使是因为MaterialApp
生成时会构造一个Navigator
来组织所有页面。通过List<_RouteEntry> _history
和GlobalKey<OverlayState> _overlayKey
保存信息。所以所有页面都是MaterialApp
的子节点。最近的
flutter 1.22
推出Navigator2.0
, 可以用List<Page<dynamic>> pages
组织页面,也就类似Android navigation
组件,flutter Page
好比Android Fragment
-
导航图可以靠可视化工具拖框完成。每一个页面称作“目的地”, 通过之间连线、设置参数来实现页面跳转约束,同时可以设置过渡动画等。所有导航资源存在资源文件夹下的
navigation
文件夹里。也支持Kotlin DSL
代码完成导航设置。 -
Safe Args
传递数据。Safe Arges 官网地址。保证安全的传递数据。
有句话: ***“通常情况下,强烈建议您仅在目的地之间传递最少量的数据。例如,您应该传递键来检索对象而不是传递对象本身,因为在 Android 上用于保存所有状态的总空间是有限的。”***, 这同样适用于
flutter
。在flutter
里并没有太好的副本一致性方案,所以我在Bean
也就是数据解析时做了缓存,同一数据只会构造一次,之后全从缓存中取或者更新。利用factory
构造函数将数据缓存、生成、更新、获取等操作隐形,达到简单的Loc
的效果。(TODO: 有空再总结)
需要注意:
- 系统返回按钮和事件的处理。跳转
Fragment
时,要拦截并设置好Activity
的返回按钮事件,否则整个Activity
就关闭了。同时其他组件的状态更新也需要自己维护, 参考:使用 NavigationUI 更新界面组件
这个问题在
flutter Navigator2.0
里同样存在。
- 同级
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