TypeError:无法读取 null 的属性“Symbol(dartx._get)”(在 Flutter 中添加 Firestore 侦听器时)

Posted

技术标签:

【中文标题】TypeError:无法读取 null 的属性“Symbol(dartx._get)”(在 Flutter 中添加 Firestore 侦听器时)【英文标题】:TypeError: Cannot read property 'Symbol(dartx._get)' of null (in Flutter when adding Firestore Listener) 【发布时间】:2021-04-09 19:16:05 【问题描述】:

我无法向我的 Firestore 文档添加侦听器。我收到上述错误,我不明白是什么原因造成的。我的代码如下:

 StreamSubscription<DocumentSnapshot> listener;

  @override
  void initState() 
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_)
      _initListener();
    );
  

  _initListener() async 
    listener = FirebaseFirestore.instance
        .collection('Ref to my collection path')
        .doc('status')
        .snapshots()
        .listen((DocumentSnapshot documentSnapshot) 
            Map<String, dynamic> firestoreInfo = documentSnapshot.data();
            setState(() 
              paid = firestoreInfo['status'];
            );
            if(paid) Navigator.pop(context);
          );
      listener.onError((handleError)
      if(DEBUG) print('Cannot attach listener: Error: $handleError');
    );
  

  @override
  void dispose() 
    listener.cancel();
    super.dispose();
  

编辑:我的构建方法如下: 我正在使用网络视图插件来显示付款页面。我的目的是读取 firebase 上的数据并查看数据何时更新,然后转到付款成功或付款失败页面。

@override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        iconTheme: IconThemeData(
          color: Colors.white, //change your color here
        ),
        elevation: 0.0,
        title: Text("PAYMENT", style: Header),
        backgroundColor: Provider.of<CP>(context, listen: false).primary,
      ),
      backgroundColor: Color(0xfff6f7f8),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(13.0),
            child: Text('Please enter your payment details'),
          ),
          Expanded(
            child: Container(
              padding: EdgeInsets.all(20),
              child: EasyWebView(
                onLoaded: (),
                src: 'PATH FOR PAYMENT URL',
                ishtml: false, // Use Html syntax
                isMarkdown: false, // Use markdown syntax
                convertToWidgets: false, // Try to convert to flutter widgets
                width: MediaQuery.of(context).size.width,
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(13.0),
            child: Text('Your payment info is encrypted and protected by STRIPE', style: TextStyle(fontSize: 12, fontStyle: FontStyle.italic),),
          ),
        ],
      ),
    );
  

【问题讨论】:

发布您的build 方法或整个页面 @dm_tr 添加了构建方法 【参考方案1】:

我认为你的问题在这里:

.listen((DocumentSnapshot documentSnapshot) 
            Map<String, dynamic> firestoreInfo = documentSnapshot.data();
            setState(() 
              paid = firestoreInfo['status'];
            );
            if(paid) Navigator.pop(context); // issue
          );

您注意到paid 没有在 setState 之外初始化,所以您的 if 语句没有对 paid 的指责。改成这样:

.listen((DocumentSnapshot documentSnapshot) 
            Map<String, dynamic> firestoreInfo = documentSnapshot.data();
            setState(() 
              paid = firestoreInfo['status'];
            );
            if(firestoreInfo['status']) Navigator.pop(context);
        );

如果您有任何问题或者这没有解决您的问题,请在下方评论

【讨论】:

@Damandriod 这解决了你的问题吗?如果是,请点赞并标记为已接受。 您的回答给了我一个起点。我已经投票了。 太棒了,很高兴为您提供帮助【参考方案2】:

所以,问题在于 paid = firestoreInfo['status']; 返回 null。一我把空检查到位,错误就消失了。付费变量全局初始化为 false。

【讨论】:

【参考方案3】:

我不是为这个特定问题写这个答案,而是为任何在使用 Firebase 和 Flutter 时遇到此 TypeError: Cannot read properties of null (reading 'Symbol(dartx.***)') 错误的人写。我无法获取字段或访问任何文档或集合,唯一出现的就是这个错误。

除了一件小事,一切都准备好了:

Firebase 控制台 > Firestore 数据库 > 规则 > 第 5 行:从 allow read, write: if false;allow read, write: if true;

我试图在没有用户登录的情况下访问数据,所以唯一必须更改的是这个。我希望有一天这对某人有所帮助。

【讨论】:

以上是关于TypeError:无法读取 null 的属性“Symbol(dartx._get)”(在 Flutter 中添加 Firestore 侦听器时)的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取 null 的属性(读取“classList”)

TypeError:无法读取 null 的属性(读取“1”)

TypeError:无法读取 null 的属性“userID”

TypeError:无法读取 null 的属性(读取“classList”)反应

TypeError:无法读取 null 的属性“uid”

× TypeError: 无法读取 null 的属性“名称”