首页 > 解决方案 > 未检测到 Flutter mobx

问题描述

我有一个 MobX 商店,它有一个可观察的字符串

@observable
String searchText = '';

@action
Future<List<Contact>> fetchContacts(int offset, String searchText) async {
if (offset == 0) {
  _page = 1;
}
final response = await _contactsRepository.getAll(_page,'',{'name': searchText});
print('offset $offset');
_page++;
print('response data ${response.data}');
return response.data.isEmpty ? [] : response.data;

}

在我看来,我正在创建一个包裹在观察者内部的分页视图,并且我正在使用我在商店中创建的可观察字符串。

SafeArea(
    child: Observer(
      builder: (_) {
        print('REBUIKD');
        return PaginationView<Contact>(
          separator: Divider(color: Colors.grey),
          paginationViewType: PaginationViewType.listView,
          pageFetch: (int offset) => _contactsStore.fetchContacts(
              offset, _contactsStore.searchText),
          itemBuilder: (context, Contact contact, int index) {
            return GestureDetector(
                onTap: () => Navigator.of(context)
                    .push(MaterialPageRoute(builder: (_) {})),
                child: ContactListItem(
                  contact: contact,
                ));
          },
          onError: (dynamic error) => Center(
            child: Text('Some error occured'),
          ),
          onEmpty: Center(
            child: Text('Sorry! This is empty'),
          ),
          bottomLoader: Center(
            // optional
            child: CircularProgressIndicator(),
          ),
          initialLoader: Center(
            // optional
            child: CircularProgressIndicator(),
          ),
        );
      },
    ),
  ),

问题是我得到一个No observables detected in the build method of Observer错误

我想观察重建的可观察是searchText

我不明白为什么 mobX 没有检测到我实际上在使用构建器中的 observable

标签: flutterdartmobx

解决方案


不要将 a 包裹Listview.builder在 anObserver中,而应将其放在Observer里面itemBuilder

ListView.builder(
  itemBuilder: (context, index) {
    return Observer(...);
  }
)

如果您需要指定一个itemCount或类似的东西,您将需要其中两个:

Observer(
  builder: (context) {
    return ListView.builder(
      itemCount: someStore.list.length,
      itemBuilder: (context, index) {
        return Text(someStore.list[index].name);
      },
    );
  },
)

推荐阅读