Arpit
Arpit

Reputation: 110

How do I make a subcollection of user data in Firebase?

I'm creating an Hospital App in flutter. My goal is to configure firebase in such a way that the root collection is named User/uid(uid which is automatically generated when user is created)/someText/documentID(automatically generated by Firebase). This is my code:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:mgm_app/models/vaccList.dart';


class DatabaseService {
  final String uid;
  DatabaseService({this.uid});

  CollectionReference userReg = Firestore.instance.collection('User');
  CollectionReference vaccTaken = Firestore.instance.collection('User').document(uid).collection('Vaccine Administered');

  Future regUserData(String email) async {
    return await userReg.document(uid).setData({
      'email': email,
    });
  }

  Future updateUserData(String vaccName,String dateAdmin) async {
  return await vaccTaken.document().setData({
     'name': vaccName,
      'vaccine given': dateAdmin,
  }
 );
  }

When a new user registers, a document with their uid is automatically created in the User collection. But when I'm trying to enter some personal data in the folder User/uid/VaccineAdmnistered, I am not able to pass the value of the current user uid on this line of code

Firestore.instance.collection('User').document(uid).collection('Vaccine Administered');

The error i'm getting is

Only static members can be accessed in initializers.

Upvotes: 0

Views: 513

Answers (1)

Peter Haddad
Peter Haddad

Reputation: 80914

You are using the uid inside the method document before the constructor is called. Therefore do the following:

class DatabaseService {
  final String uid;
  DatabaseService({this.uid});

  CollectionReference vaccTaken = Firestore.instance.collection('User');
  Future regUserData(String email) async {
    return await vaccTaken.document(uid).setData({
      'email': email,
    });
  }

  Future updateUserData(String vaccName,String dateAdmin) async {
  return await vaccTaken.document(uid).collection('Vaccine Administered').document().setData({
     'name': vaccName,
      'vaccine given': dateAdmin,
  }
 );
  }

Create a variable vaccTaken which will reference the collection User, then inside the method updateUserData access the uid.

Upvotes: 1

Related Questions