当前位置: 首页 > 知识库问答 >
问题:

从Firestore读取阵列并插入Flutter中的列表

颛孙嘉石
2023-03-14

我有从Firestore读取数组的问题,字符串可以在future builder中读取,如下所示,

widgets库捕获的异常接收者:null尝试调用:get(“经验”)

相关的导致错误的小部件是:FutureBuilder file:///xxxxxxxx/lib/regformSummary.dart:185:45当抛出异常时,这是堆栈:#0object.nosuchmethod(dart:core-patch/object_patch.dart:54:5)#1_regformSummaryState.build。(包:xxxxxx/regformsummary.dart:186:94)#2_futurebuilderstate.build(包:flutter/src/widgets/async.dart:773:55)#3statefulelement.build(包:flutter/src/widgets/framework.dart:4612:27)#4componentelement.performrebuild(包:flutter/src/widgets/framework.dart:4495:15)...

下面是读取字符串的工作代码

//under main widget builder
DocumentReference resumedata =_firestore.collection('users').doc(widget.userID).collection('resume').doc('info');
    DocumentReference userdata = _firestore.collection('users').doc(widget.userID).collection('resume').doc('personalinfo');
//

.....,
FutureBuilder(future:userdata.get(),builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                            if(snapshot.connectionState == ConnectionState.done){
                              String profilepic = snapshot.data.get('profilepic');
                              String name = snapshot.data.get('name');
                              String sname = snapshot.data.get('sname');

                              return Column(
                                children: [
                                  Padding(
                                    padding: EdgeInsets.symmetric(vertical: 10),
                                    child: CircleAvatar(
                                      minRadius: 40,
                                      maxRadius: 80,
                                      backgroundImage: NetworkImage('$profilepic'),
                                    ),
                                  ),//avatar
                                  Padding(
                                    padding: EdgeInsets.symmetric(horizontal: 10,vertical:3),
                                    child: Text(
                                      name,
                                      style: GoogleFonts.openSans(textStyle: TextStyle(color: Colors.black54,fontSize: 24,fontWeight: FontWeight.bold)),
                                    ),
                                  ),//name
                                  Padding(
                                    padding: EdgeInsets.symmetric(horizontal: 10,vertical:3),
                                    child: Text(
                                      sname,
                                      style: GoogleFonts.openSans(textStyle: TextStyle(color: Colors.black54,fontSize: 24,fontWeight: FontWeight.bold)),
                                    ),
                                  ),//sname


                                ],
                              );
                            }
                            return SizedBox();

                          }),

下面是失败的代码

