首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter Todo示例-听存储库中的单个todo

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

Stack Overflow用户
提问于 2022-09-13 22:37:00
回答 1查看 172关注 0票数 3

我正在从BLoC库学习颤振和Bloc模式。我想我大概能理解Todo的例子,但是我试图在它的基础上做一些更复杂的事情,我撞到了一面墙。

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

与页面上(可能已经过时的) GIF动画所代表的相反,当您单击Todo时,您不会得到一个" todo“页面,然后您可以从该页面转到一个"Edit”页面。只需一步就可以直接进入编辑页面:

代码语言:javascript
运行
复制
Todo list -> Edit todo

我想做的是让动画中可以看到的“两步”流:

代码语言:javascript
运行
复制
Todo list -> Todo details -> Edit todo

因此,在代码中,实际的“一步”流是这样工作的:当您单击一个todo时,您会被带到EditTodoPage,它有自己的EditTodoBloc。这个块是通过您单击的todo初始化的,但是通过传递todo (initialTodo)的模型就可以以“普通”的方式进行初始化。

代码语言:javascript
运行
复制
  // 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的地方,所以它可以拥有自己的状态。然后,在保存todo时,将其保存在存储库中,然后将您带回到列表,该列表是通过存储库和流以及所有内容进行反应的。

但是你会如何调整它来处理“两步”流程呢?天真的解决方案可能是对两个页面使用相同的Bloc,但出于论证的考虑(而且由于每个页面拥有一个Bloc似乎是一个很好的实践),假设我们希望为details页面使用一个TodoDetailsBloc,对编辑页面使用一个EditTodoBloc。编辑页面上的编辑现在必须反映在细节页面上,所以我们不能天真地将todo模型传递给块。

这两个块是否应该监听存储库中的一个新流?一条只会返回特定东藤的溪流?我不确定如何、何时创建该流,以及它的生命周期是什么;我也不确定存储库是否需要这样做。或者这两个集团是否应该通过事件直接沟通?但在我看来,这似乎破坏了良好的自上而下的存储库-集团-小部件数据流。

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

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

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-14 00:39:51

这种固执己见的问题是设计选择的一部分,在很大程度上取决于你想要达到的目标。以下是我的看法:

  1. 这个例子似乎膨胀了整个软件体系结构(对于一个非常简单的应用程序),只是为了演示如何在您的代码库中的任何地方应用集群模式。
  2. ,但是您将如何调整它来处理“两步”流呢?我甚至不会为Todo创建多个块。只有一个TodoBloc与多TodoEvents (AddTodoEvent,EditTodoEvent,DeleteTodoEvent,.)就够了。拥有更多的块和事件只会导致更多的boilerplate.
  3. (and,因为每页拥有一个块似乎是一个很好的实践)。不怎么有意思。一个集团应该包含与一个业务逻辑相关的所有内容(因此名为bloc =)。这完全取决于你想要把哪个业务逻辑合并为一个集团,而你更愿意分裂哪个集团。但是这类决策应该依赖于业务逻辑本身,无论是UI还是应用程序的其他层都不应该影响它们。对于这个例子,我认为Todo是一个整体,
  4. 编辑页面上的编辑现在必须反映在details页面上,所以我们不能只是天真地将todo模型传递给块。解决这个问题有几种方法。TodoDetailsPage总是可以要求得到最新版本的Todo。另一种方法是在编辑页面中使用TodoDetailsBloc和EditTodoBloc。拥有单独的块并不意味着不允许在一个页面上与多个块对话。

  1. ,这两个块应该监听存储库中的一个新流吗?一条只会返回特定东藤的溪流?并不是因为返回新编辑的Todo不应该是存储库的工作。存储库仅用于保存、更新和删除transactions.
  2. Or,也许这两个块应该通过事件直接通信吗?不用谢。集团的工作应该总是独立的。如果你真的认为两个或更多人应该相互交流,那么你应该考虑把他们合并成一个集团。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73709769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档