I want to add an object to Google Cloud Firestore in my Flutter app like this:
I have already made a Reply class:
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;
}
}
How do I add a Reply object to cloud Firestore?
Edit:
Just to clarify, I want to create a field with the data type Object
which has fields inside it: Reply Object Image
Data in the Firestore can be sent only as a Map object. So, you need to convert your CartItem object in the form of Map . The toJson method will allow you to convert your CartItem object in Map object that can be uploaded to Firebase.
Peter Follow Software Developer | Technical Writer | Actively helping users with their questions on Stack Overflow. Occasionally I post here and on other platforms. In this article, we will add Cloud Firestore to a Flutter application, perform different read, write operation and use some queries to retrieve data.
There are several ways to write data to Cloud Firestore: Set the data of a document within a collection, explicitly specifying a document identifier. Add a new document to a collection. In this case, Cloud Firestore automatically generates the document identifier.
Cloud Firestore lets you write a variety of data types inside a document, including strings, booleans, numbers, dates, null, and nested arrays and objects. Cloud Firestore always stores numbers as doubles, regardless of what type of number you use in your code. Web v8 Web v9 Swift Objective-C Java More var docData = {
Cloud Firestore offers advanced capabilities for querying collections. Queries work with both one-time reads or subscribing to changes. To filter documents within a collection, the where method can be chained onto a collection reference. Filtering supports equality checks and "in" queries.
Say this is your object.
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,
};
}
}
To add this object to the cloud firestore, do:
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'));
first, i highly recommend you have a single file that defines all of your schemas and/or models so there's a single point of reference for your db structure. like some file named 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,
};
}
and make the field that you want to be an object type Map. then, on the page you're going to insert into the db, import dbSchema.dart and create a new model:
Replies _replyObj = new Replies(
title: _topic,
coordinates: _coordinates,
);
this assumes you've defined your local _coordinates (or whatever) object prior to this, with something like :
_coordinates = {
'lat': '40.0000',
'lng': '110.000',
};
and to then insert into Firestore, add the object's toJson method (you cannot insert/update a plain Dart model):
CollectionReference dbReplies = Firestore.instance.collection('replies');
Firestore.instance.runTransaction((Transaction tx) async {
var _result = await dbReplies.add(_replyObj.toJson());
....
Update (5/31)
To convert the document read back into an object you need to add a fromJson
to the class, like so:
Replies.fromJson(Map parsedJson) {
id = parsedJson['id']; // the doc ID, helpful to have
title = parsedJson['title'] ?? '';
coordinates = parsedJson['coordinates'] ?? {};
}
so when you query the db:
QuerySnapshot _repliesQuery = await someCollection
.where('title', isEqualTo: _title)
.getDocuments();
List<DocumentSnapshot> _replyDocs = _repliesQuery.documents;
you can create an object out of each snapshot:
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With