android - Flow、Cicerone、Fragnav、Simple-stack 的特点是什么以及何时使用它们?
问题描述
我在我的应用程序中使用带有 3 个选项卡的 BottomNavigationView。我想实现类似导航的instagram,保存每个部分的片段状态。首先我使用了导航组件,但是很难保存每个选项卡(部分)的状态。然后我找到了一些库,如 flow、cicerone、fragnav、simple-stack。
flow、cicerone、fragnav、simple-stack 的特点是什么以及何时使用它们?
我有 2 个活动和 MainActivity。Mvvm 架构,dagger2,kotlin
解决方案
我看到这个问题有点晚了,我是 Simple-Stack 的维护者,通过一些精心的搜索发现了这个问题。
反正,
首先我使用了导航组件,但是很难保存每个选项卡(部分)的状态。
从技术上讲,他们制作了这么大的代码块,您可以包含这些代码,现在让您可以管理 N navHostFragments,因此在一个应用程序中有多个 backstacks。
我不确定它是否可以很好地扩展,但它确实可以跨越旋转和进程死亡。
square/flow
Flow 已死,Square 现在在 Workflow 上工作。
但 Flow 最初是一种跟踪屏幕列表[Screen1, Screen2]
并使其在配置更改和进程死亡后仍然存在的解决方案。它们还允许您以异步方式处理诸如[Screen1, Screen2]
->之类的更改[Screen1, Screen2, Screen3]
(完成后您必须调用完成回调)。
它有一些范围支持的元素。我试过了,但无法让它的这方面发挥作用。
西塞罗内
Cicerone 将导航命令排入队列,而没有人注册处理它们。
否则,它有一些开箱即用的导航命令,可以在一定程度上简化片段/活动导航。
弗拉格纳夫
FragNav 在构建时考虑了多堆栈支持。从理论上讲,它最多可以跟踪 5 个底部导航选项卡的片段堆栈。
简单堆栈
Simple-Stack 被编写为重写和替换square/flow
打算做的事情:1 堆栈,异步状态转换支持,排队导航操作,而没有人可以处理它们,在配置更改和进程死亡时保持/恢复导航状态。
Flow 和 Simple-Stack 之间的主要区别是:
API 命名约定(Flow 有一些棘手的名称,例如“Dispatcher”和“Traversal”,它们在简单堆栈中称为
StateChanger
andStateChange
)更简单的生命周期集成(不再覆盖
attachBaseContext
)全新的范围支持,能够在屏幕之间轻松共享数据,并在进程死亡期间保持/恢复这些“范围服务”的状态,同时获得有关创建/销毁的重要生命周期回调(有点像 ViewModels)
完成:流程保留为“alpha”版本,不再维护。
Flow 和 Simple-Stack 都是为了使 Single Activity 应用程序更易于开发而构建的。Jetpack Navigation 也是如此。
Jetpack Navigation 和 Simple-Stack 都允许创建“屏幕之间共享的范围”,JN 使用 navgraph-scoped viewmodels 来实现,而 SS 使用范围服务来实现。
无论如何,多堆栈有点痛苦,FragNav 直接支持开箱即用,simple-stack有一个示例(Jetpack Navigation 也有一个示例)。
选择任何一种似乎可以以最小的摩擦为您解决最多问题的工具。
推荐阅读
- ansible - ansible:主机特定剧本的最佳实践
- go - 使用 viper 定义 golang 程序配置时使用最大精度
- r - 如何通过检测可能的多个子字符串来匹配查找表,如将“US|USA|United States”与 R 中的 `abc,United States,xzy` 匹配?
- android - 有没有“资源重叠”?
- vba - Excel VBA登录时网站只允许手动输入ui/pw
- android - 迁移 Flutter android (API 29) 应用下载的媒体(图像、视频、PDF)以确认 Android 11 的范围存储(API 级别 30)
- ios - Swift - 应用程序跟踪透明度 - 由于“允许应用程序请求跟踪”灰显而没有显示弹出窗口
- python-3.x - 比较数据框python中具有相同列的不同行
- typescript - 为什么这个打字稿方法返回null?
- r - 在 data.table 中包含迭代循环的矢量化函数