为什么我在流中没有收到应有的任何文档?

问题描述 投票:0回答:1

我正在尝试使用 GeoFlutterFire 查询获取附近的药店并显示它们,但运行该函数后流中没有元素。

这是我用来获取附近药店流量的功能。

Stream<List<DocumentSnapshot>> getNearbyPharmacies(LatLng userPosition, String medication) {
    final geo = GeoFlutterFire();

    GeoFirePoint center = geo.point(latitude: userPosition.latitude, longitude: userPosition.longitude);
    var collectionReference = firestore.collection('Pharmacies');
    var radius = 5.0; // radius in kilometers
    String field = 'Position';

    Stream<List<DocumentSnapshot>> stream = geo.collection(collectionRef: collectionReference)
                                            .within(center: center, radius: radius, field: field);

    return stream;
  }

这是我用来检查是否有元素要显示的代码。

StreamBuilder<List<DocumentSnapshot>>(
                stream: _pharmacyStream,
                builder: (context, snapshot) {
                  if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}');
                  }
                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return Center(child: CircularProgressIndicator());
                  }
                  if (!snapshot.hasData || snapshot.data == null) {
                    return Text('No data available');
                  } else {
                    var docs = snapshot.data!;
                    return Expanded(
                      child: Column(
                        children: [
                          Expanded(
                            child: ListView.builder(
                              //...
                            ),
                          ),
                        ],
                      ),
                    );
                  }
                },
)

我已经创建了包含必要字段的文档,包括名为“位置”的地图类型,位于名为“药房”的集合中。

flutter dart google-cloud-firestore geofirestore
1个回答
0
投票

我尝试运行你的代码,它工作正常,我遇到的唯一错误是在UI中,尝试删除不必要的扩展小部件并在listView.builder中使用shrinkWrap:true

class Test extends StatefulWidget {
  const Test({super.key});

  @override
  State<Test> createState() => _TestState();
}

class _TestState extends State<Test> {
  final firestore = FirebaseFirestore.instance;
  Stream<List<DocumentSnapshot>> getNearbyPharmacies(LatLng userPosition, String medication) {
    final geo = GeoFlutterFire();

    GeoFirePoint center = geo.point(latitude: userPosition.latitude, longitude: userPosition.longitude);
    var collectionReference = firestore.collection('Pharmacies');
    var radius = 5.0; // radius in kilometers
    String field = 'Position';

    Stream<List<DocumentSnapshot>> stream = geo
        .collection(collectionRef: collectionReference)
        .within(center: center, radius: radius, field: field);

    return stream;
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<DocumentSnapshot>>(
      stream: getNearbyPharmacies(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        }
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        }
        if (!snapshot.hasData || snapshot.data == null) {
          return const Text('No data available');
        } else {
          var docs = snapshot.data!;
          return ListView.builder(
            shrinkWrap: true,
            itemCount: docs.length,
            itemBuilder: (_, index) {
              return Text("${index + 1}");
            },
          );
        }
      },
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.