Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding an Object to Cloud Firestore using Flutter

I want to add an object to Google Cloud Firestore in my Flutter app like this:

Firestore image

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

like image 486
Laksh22 Avatar asked Jul 04 '18 09:07

Laksh22


People also ask

How do I store items in firestore Flutter?

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.

Can you add Cloud Firestore to a flutter application?

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.

How do I write data to Cloud Firestore?

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.

What is Cloud Firestore in Swift?

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 = {

How do I filter documents within a collection in FireStore?

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.


2 Answers

Null safe code:

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'));
like image 64
CopsOnRoad Avatar answered Oct 25 '22 07:10

CopsOnRoad


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
}
like image 23
blaneyneil Avatar answered Oct 25 '22 06:10

blaneyneil