Flutter / Firebase-List <dynamic>没有实例获取器'documents'

问题描述

我正在尝试在Flutter应用程序中合并两个Firestore流。但是,当我尝试实现合并的流时,出现以下错误

    The following NoSuchMethodError was thrown building StreamBuilder<dynamic>(dirty,state: _StreamBuilderBaseState<dynamic,AsyncSnapshot<dynamic>>#25b40):
Class 'List<dynamic>' has no instance getter 'documents'.
Receiver: _List len:2
Tried calling: documents

我假设在建立流之前,还需要执行另一步骤,然后才能在Pageview构建器中使用它?这是我的信息流:

Stream<QuerySnapshot> getDefaultOccasions(BuildContext context) async*{
  yield* Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
}

Stream<QuerySnapshot> getPersonalOccasions(BuildContext context) async*{
  final uid = await Provider.of(context).auth.getCurrentUID();
  yield* Firestore.instance.collection('datestoremember').document(uid).collection('Dates_to_Remember').snapshots();
}

 getData() {
  Stream stream1 = Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
  Stream stream2 = Firestore.instance.collection('datestoremember').document('Ngrx54m84JbsL0tGvrBeKCBlEnm2').collection('Dates_to_Remember').snapshots();
  return StreamZip([stream1,stream2]);
}

然后我在这里实现:

              child: StreamBuilder(
            stream: getData(),builder: (context,snapshot) {
              if(!snapshot.hasData) return const Text("Loading...");
              return new PageView.builder(
                itemCount: snapshot.data.documents.length,controller: PageController(viewportFraction: 0.5),onPageChanged: (int index) => setState(() => _index = index),itemBuilder: (_,i) {
                  return Transform.scale(
                    scale: i == _index ? 1 : 0.5,child: Card(
                      elevation: 6,shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(10)),child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,children: [
                          Text(snapshot.data.documents[i]['Date'].toDate().day.toString()),Text(DateFormat.MMMM()
                              .format(
                              formatter.parse(snapshot.data.documents[i]['Date'].toDate().toString()))
                              .toString()),Padding(
                            padding: const EdgeInsets.only(
                                left: 8.0,right: 8.0),child: FittedBox(
                              fit: BoxFit.contain,child: Text(
                                snapshot.data.documents[i]['Title'],overflow: TextOverflow.ellipsis,),)
                        ],);
                },);},

有什么想法吗?干杯

解决方法

尝试一下:

getData() {
  Stream stream1 = Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
  Stream stream2 = Firestore.instance.collection('datestoremember').document('Ngrx54m84JbsL0tGvrBeKCBlEnm2').collection('Dates_to_Remember').snapshots();

  return StreamGroup.merge([stream1,stream2]).asBroadcastStream();
}

使用StreamZip编辑:

Stream<List<QuerySnapshot>> getData() {
  Stream stream1 = Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
  Stream stream2 = Firestore.instance.collection('datestoremember').document('Ngrx54m84JbsL0tGvrBeKCBlEnm2').collection('Dates_to_Remember').snapshots();
  return StreamZip<List<QuerySnapshot>>([stream1,stream2]);
}

在StreamBuilder中:

child: StreamBuilder(
        stream: getData(),builder: (BuildContext context,AsyncSnapshot<List<QuerySnapshot>> snapshot) {

          List<QuerySnapshot> combinedSnapshot = snapshot.data.toList();
          combinedSnapshot[0].documents.addAll(combinedSnapshot[1].documents);

          if(!combinedSnapshot[0].hasData) return const Text("Loading...");
          return new PageView.builder(
            itemCount: combinedSnapshot[0].data.documents.length,controller: PageController(viewportFraction: 0.5),onPageChanged: (int index) => setState(() => _index = index),itemBuilder: (_,i) {
              return Transform.scale(
                scale: i == _index ? 1 : 0.5,child: Card(
                  elevation: 6,shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10)),child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,children: [
                      Text(combinedSnapshot[0].data.documents[i]['Date'].toDate().day.toString()),Text(DateFormat.MMMM()
                          .format(
                          formatter.parse(combinedSnapshot[0].data.documents[i]['Date'].toDate().toString()))
                          .toString()),Padding(
                        padding: const EdgeInsets.only(
                            left: 8.0,right: 8.0),child: FittedBox(
                          fit: BoxFit.contain,child: Text(
                            combinedSnapshot[0].data.documents[i]['Title'],overflow: TextOverflow.ellipsis,),)
                    ],);
            },);},

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...