Дарт, как вернуть будущеевместо списка - PullRequest
0 голосов
/ 28 октября 2019

У меня есть асинхронная функция getProducts(), которая должна возвращать Future<List<MyProductTile>>, предназначенную для подачи в FutureProvider.

Пока мне удалось вернуть List<Future<MyProductTile>> вместо:

Future<List<MyProductTile>> getProducts(
  Stream<DocumentSnapshot> stream) async {

    var documentSnapshot = await stream.first;

    List<DocumentReference> productsDocRefsList =
        List<DocumentReference>.from(documentSnapshot.data['used_products']);

    var x = productsDocRefsList
        .map((documentReference) => documentReference.get().then(
            (documentSnapshot) =>
                MyProductTile.fromFirestore(documentSnapshot)))
        .toList();

    print(x.runtimeType); // List<Future<MyProductTile>>
}

Я пытался использовать Future.wait, как предложено в этом ответе stackoverflow , но я не сделалне удалось.

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Один из способов - использовать asyncMap из API Dart Stream . Это особенно полезно, потому что вы получаете DocumentSnapshot поток в качестве параметра вашей функции.

Future<List<MyProductTile>> getProducts(Stream<DocumentSnapshot> stream) {
    return stream
      .expand((documentSnapshot) => documentSnapshot.data['used_products'])
      .asyncMap((documentReference) => documentReference.get())
      .map((documentSnapshot) => MyProductTile.fromFirestore(documentSnapshot))
      .toList();
  }
0 голосов
/ 29 октября 2019
Future getDetails() async {
var firestore = Firestore.instance;
QuerySnapshot qs = await firestore
    .collection('letters_sub')
    .where('sub_id', isEqualTo: widget.letters.id)
    .getDocuments();
return qs.documents;

}

Container(
          child: FutureBuilder(
              future: getDetails(),
              builder: (context, snapshot) {
                if (snapshot.connectionState ==
                    ConnectionState.waiting) {
                  return Center(
                    child: Text('Loading...'),
                  );
                } else {
                  return ListView.builder(
                      //padding: EdgeInsets.symmetric(horizontal: 16.0),
                      shrinkWrap: true,
                      physics: ClampingScrollPhysics(),
                      itemCount: snapshot.data.length,
                      itemBuilder: (context, index) {
                        var sub_text_en = snapshot.data[index].data['sub_text_en'];

                        return  Column(
                          textDirection: TextDirection.rtl,
                          crossAxisAlignment: CrossAxisAlignment.stretch,
                          children: <Widget>[

                            Text(
                              snapshot.data[index].data['sub_text_ar'],
                              textAlign: TextAlign.right,
                              style: new TextStyle(
                                  fontSize: 14.0,
                                  //color: Colors.blue,
                                  fontWeight:
                                  FontWeight.normal),
                            ),

                            Text(
                              sub_text_en.contains('\n') ? sub_text_en : sub_text_en.replaceAll('\\n ', '\n') ,
                              textAlign: TextAlign.left,
                              style: new TextStyle(
                                  fontSize: 14.0,
                                 // color: Colors.blueGrey,
                                  fontWeight: FontWeight.bold),
                            ),


                          ],
                        );
                      });
                }
              }),
        ),
0 голосов
/ 29 октября 2019

Преобразование списка фьючерсов в ожидании каждого будущего.

Future<List<Object>> dataFromFutures(List<Future<Object>> futures) async {
  List<Object> dataList = [];
  futures.forEach((Future i) async {dataList.add(await i);});
  return dataList;
}
...