Как использовать StreamBuilder для отображения списка данных из документа пожарного депо - PullRequest
0 голосов
/ 08 мая 2019

Я хочу иметь возможность создавать список из массива внутри документа в базе данных firestore.

Моя база данных выглядит так:

Я хочу иметь возможность создавать сетку streamBuilder из URL-адресов внутри массива videosUrl.

Я много чего пробовал, но думаю, что лучший способ - это что-то вроде этого:


StreamBuilder <List<DocumentSnapshot>>(
      stream: Firestore.instance
          .collection('events')
          .document('-LeH4rspnPTpeTLdt8hs')
          .collection('participants')
          .document('-LeL_TSfFDfqKgm-Io9T')
          .snapshots().asyncMap((snap) async {
        List<String> videosUrlArray = snap.data['videosUrl'];
        var videoUrlList = <DocumentSnapshot>[];
        for (var videoUrlPath in videosUrlArray) {
          videoUrlList.add(await Firestore.instance.document(videoUrlPath).get());
        }
        print(videoUrlList);
        return videoUrlList;

      }),
      builder: (BuildContext context, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
        if (snapshot.hasError)
          return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting: return _showLoading();
          default:
            return new GridView(
              reverse: false,
              gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2),
              children: snapshot.data.map((DocumentSnapshot document) {
                return Text('${snapshot.data}');
              }).toList(),
            );
        }
      },
    )

но я все еще не могу получить доступ к данным!

1 Ответ

0 голосов
/ 13 мая 2019

Я решаю эту проблему с помощью кода ниже:


Widget buildGridFilesToExport(){
  return new StreamBuilder(
    stream: Firestore.instance
        .collection('users')
        .document(dataUserGlobal.userAdminId)
        .collection('events')
        .document(dataUserGlobal.eventId)
        .snapshots(),
    builder: (context, snapshot) {
      print(snapshot);
      if (snapshot.hasError)
        return new Text('Error: ${snapshot.error}');
      switch (snapshot.connectionState) {
        case ConnectionState.waiting: return new Text('Loading...');
        default:
          List videosList = snapshot.data['thumbnailsUrl'];
          return
            videosList != null ?
            new GridView.count(
              crossAxisCount: 2,
              childAspectRatio: 1,
              children: List.generate(snapshot.data['thumbnailsUrl'].length, (index) {
                return Container(
                    padding: EdgeInsets.all(5.0),
                    child: Column(
                      children: <Widget>[
                        Container(
                          margin: EdgeInsets.only(bottom: 2.0),
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.all(Radius.circular(5.0)),
                            image: DecorationImage(
                              image: NetworkImage(snapshot.data['thumbnailsUrl'][index]),
                              fit: BoxFit.cover,
                            ),
                          ),
                        ),

                      ],
                    )
                );
              }),
            )
                :
            Center(
                child: Container(
                  width: 300,
                  child: Text(
                    'Ancora nessun video!\nVai nella cartella amici e accetta i loro video!',
                    textAlign: TextAlign.center,
                    style: TextStyle(
                      fontFamily: 'acumin-pro',
                      fontSize: 22,
                    ),
                  ),
                )
            );
      }
    },
  );
}
...