[英]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 将如何以及何时创建以及它的生命周期是什么; 而且我不确定存储库是否关心这样做。 或者也许这两个集团应该通过事件直接相互交流? 但对我来说,这似乎破坏了自上而下的存储库块小部件数据流。
那么,在实践中会是什么样子呢?
或者,如果你有一个我可以研究的(稍微)更复杂的应用程序的好例子,我也很乐意接受。
谢谢:)
这些固执己见的问题是设计选择的一部分,并且在很大程度上取决于您要实现的目标。 以下只是我的看法:
我希望我能帮助你。 请记住,这些答案更多地基于意见。 没有正确和错误的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.