如何使用具有 Null 安全性的 FlutterFire Firestore 和 Flutter 2.0 从 Firebase 获取数据

Posted

技术标签:

【中文标题】如何使用具有 Null 安全性的 FlutterFire Firestore 和 Flutter 2.0 从 Firebase 获取数据【英文标题】:How do I get data from Firebase using FlutterFire Firestore and Flutter 2.0 with Null Safety 【发布时间】:2021-07-27 18:08:44 【问题描述】:

我收到代码“snapshot.Data()”的错误。这是对 Firestore 的重大更改之一,快照现在属于“DocumentSnapshot”类型。

中断:通过数据获取器获取快照的数据现在通过 data() 方法完成。

新文档中提供的示例对我没有帮助。

“参数类型'对象?'不能赋值给参数类型'Map'"

我尝试了许多组合,但我无法摆脱错误。另外,我没有使用流,我只想读取单个记录。

代码如下:

var snapshot = await _reference.doc(_user.uid).get();
return UserData.fromMap(snapshot.data());

这里是模型“fromMap”:

factory UserData.fromMap(Map<String, dynamic> map) 
    return UserData(
      birthday: DateTime.fromMillisecondsSinceEpoch(map['birthday']),
      gender: map['gender'],
      isDarkMode: map['isDarkMode'],
      isMetric: map['isMetric'],
      name: map['name'],
      password: map['password'],
    );
  

【问题讨论】:

你在哪里得到这个错误?如,哪段代码抛出错误?这只是一些缺少类型错误和可为空的问题。可以通过显式类型转换让编译器知道它是 Map 来修复类型。 【参考方案1】:

好的,找到了我的问题。我有这样定义的“_reference”:

final  CollectionReference _reference = FirebaseFirestore.instance.collection('users');

我应该这样做:

final  CollectionReference<Map<String, dynamic>> _reference = FirebaseFirestore.instance.collection('users');

或者只是这样:

  final _reference = FirebaseFirestore.instance.collection('users');

【讨论】:

【参考方案2】:

改成这样:

factory UserData.fromMap(Map<String, dynamic>? map) //added a "?" after dynamic.

这使您的 fromMap 方法接受可为空的值,理论上,如果文档不存在,您的 firebase 查询可以返回 null。

【讨论】:

以上是关于如何使用具有 Null 安全性的 FlutterFire Firestore 和 Flutter 2.0 从 Firebase 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter null 安全性处理生成的代码?

如何在 <Offsets> 列表中添加空值? null 不能添加,因为颤振 null 安全

如何在全球范围内忽略具有恢复响应的 Null 字段?

如何在具有 null 值的 Angular 选择元素上使用默认的“请选择”选项进行验证?

如何简化 null 安全的 compareTo() 实现?

具有动态模型的 Dapper ORM - 如何不返回字段而不是“字段”= NULL?