Как получить доступ к данным Firebase DocumentSnapshot в Flutter asyn c StreamBuilder для создания списка - PullRequest
0 голосов
/ 08 января 2020

Я использую библиотеку GeoFlutterFire и следую коду в выпуск 16 , чтобы попытаться показать поток документов, соответствующих определенному Geoquery в Firebase. У меня все отлично, но я не могу понять, как взаимодействовать с потоком DocumentSnapshots, возвращенным в установленном мной Streambuilder:

  Widget build(BuildContext context) {
return StreamBuilder(
        stream: stream,
        builder: (BuildContext context,
            AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
          if (snapshots.connectionState == ConnectionState.active &&
              snapshots.hasData) {
            print('data ${snapshots.data}');

          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      );
     }
   }

Возвращенный тип - AsyncSnapshot>, и мой оператор печати печатает правильно для консоли отладки , но я не знаю, как получить доступ к моим данным Firestore в этих экземплярах DocumentSnapshot. Я хочу построить список в этом виджете, который показывает список возвращенных документов Firestore, но я не могу перебрать snapshots, если я не использую snapshots.data, а затем я не могу использовать любые методы Firestore для for l oop для доступа к информации в полях моего документа.

       for (var message in snapshots.data) {
          print(message);
        } 

Может ли кто-нибудь помочь мне разобраться, как получить доступ к именам полей и данным в моих документах Firestore из этого Streambuilder, пожалуйста? Мой полный файл .dart ниже, с добавлением данных, обработанных в методе состояния init для добавления фиктивных данных в тест:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:geoflutterfire/geoflutterfire.dart';
import 'dart:async'; 
import 'package:rxdart/rxdart.dart';

final _firestore = Firestore.instance; 
FirebaseUser loggedInUser; 
Geoflutterfire geo = Geoflutterfire();  

class ChatList extends StatefulWidget {   
     static const String id = 'chat_list';   
     @override   
     _ChatListState createState() => _ChatListState(); 
}

class _ChatListState extends State<ChatList> {
     final _auth = FirebaseAuth.instance;   
     var stream;

      @override
      void initState() {
             super.initState();
             geo = Geoflutterfire();
             GeoFirePoint myLocation = geo.point(latitude: 12.960632, longitude: 77.641603);
             _firestore
                 .collection('locations')
                 .add({'name': 'random name', 'position': myLocation.data, 'sender':loggedInUser});


        var radius = BehaviorSubject(seedValue: 1.0);
        GeoFirePoint center = geo.point(latitude: 12.96, longitude: 77.64);
        stream = radius.switchMap((rad) {
            var collectionReference = _firestore.collection('locations');
            return geo.collection(collectionRef: collectionReference).within(
            center: center, radius: rad, field: 'position', strictMode: true);
          });
   } 


  Widget build(BuildContext context) {
    return StreamBuilder(
            stream: stream,
            builder: (BuildContext context,
                AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
              if (snapshots.connectionState == ConnectionState.active &&
                  snapshots.hasData) {
                print('data ${snapshots.data}');

                for (var sender in snapshots.data) {
                  print(sender);
                } 
                return Container();
              } else {
                return Center(child: CircularProgressIndicator());
              }
            },
          );
         }
        }
...