Flutter Firebase 在 null 上调用了方法“数据”

Posted

技术标签:

【中文标题】Flutter Firebase 在 null 上调用了方法“数据”【英文标题】:Flutter Firebase The method 'data' was called on null 【发布时间】:2021-12-18 03:03:58 【问题描述】:

我正在使用 Firestore,并尝试通过 Streambuilder 获取流。 但是,发生了这个错误。

The following NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot<Object>> 
(dirty, state: _StreamBuilderBaseState<DocumentSnapshot<Object>, 
AsyncSnapshot<DocumentSnapshot<Object>>>#32fdb):
The method 'data' was called on null.
Receiver: null
Tried calling: data()

这是我的代码。

    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:flutter/material.dart';
    
    class UserDetailPage extends StatefulWidget 
      String uid;
      UserDetailPage(this.uid);
    
      @override
      _UserDetailPageState createState() => _UserDetailPageState();
    
    
    class _UserDetailPageState extends State<UserDetailPage> 
      final List<String> datas = <String>['a', 'b', 'c', 'd', 'e', 'f', 'g', '1', '2','3', '4', '5', '6'];
      CollectionReference userstream = FirebaseFirestore.instance.collection('users');
    
      @override
      void initState() 
        super.initState();
    
      
    
    
      @override
      Widget build(BuildContext context) 
        return Scaffold(
          appBar: AppBar(
            title: Text('User Detail'),
          ),
          body:_buildBody(),
        );
      
    
     _buildBody() 
    
        return StreamBuilder(
          stream: userstream.doc(widget.uid).snapshots(),
          builder: (context, snapshot)
            Map<String, dynamic> user_data =snapshot.data.data();
            if(snapshot.hasError)
              return Text('ERROR');
            
            if (snapshot.connectionState == ConnectionState.waiting) 
              return Center(child: CircularProgressIndicator());
            
    
            return Padding(
              padding: const EdgeInsets.all(20.0),
              child: ListView.separated(
                padding: EdgeInsets.only(left: 20, right: 20),
                itemCount: 13,
                separatorBuilder: (BuildContext context, int index) => const Divider(),
                itemBuilder: (BuildContext context, int index)
                  return Center(
                    child: Container(
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                          Text(datas[index]),
                          Text(user_data[datas[index]] is int?user_data[datas[index]].toString():user_data[datas[index]])
                        ],
                      ),
                    ),
                  );
                
              )
            );
          ,
        );
      
    

有趣的是,这个错误发生后,我想要的结果立即出现在应用程序上。 所以我认为问题出现在 initstate() 中,但我不知道到底是什么问题。

顺便说一下,这个页面是从

UserDetailPage( doc.get('uid')!=null?doc.get('uid'):'5AJUsH5LYaQcBiTtO5MA7d6OKx72');

【问题讨论】:

【参考方案1】:

AsyncSnapshot 包装异步加载的数据。在不检查数据是否可用的情况下调用snapshot.data(就像您在下面的代码中所做的那样),意味着您忽略了这一事实,最好不要使用StreamBuilder

  stream: userstream.doc(widget.uid).snapshots(),
  builder: (context, snapshot)
    Map<String, dynamic> user_data =snapshot.data.data();

realtime listeners 上的 FlutterFire 文档中显示了处理流的正确方法。您需要进行的更改是您只在所有检查之后调用snapshot.data,而不是在它们之前:

  builder: (context, snapshot)
    if(snapshot.hasError)
      return Text('ERROR');
    
    if (snapshot.connectionState == ConnectionState.waiting) 
      return Center(child: CircularProgressIndicator());
    
    Map<String, dynamic> user_data =snapshot.data.data();
  

【讨论】:

以上是关于Flutter Firebase 在 null 上调用了方法“数据”的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 在 null 上调用了方法“数据”

在 null Flutter Firebase 上调用了 getter 'documents' [重复]

Firebase 云函数在 Flutter 中返回 null,因为它仍在运行

Flutter Firebase auth 用户在设备上不是持久的

Flutter error:尝试在空对象引用上调用虚方法'void com.google.firebase.auth.internal.zzab.zzf(int)',null(示例代码

Flutter firebase 登录用户在登录后返回 NULL currentUser