DefaultTabController(
                              length:8,
                              child: SingleChildScrollView(
                                physics: BouncingScrollPhysics(),
                                child: Column(
                                    children: [
                                      TabBar(
                                        isScrollable: true,
                                        indicatorWeight: 4.0,
                                        indicatorColor:Colors.black38,
                                        unselectedLabelColor: Colors.black38,
                                        tabs: <Widget>[
                                          Tab(
                                            child:Text('Tecrübeler',style: TextStyle( color:
                                               colorVal
                                                )),
                                          ),
                                          Tab(
                                            child: Text('Eğitim',style: TextStyle( color: colorVal
                                               )),
                                          ),
                                          Tab(

                                            child: Text('Yabancı Dil',style: TextStyle( color: colorVal)),
                                          ),
                                          Tab(

                                            child: Text('Sertifikalar',style: TextStyle( color: colorVal)),
                                          ),
                                          Tab(

                                            child: Text('Referanslar',style: TextStyle( color:colorVal)),
                                          ),
                                          Tab(

                                            child: Text('İlgilendiği Pozisyonlar',style: TextStyle( color: colorVal)),
                                          ),
                                          Tab(

                                            child: Text('CV dosyası ve Önyazı Dosyası',style: TextStyle( color: colorVal)),
                                          ),
                                          Tab(

                                            child: Text('İletişim Bilgileri',style: TextStyle( color: colorVal)),
                                          ),
                                        ],
                                      ),
                                      SizedBox(
                                        height:MediaQuery.of(context).size.height,
                                        child: TabBarView(
                                          children: <Widget>[
                                            FutureBuilder(future:resumedata.get(),builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot){
                                              List experiences = List.from(snapshot.data.get('experiences'));
                                              if (snapshot.connectionState == ConnectionState.done){
                                                ListView.builder(
                                                    itemCount: experiences.length,
                                                    itemBuilder: (context,index){
                                                      return Padding(
                                                        padding: EdgeInsets.symmetric(vertical: 5, horizontal: 10),
                                                        child: Container(
                                                          decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20.0)), color: Colors.white, boxShadow: [
                                                            BoxShadow(color: Colors.black.withAlpha(100), blurRadius: 5.0),
                                                          ]),
                                                          child: ListTile(
                                                            isThreeLine: true,
                                                            title: Text('${experiences[index]['position']}'),
                                                            subtitle: Text('${experiences[index]['company']} - ${experiences[index]['duration']}'),

                                                          ),


                                                        ),
                                                      );
                                                    });
                                                    .....and goes on 

这是Firestore中的数据树

Firestore数据树

共有1个答案

艾骏
2023-03-14

您在完成Snapshot.ConnectionState之前访问了Snapshot.Data。而且,您忘记“返回”您的列表视图。

if (snapshot.connectionState == ConnectionState.done) {
    List experiences = List.from(snapshot.data.get('experiences')); // This line should be inside if block
    return ListView.builder(...); // You forgot to add 'return' here
} ....

这是在future Builder中你的问题中的失败代码块中的代码。

 类似资料:
  • 问题内容: 我试图在Flutter中将列表插入到sql数据库中,但是我不知道该怎么办,有人可以帮助我吗? 当我初始化mi数据库时,我有这个: 我有这个要插入数据: 但是当y尝试插入这样的值时: 我收到这样的错误: 发生异常。 SqfliteDatabaseException(DatabaseException(java.lang.String无法转换为java.lang.Integer)sql’I

  • 问题内容: 我需要将几个数组合并为一个数组。描述我要寻找的内容的最好方法是将阵列“交织”为单个阵列。 例如,从数组#1中取出第一项,然后追加到最终数组中。从数组2获取项目1,然后追加到最终数组。从数组#1获得第二项并追加…等。 最终的数组如下所示: array#1.element#1 array#2.element#1。。。 “踢球者”是各个阵列可以具有各种长度。 是否有更好的数据结构要使用? 问

  • 问题内容: 我想知道从ArrayList转换为Array是否安全/建议?我有一个文本文件,每行一个字符串: 我想将它们读入数组列表,然后将其转换为数组。建议这样做/合法吗? 谢谢 问题答案: 是的,将转换为是安全的。一个好主意取决于您的预期用途。您需要提供的操作吗?如果是这样,请将其保留为。否则转换掉! 输出

  • 我正在尝试将应用程序中的数组上载到Firestone。然而,它继续显示 使用无效数据调用了“firebaseError:function fieldvalue.arrayUnion()”。 这是我的代码: 请注意,数据库中还不存在数组“players”。

  • 首先,我知道Firestore是如何工作的,并且花了很多时间评估不同的方法以获得良好的结构。但我仍在考虑以下情况: 有一个已知食谱的数据库。用户可以添加菜谱,但必须确认它们是真正的菜谱,而不仅仅是一些变体。因此,每个用户都可以从用户生成的食谱列表中选择receipes,说明他们知道如何烹饪(或添加新的)。 现在,我希望用户与其他人分享他们的receipes列表,但我不确定如何最好地使用Firest

  • 我使用spring批处理,其中步骤1是从数据库读写到列表,然后有步骤2从阅读器从列表读写到数据库,处理和写到数据库,步骤3将从列表读写,处理和写到数据库。