Flutter, можно ли использовать Firestore Stream Builder в функции без метода сборки виджета?

У меня есть функция, которая получает результаты поиска магазинов в Google Places и выполняет поиск в Firestore, чтобы узнать, есть ли магазин в базе данных.

Всякий раз, когда я запускал его, думал, что Stream Builder ничего не делает.

Я думаю, проблема в том, что функция не находится внутри виджета и не имеет метода сборки. Вот код:

  void searchStores() async {
    Prediction newStore = await PlacesAutocomplete.show(
        context: context,
        apiKey: kGoogleApiKey,
        mode: Mode.overlay,
        language: "en",
        components: [new Component(Component.country, "au")]);

    await places.getDetailsByPlaceId(newStore.placeId).then((detailStoreInfo) {

      print('running 1');

      StreamBuilder (
          stream: Firestore.instance.collection('stores').document(detailStoreInfo.result.id).snapshots(),
          builder: (BuildContext context, AsyncSnapshot snapshot){

            print('running 2');

            setState(() {
              if (snapshot.connectionState == ConnectionState.active &&
                  snapshot.hasData){

                print('running 3');

                if (snapshot.data['veganOnly'] == null || snapshot.data['veganOnly'] == false){

                  print('running 4');

                  setState(() {
                    firstStore = true;
                  });

                }
              }
            });

            return null;

          }
      );

    });
  }

Как видите, я добавил операторы печати, чтобы выяснить, где мой код дает сбой. Отображается "работает 1", поэтому места возвращают ответ.

Но ни один из других операторов (2,3 или 4) не печатается, поэтому кажется, что построитель потока не работает, даже не возвращается с нулевыми значениями.

Я также попытался поставить return перед построителем потока, но это тоже не повлияло.

Правильно ли я думаю об этом, потому что этого нет в методе сборки виджета или это что-то совсем другое.

Спасибо


person Nicholas Muir    schedule 16.09.2019    source источник


Ответы (2)


StreamBuilder - это Widget, и поэтому его нужно вставить где-нибудь в дереве виджетов, как и для виджета Text. Просто передайте ему поток и верните другой виджет внутри его builder обратного вызова

person Jalil Compaoré    schedule 16.09.2019

Для этого вам нужно использовать класс Stream, например, чтобы получить все сведения о коллекции с именем users, которую вы можете использовать,

Stream<QuerySnapshot> stream = _db.collection("users").snapshots();
stream.forEach((QuerySnapshot element) {

  if(element == null)
    return;

  for(int count=0;count<element.documents.length;count++) {
    print(element.documents[count].data.toString());
  }
});
person Ashwin Balani    schedule 16.07.2020