Как обновить streamBuilder с помощью firestore в флаттере - PullRequest
0 голосов
/ 02 октября 2019

Я заблудился в управлении потоковым компоновщиком ... помогите, пожалуйста!

У меня есть замечательный класс, который получает данные из firestore и представляет их в виде списка. Поток включает переменную (rag), которая может изменяться в зависимости от взаимодействия с пользователем, и я хотел бы, чтобы поток обновлялся при изменении такой переменной. Я не могу заставить его работать, и я считаю, что моя проблема в том, что я не могу обновить поток. Как я могу обновить мой поток? В iOS есть простая строка reloadData для этого ...

См. Ниже мой код

class RestaurantList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore
          .collection('restaurants')
          .where('lat', isGreaterThan: appData.currentLatitude - rag)
          .where('lat', isLessThan: appData.currentLatitude + rag)
          .snapshots(),
      builder: (context, snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return Center(
              child: new Text(
                'Loading...',
              ),
            );
          default:
            final restDB = snapshot.data.documents;

              for (var rest in restDB) {
                final restID = rest.documentID;
                final name = rest.data['name'];
                final lati = rest.data['lat'];
                final longi = rest.data['lon'];
                final distance = (appData.currentLatitude - lati) *
                        (appData.currentLatitude - lati) +
                    (appData.currentLongitude - longi) *
                        (appData.currentLongitude - longi);

                if (longi < appData.currentLongitude + rag &&
                    longi > appData.currentLongitude - rag) {
                  final restaurant = Restaurant(
                    restID: restID,
                    name: name,
                    distance: distance,
                    lati: lati,
                    longi: longi,
                  );

                  restaurants.add(restaurant);

                }
              }      

            return ListView(
              shrinkWrap: true,
              physics: ClampingScrollPhysics(),
              children: restaurants,
            );
        }
      },
    );
  }
}
...