我正在学习Flutter 翼和积木图案从积木图书馆.我想我差不多理解了TODO的例子,但我正试图在它的基础上做一些稍微复杂一点的事情,但我遇到了困难.
所以,我的问题是.让我们考虑一下TODO示例https://bloclibrary.dev/#/fluttertodostutorial
与该页面上的GIF动画(可能已过时)所代表的情况相反,当你点击待办事项时,你不会进入"待办事项详细信息"页面,然后你可以转到"编辑待办事项"页面.您只需一步即可直接进入编辑页面:
Todo list -> Edit todo
我想要做的是让动画中可以看到的"两步走"流程:
Todo list -> Todo details -> Edit todo
因此,在代码中,实际的"一步"流是这样工作的:当您单击一个待办事项时,您将被带到EditTodoPage,它有自己的EditTodoBloc.此块使用您单击的待办事项进行初始化,但以一种"简单"的方式,只需传递待办事项(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不会对待办事项的更改做出"react ".这是可行的,因为EditTodoPage是唯一更新待办事项的位置,因此它可以只有自己的状态.然后,当保存TODO时,它被保存在存储库中,并且您将被带回列表,该列表通过存储库、流和一切进行react .
但您将如何调整它以适应"两步走"的流程?天真的解决方案可能是对两个页面使用相同的BLOC,但为了便于讨论(因为每页有一个BLOC似乎是一种良好的做法),我们假设详细信息页面需要一个TodoDetailsBloc,编辑页面需要一个EditTodoBloc.在编辑页面上所做的编辑现在必须反映在详细信息页面上,所以我们不能只是天真地将TODO模型传递给模块.
这两个块是否应该监听来自存储库的新流?一条只会返回特定TODO的流?我不确定如何以及何时创建该流,以及它的生命周期是什么;我也不确定这样做是否与存储库有关.或者,这两个集团是否应该通过活动直接相互沟通?但对我来说,这似乎扰乱了良好的自上而下的存储库-块-小部件数据流.
那么,这在实践中会是什么样子呢?
或者,如果你有一个好的例子,一个(稍微)复杂的应用程序,我可以研究,我也很乐意接受.
谢谢:)