【问题标题】:The getter was called on nullgetter 在 null 上被调用
【发布时间】:2021-05-26 04:27:44
【问题描述】:

我正在尝试从 firestore 显示用户的爱好列表,我从那里获取值,因为它在控制台中打印但无法显示。

错误:-

    The getter 'hobbies' was called on null.
    Receiver: null
    Tried calling: hobbies 

创建账户数据是模型类:-

   Future<CreateAccountData> getUser() async {
   final User user = auth.currentUser;
  return _reference.doc(user.uid).get().then((m) =>   CreateAccountData.fromDocument(m));
    }

以这种方式获取数据并在控制台中打印:-

 List hobbies;

 void initState() {
 super.initState();
 getUser().then((value) {
  if (!mounted) return;
  setState(() {
    
      accountData = value;
      
      hobbies = value.hobbies;
      print("hobbies"+ hobbies.toString());


  });
});
}

错误将我带到我评论的那一行:-

           child:GridView.builder(
                   physics: BouncingScrollPhysics(),
                   scrollDirection: Axis.horizontal,
                   shrinkWrap: true,
                   itemCount: accountData.hobbies.length, // Error take me to hobbies.
                        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 5, crossAxisSpacing: 5,),
                        itemBuilder: (BuildContext context, int index){
                          
                          return Padding(
                            padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
                            child: Text(accountData.hobbies[index]),
                          );
                        }
                    ), 

关于更新到此的建议(包装在未来的构建器中):-

         child: FutureBuilder(
                      future: getUser(),
                      builder: (context, snapshot){
                        if(snapshot.connectionState == ConnectionState.waiting){
                          return Center(
                            child: CircularProgressIndicator(),
                          );
                        } if(snapshot.data.docs.isEmpty){
                          return Align(
                            alignment: FractionalOffset.centerLeft,
                            child: Text("Add what you love to do.....",textAlign: TextAlign.left,style: TextStyle(fontSize: 17),),
                          );
                        }
                          return GridView.builder(
                              physics: BouncingScrollPhysics(),
                              scrollDirection: Axis.horizontal,
                              shrinkWrap: true,
                              itemCount: accountData?.hobbies?.length ?? 0,
                              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                                crossAxisCount: 2,
                                childAspectRatio: 5,
                                crossAxisSpacing: 5,),
                              itemBuilder: (BuildContext context,
                                  int index) {
                                 return Padding(
                                  padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
                                  child: Text(accountData.hobbies[index]),
                                );
                              }
                          );
                        },
                    ),

现在出现 NoSuchMethodError 错误:-

      Class 'CreateAccountData' has no instance getter 'docs'.
      Receiver: Instance of 'CreateAccountData'
      Tried calling: docs

【问题讨论】:

  • 这能回答你的问题吗? What is a NoSuchMethod error and how do I fix it?
  • 谢谢大家:- 解决了,现在不用麻烦了。我直接调用它而不是调用它网格视图。 child:Text(hobbies),但在网格视图中调用时仍然没有得到什么错误。反正。现在完成了。

标签: flutter dart


【解决方案1】:

检查爱好是否为空

 itemCount: accountData?.hobbies?.length ?? 0, 

【讨论】:

  • 试过了,错误消失了,但仍然没有显示爱好。
  • 当爱好为空时,列表计数将为0,因此网格上不会显示任何项目。
  • 那么我在网格中缺少什么?如果数据出现在屏幕中并在控制台中打印,那么我怎样才能让它显示出来。
  • 你可以使用 FutureBuilder 来代替 initstate 来加载数据
【解决方案2】:

在 Flutter 2.0 中,我们有 null 安全性。我们需要检查值是否为空或不使用!在变量后标记。自从我上学以来,我将在几分钟内发布代码 rn

【讨论】:

    【解决方案3】:

    GridView.builder 包装在FutureBuilder 中,将getUser() 作为future 传递。

    child: FutureBuilder(
      future: getUser(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting)
          return CircularProgressIndicator();
        if (snapshot.hasData)
          return GridView.builder(
              physics: BouncingScrollPhysics(),
              scrollDirection: Axis.horizontal,
              shrinkWrap: true,
              itemCount:
                  snapshot.data.hobbies.length, // Error take me to hobbies.
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
                childAspectRatio: 5,
                crossAxisSpacing: 5,
              ),
              itemBuilder: (BuildContext context, int index) {
                //DocumentSnapshot interestList = snapshot.data.docs[index]['hobbies'];
                return Padding(
                  padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
                  child: Text(snapshot.data.hobbies[index]),
                );
              });
        return Text('No data.');
      },
    ),
    

    【讨论】:

    • 试过这个,现在得到这个错误:-类'CreateAccountData'没有实例获取器'docs'。接收方:“CreateAccountData”实例尝试调用:文档
    • 这个问题在你代码的其他地方。您将需要共享尝试访问 docsCreateAccountData 类的部分
    • 请分享CreateAccountData.fromDocument()构造函数定义。你在那里访问docs 吗?如果没有,您在哪里尝试从 CreateAccountData 类访问 docs 变量?
    • 另外,_reference 是什么对象?它是 Firebase 的“CollectionReference”吗?
    • 嘿,终于解决了。而不是在网格视图中调用它以简单的方式调用它:-子文本(爱好),我不知道在网格视图中调用它时会发生什么。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2020-01-10
    • 2020-10-24
    相关资源
    最近更新 更多