flutter - 需要帮助 Bloc 流和接收器如何工作。当我导航时,无法弄清楚我在每个屏幕中调用 ContactBloc 中的 fetchContactList 函数的方式
问题描述
我是 Flutter 开发和探索它的新手。我使用 Flutter 模块化(带有 rxDart 的 Bloc)创建了一个示例联系人应用程序。
屏幕是
1) ContactPage -- 显示联系人列表
2) AddContactPage -- 添加联系人
3) ViewContactPage -- 查看联系人
4) EditContactPage -- 编辑联系人
我有常见的 ContactBloc 类,它具有以下功能
获取联系人列表
fetchContactListBySearch
插入联系
更新联系方式
删除联系人
我无法理解的一件事是为什么每次导航到 ContactPage 屏幕以外的地方时都会调用 fetchContactList 函数。由于我在 ContactPage 的 build 方法中以及在编辑删除操作之后调用 fetchContactList 函数。我无法弄清楚这些事情。
以下是 ContactBloc 文件
class ContactBloc extends Disposable {
final ContactRepository contactRepository=
ContactModule.to.get<ContactRepository>();
List<Contact> contacts;
Contact contact;
bool searchButton= false;
bool showSearch= false;
BehaviorSubject<List<Contact>> _listContactController;
BehaviorSubject<Contact> _contactController;
BehaviorSubject<bool> _searchButtonController;
BehaviorSubject<bool> _searchController;
ContactBloc() {
Story.storyline(story: "ContactBloc()");
_listContactController= BehaviorSubject.seeded(contacts);
_contactController= BehaviorSubject.seeded(contact);
_searchButtonController= BehaviorSubject.seeded(searchButton);
_searchController= BehaviorSubject.seeded(showSearch);
}
Stream<List<Contact>> get listContactOut => _listContactController.stream;
Stream<Contact> get contactOut => _contactController.stream;
Stream<bool> get searchOut => _searchController.stream;
Stream<bool> get buttonSearchOut => _searchButtonController.stream;
Future<Answer> fetchContactList({
bool distinct, List<String> columns,
String where, List whereArgs,
String groupBy, String having,
String orderBy,
int limit, int offset
}) async {
//Story.storyline(story: "ContactBloc.fetchContactList[+]");
Answer A= await contactRepository.fetch(
distinct: distinct, columns: columns, where: where,
whereArgs: whereArgs, groupBy: groupBy, having: having,
orderBy: orderBy, limit: limit, offset: offset
);
_listContactController.sink.add(A.data);
return A;
}
Future<Answer> fetchContactListBySearch(String keywords) async {
keywords= "%$keywords%";
Answer A= await fetchContactList(
where: "name LIKE ? OR phone LIKE ? OR email LIKE ?",
whereArgs: [keywords, keywords, keywords]
);
return A;
}
Future<Answer> insertContact(Contact contact) async {
Answer A= await contactRepository.insert(contact);
fetchContactList();
return A;
}
Future<Answer> updateContact(Contact contact) async {
Answer A= await contactRepository.update(contact);
fetchContactList();
return A;
}
Future<Answer> deleteContact(Contact contact) async {
Answer A= await contactRepository.delete(contact);
fetchContactList();
return A;
}
...
}
您可以在此处找到示例项目供您参考
https://github.com/dineshrajbhar777/flutter-bloc-with-rxdart.git
解决方案
推荐阅读
- vhdl - VHDL“期望类型 ieee.std_logic_1164.STD_LOGIC_VECTOR”当这是我给出的类型时
- user-interface - 即使存在子菜单项,Magento 2 Mobile 导航菜单也会在单击时关闭
- google-apps-script - Google 表格:获取 ID 的工作代码,但结果应与文件名行对齐
- linux - 如何使用 gdb 在寄存器偏移处读取内存
- python - 有没有办法在 python 列表中切换元素?
- prawn - 在 Prawn 中构建内容块?
- python - 空返回数组
- python - messagex = int((SCREENWIDTH - GAME_SPRITES['message'].get_height())/2 ^ SyntaxError: invalid syntax)
- java - equals() 的参数类型不太可能:String 似乎与 Scanner 无关
- node.js - 无法在数字海洋应用平台上部署带有节点后端的 React 应用