使用Flow + Mortar + Dagger2保存/恢复屏幕状态的首选方法是什么?

Lak*_*mon 3 android flow mortar dagger-2

我正在尝试将Acticity + Fragments应用程序转换为Flow + Mortar + Dagger2

我想在从屏幕跳到屏幕(至少向后)时保存和恢复屏幕状态.最喜欢/推荐的方法是什么?

我花了很多时间查看流量和灰浆自述文件和样本,但无法弄明白(文档和样本很少,只处理简单/静态/唯一数据).

比方说,例如,你有一个类似浏览器的应用程序从页面移动到页面每个页面使用相同的PageView类,相同的PagePresenter类但具有不同的动态内容,具体取决于用户键入的url-string

使用Dagger2(编译类型注释)通过注入保存/恢复状态是相当复杂/困难的,对吧​​?(这需要复杂的父/缓存结构)

我google了一下,偶然发现:https: //github.com/lukaspili/flow-navigation

然而,这主要是一个实验......如果可能的话,我宁愿将我的生产资金建立在官方/可靠/测试/支持/支持的解决方案上

我也看了看:

1)https://github.com/square/flow/issues/11 但是样本使用Dagger在2个具有不同视图类别的屏幕中注入数据(不是有效答案)

2)https://github.com/square/flow/issues/76(没有回答)

3)迫击炮/ Flow保存视图和后台中的演示者

我也看到了这一点:我们现在通过向屏幕对象添加一个可变字段来内部执行此操作:

public void setViewState(SparseArray<Parcelable> viewState) {
this.viewState = viewState;
}

public void restoreHierarchyState(View view) {
view.restoreHierarchyState(viewState);
}
Run Code Online (Sandbox Code Playgroud)

当换出视图时,我们获取其实例状态并将其设置在屏幕对象(已经在backstack上)上.在将它推广到图书馆之前,我们将使用这种模式一段时间.

但是流动样本和迫击炮样本都没有使用这个解决方案(他们使用dagger2来注入列表......不再是有效的解决方案)

那么,在迫击炮+流量(+ dagger2)应用程序中恢复/保存屏幕状态的最佳日期 /推荐方法是什么?

luk*_*kas 14

首先是关于Flow&Flow-path的一些事实

  1. Flow保存上一个视图的视图状态,并尝试恢复先前保存的新视图的状态.
    并且通过视图状态,我的意思是android视图状态,完全独立于Flow.它不保存与上一屏幕关联的Mortar范围.
    您复制粘贴的代码片段已经在Flow中实现,并且正如我上面所说的那样.

  2. 使用Flow-path,定义如何从屏幕A转到屏幕B的逻辑,如何设置从A到B的视图转换动画,以及如何设置/破坏PathContextA和B的包装,在PathContainer类中定义.

  3. PathContext是一个来自Flow-path的类,它设置与Screen及其View相关联的上下文(它是一个包装器android.content.Context,与Mortar上下文包装器的工作方式相同).您通常还会有一个自定义的自定义PathContextFactory,PathContainer它会设置与屏幕关联的Mortar范围和PathContext.

  4. 流路径不提供任何"官方"实施PathContainer.唯一的一个是SimplePathContainer示例项目.
    如果查看源代码SimplePathContainer,您将看到它破坏了与先前screeen关联的路径上下文.通过破坏其上下文,它还会破坏其Mortar范围以及内部的所有内容,例如包含ViewPresenter实例的Dagger2组件.

  5. 如果要保留上一个屏幕的Mortar范围,执行此操作的唯一方法是编写自己的实现,PathContainer而不会破坏历史记录中的先前范围.这基本上就是Flow-navigation(https://github.com/lukaspili/flow-navigation).

  6. StateParceler用于保存/恢复流历史堆栈Bundle.正如你所说,它的目的是使历史在配置更改和应用程序进程中消失.
    但是,使用正确的Mortar配置,Mortar范围在配置更改期间不会被销毁,因此,您不需要保存/恢复ViewPresenter实例,因为这些实例不会被销毁(仅限视图).你仍然需要为进程杀死做这件事.

现在我的2cents:

流动导航是不破坏历史上前一屏幕迫击范围(背斜)的概念的第一个证据.
从那时起,我从头开始编写了一个替代Flow库,它处理导航,管理Mortar范围的历史记录,并以一种解耦方式提供视图转换,以满足我的需求:https://github.com/lukaspili/Mortar-architect

因为您正在寻找Square支持和支持的解决方案,所以这对您不起作用.但是,我邀请您查看源代码,这可能会让您了解如何编写自己的源代码,以PathContainer保留Flow历史记录中的Mortar范围.