【问题标题】:Keep UI after emit state change Cubit Flutter发射状态更改后保持 UI Cubit Flutter
【发布时间】:2021-02-12 19:22:47
【问题描述】:

我的问题:当另一个状态被调用时,你能保留由一个状态构建的 UI 吗?

如果我使用了错误的肘形图案,请纠正我。我有一个我正在尝试解决的独特示例。我已经设置了cubit,它按照文档工作。

我有一个屏幕,其中有一个通过 cubit 返回的水平列表。然后根据返回的水平列表,如果您单击其中一个项目,cubit 会获取第二个列表以垂直显示在水平列表下方。

var _responseCategories = await _repository.postGetRootCategories();
      emit(ShowCategories(state, _responseCategories));
      var _responseCategoryItems = await _repository.postGetCategoryItems(_responseCategories[0].id);
      emit(ShowCategoriesItems(state, _responseCategoryItems));

ui 有一个 bloc builder 并处理这两种状态,但是当一个状态发生变化时,第一个构建状态的 UI 不存在我理解为什么会发生这种情况,但是有没有办法阻止它,直到我发出状态再次。 UI 对构建器中的状态进行如下解码:

return Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                if (state is ShowCategories) buildCategories(context, state),
                state is ShowCategoriesItems
                    ? Expanded(child: buildMenuItems(context, state))
                    : SizedBox.shrink(), //getMenuList(_activeSelection)),
             
              ],
            );

如果我使用这个错误是可以理解的,我只想知道是否有更好的解决方案来解决这个问题,因为每个类别的类别项目都不同,我不需要每次都获取类别状态变化。

该应用程序本质上是一个菜单。水平部分是菜单“我只需要加载一次”的类别,垂直部分是“我需要在用户选择类别时加载它们”的项目。每个类别的项目都不同,但除非服务器设置,否则类别永远不会改变。

【问题讨论】:

  • 您可以在两种状态下拥有相同的属性,因此即使状态发生变化,您也可以访问所需的值来构建 UI 元素。
  • @Hamed 在多个状态下复制信息不是不好的做法。如果我理解正确,没有更好的方法可以达到我想要的结果。
  • 我们使用引用对象没有数据重复。我们只是提供另一个州的信息。

标签: flutter dart bloc


【解决方案1】:

看起来你有一个主从视图,你的细节状态只是主无细节状态的超集。

您可以从主状态派生您的详细状态并向其添加更多信息(主列表,添加选定,详细信息列表到派生类),或者您可以只为两种状态使用一种状态(主列表, selected,details-list),其中有些东西没有被选择。

如果您的详细信息视图真的很复杂,您还可以为其创建一个全新的 BLoC,在小部件树中使用它自己的逻辑和构建器,然后您可以拥有完全不同的状态。

但是来自同一个 BLoC 的状态,您不能选择仅重建构建器下方的树的一部分。

(好吧,从技术上讲,你可以做任何事情,但围绕一个模式工作是没有意义的。如果它不适合,使用不同的模式。我认为你可以很容易地使它适合如上所述)

【讨论】:

  • 感谢您的信息。我会尝试您建议的一些要点@nvoigt
猜你喜欢
  • 2021-06-20
  • 2021-09-03
  • 2022-12-19
  • 2022-10-13
  • 2021-01-29
  • 2022-01-21
  • 2021-12-14
  • 2022-12-14
  • 1970-01-01
相关资源
最近更新 更多