首页 > 解决方案 > 需要帮助 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

标签: flutterblocrxdart

解决方案


推荐阅读