gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:48 27 4
gpt4 key购买 nike

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

我想在从一个屏幕跳到另一个屏幕(至少向后)时保存和恢复屏幕状态。首选/推荐的方法是什么?

我花了很多时间查看 flow 和 mortar 自述文件和示例,但无法弄清楚(文档和示例很少,只处理简单/静态/唯一数据)。

例如,您有一个类似浏览器的应用程序,可以从一个页面移动到另一个页面,其中每个页面使用相同的相同 PageView 类、相同的 PagePresenter 类,但根据用户输入的 url 字符串具有不同的动态内容

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

我在谷歌上搜索了一下,偶然发现: https://github.com/lukaspili/flow-navigation

然而,这主要是一个实验......如果可能的话,我宁愿将我的生产赚钱应用程序建立在官方/可靠/测试/支持/由 square 支持的解决方案上

我也看了:

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

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

3) Mortar / Flow save view and presenter in backstack

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

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

public void restoreHierarchyState(View view) {
view.restoreHierarchyState(viewState);
}

当一个 View 被换出时,我们获取它的实例状态并将它设置在屏幕对象上(它已经在后台堆栈中)。在将其推广到库中之前,我们将使用这种模式一段时间。

但是flow样本和mortar样本都没有使用这个解决方案(他们使用dagger2注入(inject)列表...又不是一个有效的解决方案)

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

最佳答案

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

  1. Flow保存之前 View 的 View 状态,如果之前保存过,则尝试恢复新 View 的状态。
    至于 View 状态,我指的是 android View 状态,完全独立于 Flow。它不会保存与前一屏幕关联的迫击炮瞄准镜。
    您复制粘贴的代码 fragment 已在 Flow 中实现,并且完全符合我上面所说的。

  2. 使用 Flow-path,定义如何从屏幕 A 转到屏幕 B、如何设置从 A 到 B 的 View 转换动画以及如何设置/销毁 PathContext 的逻辑A 和 B 的包装器在 PathContainer 类中定义。

  3. PathContext 是 Fl​​ow-path 中的一个类,它设置与屏幕及其 View 关联的上下文(它是 android.content.Context 的包装器) ,与 Mortar 上下文包装器的工作方式相同)。您通常还会有一个自定义的 PathContextFactory,它由 PathContainer 调用,并设置与屏幕和 PathContext 关联的 Mortar 作用域。

  4. Flow-path 不提供任何 PathContainer 的“官方”实现。唯一的一个是示例项目中的 SimplePathContainer
    如果您查看 SimplePathContainer 的源代码,您会发现它破坏了与前一屏幕关联的路径上下文。通过销毁其上下文,它还会销毁其 Mortar 作用域以及其中的所有内容,例如包含 ViewPresenter 实例的 Dagger2 组件。

  5. 如果您想保留前一屏幕的 Mortar 作用域,唯一的方法是编写您自己的 PathContainer 实现,它不会破坏历史上先前的作用域。这就是 Flow-navigation ( https://github.com/lukaspili/flow-navigation) 的基本功能。

  6. StateParceler 用于在 Bundle 中保存/恢复流历史堆栈。正如你所说,它的目的是让历史在配置更改和应用程序进程终止时存活下来。
    但是,通过正确的 Mortar 配置,Mortar 范围在配置更改期间不会被破坏,因此,您不需要保存/恢复您的 ViewPresenter 实例,因为这些实例不会被破坏(只有 View )。不过,您仍然必须为进程终止执行此操作。

现在我的 2cents:

Flow-navigation 是第一个不破坏历史上先前屏幕(backstack)的迫击炮范围的概念证明。
从那时起,我从头开始编写了一个替代的 Flow 库,它处理导航、管理 Mortar 范围的历史记录并以更适合我的需求的解耦方式提供 View 转换:https://github.com/lukaspili/Mortar-architect

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

关于android - 使用 Flow + Mortar + Dagger 2 保存/恢复屏幕状态的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31021429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com