我在具有3个标签的应用程序中使用BottomNavigationView。我想像导航一样实现instagram,保存每个部分的片段状态。首先,我使用了导航组件,但是很难保存每个选项卡(部分)的状态。然后我找到了一些库,例如流程库,cicerone库,fragnav库,简单堆栈库。
流量,西塞隆,fragnav,简单堆叠的特点以及何时使用它们?
我有2个活动和MainActivity。 Mvvm架构,dagger2,kotlin
我看到这个问题有点晚了,我是Simple-Stack的维护者,并且通过一些精心的搜索发现了这个问题。
无论如何
首先,我使用导航组件,但是很难保存每个选项卡(部分)的状态。
[从技术上讲,他们制作了this large block of code,您可以包含它,现在可以管理N个navHostFragments,因此在一个应用程序中具有多个后置堆栈。
不确定它是否可以很好地缩放,但是它确实可以在轮换和死亡过程中起作用。
square/flow
流程已死,Square现在可以在工作流程上工作。
但是Flow最初是一种跟踪屏幕列表[Screen1, Screen2]
的解决方案,并使该配置在配置更改和过程终止后仍然有效。他们还允许您以异步方式处理诸如[Screen1, Screen2]
-> [Screen1, Screen2, Screen3]
之类的更改(完成后必须调用完成回调)。
它具有范围界定支持的某些元素。
Cicerone
Cicerone排队导航命令,但没有人注册处理它们。
否则,它具有一些开箱即用的导航命令,可以在某种程度上简化片段/活动导航。
Fragnav
FragNav在构建时就考虑了多堆栈支持。从理论上讲,它最多跟踪5个底部导航选项卡的片段堆栈。
简单堆栈
简单堆栈被编写为square/flow
的重写和替代:1个堆栈,异步状态转换支持,使导航操作排队,而没有人可以处理它们,在配置更改和过程中持久/恢复导航状态死亡。
Flow和Simple-Stack之间的主要区别是:
API命名约定(Flow具有一些棘手的名称,例如“ Dispatcher”和“ Traversal”,它们在简单的堆栈中称为StateChanger
和StateChange
)
更简单的生命周期集成(不再覆盖attachBaseContext
)
[Jetpack Navigation和Simple-Stack都允许创建“屏幕之间共享的范围”,JN使用navgraph范围的视图模型来完成,而SS则使用范围服务来进行。
无论如何,多堆栈都是一件痛苦的事情,FragNav开箱即用地直接支持它,而简单堆栈has a sample for it(Jetpack Navigation也为has a sample for it。