Состояние AsyncSnapshot всегда равно connectionState.waiting

Я пытаюсь динамически обновлять ListView в зависимости от содержимого TextField (панели поиска).

ListView находится внутри виджета «ScenariosList» и содержит список «Сценариев», который представляет собой настраиваемый виджет, содержащий заголовок, контент и другие биты данных (не совсем релевантные, но полезные для контекста). Его контент извлекается из базы данных через «ScenariosBloc».

TextField содержится в виджете «SearchBar».

Цель состоит в том, чтобы содержимое ListView изменялось всякий раз, когда обнаруживается изменение TextField.

Сейчас я использую два отдельных блока. ScenariosBloc выбирает все сценарии из базы данных, а FilterScenariosBloc заставляет List визуализировать виджет, чтобы показать сценарий, если его заголовок содержит строку в TextView в SearchBar.

Для этого я использую вложенные StreamBuilders (см. Код ниже).

ScenariosList.dart

  // build individual scenario cards
  Widget _buildScenarioListItem(Scenario scen, String filter) {
    if (!(filter == null || filter == "")) {
      print("null filter");
      if (!(scen.title.contains(filter))) {
        print("match!");
        return ScenarioCard(scen);
      }
    }
    return Container();
  }

  Widget _buildScenarioList(BuildContext context) {
    return StreamBuilder(
        stream: scenarioBloc.scenarios,
        builder: (BuildContext context,
            AsyncSnapshot<List<Scenario>> scenariosSnapshot) {
          if (!scenariosSnapshot.hasData) {
            return CircularProgressIndicator();
          }
          return StreamBuilder(
              stream: filterScenariosBloc.filterQuery,
              initialData: "",
              builder: (BuildContext context, AsyncSnapshot filterSnapshot) {

                if(!filterSnapshot.hasData) return CircularProgressIndicator();

                print("Scenarios Snapshot: ${scenariosSnapshot.toString()}");
                print("Filter Snapshot: ${filterSnapshot.toString()}");

                return ListView.builder(
                  physics: NeverScrollableScrollPhysics(),
                  padding: EdgeInsets.all(0),
                  shrinkWrap: true,
                  itemCount: scenariosSnapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    Scenario scen = scenariosSnapshot.data[index];
                    return _buildScenarioListItem(scen, filterSnapshot.data);
                  },
                );
              });
        });
  }

}

SearchBar.dart

метод onChanged текстового поля содержит:

    // function to filter the scenarios depending on the users input.
    void filterSearchResults(String query) {
      _filterScenariosBloc.doFilter(query);
    }

FilterScenariosBloc.dart

class FilterScenariosBloc {
  // stream - only need one listener
  final _searchController = StreamController<String>.broadcast();

  // output stream
  get filterQuery => _searchController.stream;

  FilterScenariosBloc() {
    doFilter(" ");
  }

  doFilter(String query) {
    _searchController.sink.add(query);
  }
}

Пользовательский ввод отправляется в FilterScenariosBloc все нормально, но статус filterSnapshot всегда - connectionState.waiting. Есть идеи, как я могу это решить?


person Tom Milner    schedule 08.04.2019    source источник
comment
Я пытался создать свой собственный поиск, но это оказалось немного головной болью, в итоге я просто следил за этим руководством medium.com/flutterpub/. Не забудьте преобразовать строку элемента и запрос в нижний регистр. Вот еще один конкретный BLOC medium.com/flutterpub/   -  person F-1    schedule 05.07.2019


Ответы (2)


Я была такая же проблема. Проблема заключалась в том, что мои правила базы данных firestore не разрешали чтение или запись для рассматриваемой коллекции. Пожалуйста, посмотрите, решит ли это вашу проблему

person Speedy11    schedule 18.05.2020

У меня была такая же проблема, всегда был connectionState.waiting, и поэтому snapshot.data был нулевым. Это означает, что по какой-либо причине данные не могут быть получены. Затем я запустил приложение в режиме отладки и получил сообщение об ошибке типа «Невозможно поместить запрошенные классы в один файл dex». Затем я просто следил за этим answer, и проблема была решена для меня.

person BogdanP    schedule 05.07.2019