Получатель 'docs' не определен для типа 'AsyncSnapshot <Object?>'

После перехода на нулевую безопасность возникает ошибка. Получатель docs не определен для типа AsyncSnapshot<Object?>. Попробуйте импортировать библиотеку, которая определяет «документы», изменив имя на имя существующего получателя или определив получатель или поле с именем «docs».

Фрагмент кода с ошибкой

          return FutureBuilder(
      future: searchResultsFuture,
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return circularProgress();
        }
        List<UserResult> searchResults = [];
        snapshot.docs.forEach((doc) {    //have error here
          User user = User.fromDocument(doc);
          UserResult searchResult = UserResult(user);
          searchResults.add(searchResult);
        });
        return ListView(
          children: searchResults,
        );
      },
    );
  } 

поискРезультатыБудущее

      
  handleSearch(String query) {
    Future<QuerySnapshot> users =
        usersRef.where("displayName", isGreaterThanOrEqualTo: query).get();
    setState(() {
      searchResultsFuture = users;
    });
  }

  clearSearch() {
    searchController.clear();
  }

3 ответа

В snapshot в вашем коде AsyncSnapshot, который действительно не имеет docsребенок. Чтобы получить документы из Firestore, вам необходимо использовать:

      snapshot.data.docs

Также см. Документацию FlutterFire по прослушиванию данных в реальном времени , которая содержит пример, показывающий это - и мой ответ здесь, объясняющий все типы снимков: В чем разница между существующими типами снимков в Firebase?

изменить так:

      return FutureBuilder(
      future: searchResultsFuture,
      builder: (context, **AsyncSnapshot** snapshot) {
        if (!snapshot.hasData) {
          return circularProgress();
        }
        List<UserResult> searchResults = [];
        **snapshot.data!.docs.forEach((doc) {** 
          User user = User.fromDocument(doc);
          UserResult searchResult = UserResult(user);
          searchResults.add(searchResult);
        });
        return ListView(
          children: searchResults,
        );
      },
    );
  }

Обычно для получения данных требуется несколько мс, поэтому я попробовал это, чтобы убедиться, что мои операции выполняются после получения данных

      if (snapshot.hasData) {
//your code
}
Другие вопросы по тегам