使用 Flutter 向 Cloud Firestore 添加对象
Posted
技术标签:
【中文标题】使用 Flutter 向 Cloud Firestore 添加对象【英文标题】:Adding an Object to Cloud Firestore using Flutter 【发布时间】:2018-12-12 16:42:08 【问题描述】:我想在我的 Flutter 应用中向 Google Cloud Firestore 添加一个对象,如下所示:
我已经做了一个回复类:
class Reply
Reply(this.replyName, this.replyText, this.replyVotes);
final String replyName;
final String replyText;
final String replyVotes;
String getName()
return replyName;
String getText()
return replyText;
String getVotes()
return replyVotes;
如何将回复对象添加到云 Firestore?
编辑:
澄清一下,我想创建一个数据类型为 Object
的字段,其中包含字段:Reply Object Image
【问题讨论】:
您是否尝试过添加Map
?
如何使用地图在 Firestore 文档中创建新对象?我可以使用地图在文档中添加值,但不能创建具有这些值的对象。
【参考方案1】:
首先,我强烈建议您使用一个文件来定义您的所有模式和/或模型,这样您的数据库结构就有一个单一的参考点。像一些名为 dbSchema.dart 的文件:
import 'package:meta/meta.dart';
class Replies
final String title;
final Map coordinates;
Replies(
@required this.title,
@required this.coordinates,
);
Map<String, dynamic> toJson() =>
'title': title,
'coordinates': coordinates,
;
并将您希望成为对象类型 Map 的字段。然后,在您要插入数据库的页面上,导入 dbSchema.dart 并创建一个新模型:
Replies _replyObj = new Replies(
title: _topic,
coordinates: _coordinates,
);
假设您在此之前已经定义了本地 _coordinates(或其他)对象,例如:
_coordinates =
'lat': '40.0000',
'lng': '110.000',
;
然后插入 Firestore,添加对象的 toJson 方法(不能插入/更新普通的 Dart 模型):
CollectionReference dbReplies = Firestore.instance.collection('replies');
Firestore.instance.runTransaction((Transaction tx) async
var _result = await dbReplies.add(_replyObj.toJson());
....
更新 (5/31)
要将读取的文档转换回对象,您需要在类中添加fromJson
,如下所示:
Replies.fromJson(Map parsedJson)
id = parsedJson['id']; // the doc ID, helpful to have
title = parsedJson['title'] ?? '';
coordinates = parsedJson['coordinates'] ?? ;
所以当你查询数据库时:
QuerySnapshot _repliesQuery = await someCollection
.where('title', isEqualTo: _title)
.getDocuments();
List<DocumentSnapshot> _replyDocs = _repliesQuery.documents;
您可以从每个快照中创建一个对象:
for (int _i = 0; _i < _replyDocs.length; _i++)
Replies _reply = Replies.fromJson(_replyDocs[_i].data);
_reply.id = _replyDocs[_i].documentID;
// do something with the new _reply object
【讨论】:
不错的答案。添加一些有关将 Firestore 读取文档转换回 Dart 模型的详细信息可能会有所帮助。 很好的答案,有用且直接。 +1 @KrishnaShetty 反馈。对于反向过程有额外的帮助会很棒。有人会这么好心帮忙吗? 更新为包含从文档读回对象的映射。 即在Replies
对象中有 2 个属性的情况。如果你有更多呢?【参考方案2】:
您可以像这样运行Firestore
事务:
Firestore.instance.runTransaction((transaction) async
await transaction.set(Firestore.instance.collection("your_collection").document(),
'replyName': replyName,
'replyText': replyText,
'replyVotes': replyVotes,
);
);
【讨论】:
使用此方法,我可以向文档添加值。相反,我想做的是在存储这些值的 Firestore 文档中创建一个对象。 你不能不在另一个文档中创建一个文档(对象),首先你应该创建一个集合。集合 > 文档 > 集合 > 文档 ... 如何访问 Flutter 中的子集合?【参考方案3】:空安全码:
说这是你的对象。
class MyObject
final String foo;
final int bar;
MyObject._(required this.foo, required this.bar);
factory MyObject.fromJson(Map<String, dynamic> data)
return MyObject._(
foo: data['foo'] as String,
bar: data['bar'] as int,
);
Map<String, dynamic> toMap()
return
'foo': foo,
'bar': bar,
;
要将此对象添加到 Cloud Firestore,请执行以下操作:
MyObject myObject = MyObject.fromJson('foo' : 'hi', bar: 0); // Instance of MyObject.
var collection = FirebaseFirestore.instance.collection('collection');
collection
.add(myObject.toMap()) // <-- Convert myObject to Map<String, dynamic>
.then((_) => print('Added'))
.catchError((error) => print('Add failed: $error'));
【讨论】:
【参考方案4】:@Laksh22 据我了解,您的意思是这样的:
Firestore.instance.runTransaction((transaction) async
await transaction.set(Firestore.instance.collection("your_collection").document(),
'reply' :
'replyName': replyName,
'replyText': replyText,
'replyVotes': replyVotes,
);
就像上面的截图一样。
【讨论】:
以上是关于使用 Flutter 向 Cloud Firestore 添加对象的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Cloud Pub Sub - 如何创建一个持续监听消息的 StreamingPull?
Flutter 上传列表到 Google Firestore
尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数