我正在从BLoC库学习颤振和Bloc模式。我想我大概能理解Todo的例子,但是我试图在它的基础上做一些更复杂的事情,我撞到了一面墙。
所以我的问题是。让我们考虑Todo示例https://bloclibrary.dev/#/fluttertodostutorial
与页面上(可能已经过时的) GIF动画所代表的相反,当您单击Todo时,您不会得到一个" todo“页面,然后您可以从该页面转到一个"Edit”页面。只需一步就可以直接进入编辑页面:
Todo list -> Edit todo我想做的是让动画中可以看到的“两步”流:
Todo list -> Todo details -> Edit todo因此,在代码中,实际的“一步”流是这样工作的:当您单击一个todo时,您会被带到EditTodoPage,它有自己的EditTodoBloc。这个块是通过您单击的todo初始化的,但是通过传递todo (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的地方,所以它可以拥有自己的状态。然后,在保存todo时,将其保存在存储库中,然后将您带回到列表,该列表是通过存储库和流以及所有内容进行反应的。
但是你会如何调整它来处理“两步”流程呢?天真的解决方案可能是对两个页面使用相同的Bloc,但出于论证的考虑(而且由于每个页面拥有一个Bloc似乎是一个很好的实践),假设我们希望为details页面使用一个TodoDetailsBloc,对编辑页面使用一个EditTodoBloc。编辑页面上的编辑现在必须反映在细节页面上,所以我们不能天真地将todo模型传递给块。
这两个块是否应该监听存储库中的一个新流?一条只会返回特定东藤的溪流?我不确定如何、何时创建该流,以及它的生命周期是什么;我也不确定存储库是否需要这样做。或者这两个集团是否应该通过事件直接沟通?但在我看来,这似乎破坏了良好的自上而下的存储库-集团-小部件数据流。
那么,这在实践中会是什么样子?
或者,如果你有一个好的例子,一个(稍微)更复杂的应用程序,我可以学习,我也很乐意接受。
谢谢:)
发布于 2022-09-14 00:39:51
这种固执己见的问题是设计选择的一部分,在很大程度上取决于你想要达到的目标。以下是我的看法:
,
我希望我能帮到你。请记住,这些答案更多的是基于意见。没有正确和错误的答案。
https://stackoverflow.com/questions/73709769
复制相似问题