繁体   English   中英

Flutter Bloc Todo 示例 - 收听存储库中的单个 todo

[英]Flutter Bloc Todo example - Listen to a single todo from the repository

我正在学习 Bloc 库中的 Flutter 和 BLoC 模式。 我想我只是理解 Todo 的例子,但我正试图在它的基础上做一些更复杂的事情,而且我碰壁了。

所以,我的问题是这个。 让我们考虑 Todo 示例https://bloclibrary.dev/#/fluttertodostutorial

与该页面上的(可能已过时的)GIF animation 所代表的相反,当您单击待办事项时,您不会进入“待办事项详细信息”页面,然后您可以从中 go 到“编辑待办事项”页面。 您只需一步即可直接进入编辑页面:

Todo list -> Edit todo

我想要做的是在 animation 中看到“两步”流程:

Todo list -> Todo details -> Edit todo

因此,在代码中,实际的“一步”流程是这样工作的:当您单击一个待办事项时,您会被带到拥有自己的 EditTodoBloc 的 EditTodoPage。 该 Bloc 使用您单击的 todo 进行初始化,但以“普通”方式,只需传递 todo 的 model ( initialTodo )。

  // in EditTodoPage
  static Route<void> route({Todo? initialTodo}) {
    return MaterialPageRoute(
      fullscreenDialog: true,
      builder: (context) => BlocProvider(
        create: (context) => EditTodoBloc(
          todosRepository: context.read<TodosRepository>(),
          initialTodo: initialTodo,
        ),
        child: const EditTodoPage(),
      ),
    );
  }

这意味着 EditTodoBloc 对待办事项的更改没有“反应性”。 这是因为 EditTodoPage 是唯一更新 todo 的地方,所以它可以有自己的 state。 然后当待办事项被保存时,它会保存在存储库中,然后您将返回到列表,该列表通过存储库和 stream 和所有内容进行响应。

但是你将如何调整它以适应“两步”流程? 天真的解决方案可能是对两个页面使用相同的 Bloc,但为了争论(并且因为每页有一个 Bloc 似乎是一种好习惯),假设我们想要一个 TodoDetailsBloc 用于详细信息页面和一个EditTodoBloc 用于编辑页面。 在编辑页面上所做的编辑现在必须反映在详细信息页面上,因此我们不能天真地将 todo model 传递给集团。

这两个集团是否应该从存储库中收听新的 stream ? 一个 stream 只会返回那个特定的 Todo? 我不确定 stream 将如何以及何时创建以及它的生命周期是什么; 而且我不确定存储库是否关心这样做。 或者也许这两个集团应该通过事件直接相互交流? 但对我来说,这似乎破坏了自上而下的存储库块小部件数据流。

那么,在实践中会是什么样子呢?

或者,如果你有一个我可以研究的(稍微)更复杂的应用程序的好例子,我也很乐意接受。

谢谢:)

这些固执己见的问题是设计选择的一部分,并且在很大程度上取决于您要实现的目标。 以下只是我的看法:

  1. 看起来 Todo 示例膨胀了整个软件架构(对于一个非常简单的应用程序),只是为了演示如何在代码库中的任何地方应用 bloc 模式。
  2. 但是你将如何调整它以适应“两步”流程? 我什至不会为 Todo 创建多个区块。 只需一个带有多个 TodoEvents(AddTodoEvent、EditTodoEvent、DeleteTodoEvent,...)的 TodoBloc 就足够了。 拥有更多的集团和事件只会导致更多的样板。
  3. (并且因为每页有一个 Bloc 似乎是一个好习惯) 并不真地。 一个块应该包含与一个业务逻辑相关的所有内容(因此名称 BLoC = 业务逻辑组件)。 您希望将哪个业务逻辑合并为一个集团,以及您希望拆分哪个业务逻辑,这完全取决于您。 但是这些决策应该依赖于业务逻辑本身,UI 和应用程序的其他层都不应该影响它们。 对于这个例子,我会将 Todo 视为一个整体。
  4. 在编辑页面上所做的编辑现在必须反映在详细信息页面上,因此我们不能天真地将 todo model 传递给集团。 有几种方法可以解决这个问题。 TodoDetailsPage 总是可以要求最新版本的 Todo。 另一种方法是在编辑页面内使用 TodoDetailsBloc 和 EditTodoBloc。 拥有单独的集团并不意味着您不允许在一页上与多个集团交谈。
  5. 这两个集团是否应该从存储库中收听新的 stream ? 一个 stream 只会返回那个特定的 Todo? 并非如此,因为返回新编辑的 Todo 不应该是存储库的工作。 存储库仅用于保存、更新和删除事务。
  6. 或者也许这两个集团应该通过事件直接相互交流? 一点也不。 Bloc应该始终独立工作。 如果您真的认为两个或更多应该相互通信,那么您应该考虑将它们合并为一个集团。

我希望我能帮助你。 请记住,这些答案更多地基于意见。 没有正确和错误的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM