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”