Stick
Stick

Reputation: 154

Why is the data I pulled from firebase coming from null?

Patients model dart file;

import 'package:flutter/material.dart';


class Patients {
   String patientId;
   String nurseId;
   String username;
   DateTime date;
   int age;
   List<String> diseases;
  //final fotograf olacak

  Patients({@required this.patientId,this.nurseId,this.date,this.username,this.age,this.diseases});

   factory Patients.fromJson(Map<String, dynamic> json){
      return Patients(
         patientId: json["patientId"],
         nurseId: json["nurseId"],
         username: json["username"],
         date: json["date"],
         age: json["age"],
         diseases: json["diseases"],
      );
   }


   Map<String,dynamic> toMap(){
      return {
         "patientId": patientId,
         "nurseId" : nurseId,
         "username" : username,
         "date" : date,
         "age" : age,
         "diseases" : diseases,
      };
   }
}

PatientsProvider dart file;

import 'package:flutter/material.dart';
import 'package:imlearningfirebase/model/patients.dart';
import 'package:uuid/uuid.dart';

import 'package:imlearningfirebase/services/fireStoreService.dart';


class PatientsProvider with ChangeNotifier{

  final fireStoreService = FireStoreService();

  String _patientId;
  String _nurseId;
  DateTime _date;

  String _username;
  int _age;
  List<String> _diseases;
  var uuid = Uuid();

  ///Getters

  String get username =>_username;
  int get age => _age;
  List<String> get diseases => _diseases;
  DateTime get date => _date;
  Stream<List<Patients>> get getPatients => fireStoreService.getEntries();


  savePatient(int agee,String usernamee,List<String> diseasess){
    if(_nurseId == null){
      ///add
      var newPatient = Patients(patientId: uuid.v1(),nurseId:fireStoreService.getCurrentUserId().toString(),date:DateTime.now(),username: usernamee,age: agee,diseases: diseasess);
      print(newPatient.username);
      fireStoreService.setPatients(newPatient);
    }else{
      var updatedPatients = Patients(patientId: uuid.v1(),nurseId:fireStoreService.getCurrentUserId().toString(),date:DateTime.now(),username: usernamee,age: agee,diseases: diseasess);
      fireStoreService.setPatients(updatedPatients);
    }

  }
}

FireStoreService dart file;

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

/// Local Importlar
import '../model/patients.dart';

class FireStoreService{
  FirebaseFirestore _db = FirebaseFirestore.instance;
  final FirebaseAuth auth = FirebaseAuth.instance;

  ///Get Entries

  Stream<List<Patients>> getEntries(){
    return _db
        .collection("patients")
        .snapshots()
        .map((snapshot) => snapshot.docs
        .map((doc) => Patients.fromJson(doc.data()))
        .toList());
  }}

Home screen;

import 'package:flutter/material.dart';
import 'package:imlearningfirebase/provider/patienstProvider.dart';
import 'package:provider/provider.dart';

class HomePage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    final patientsProvider = Provider.of<PatientsProvider>(context);
    return Scaffold(
      appBar: AppBar(
        title: Text("Patients"),
      ),
      floatingActionButton: Padding(
        padding: const EdgeInsets.fromLTRB(0, 0, 0, 50.0),
        child: FloatingActionButton(
          onPressed: () async {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AddPatient()),
            );
          },
          child: Icon(
            Icons.add,
            color: Colors.blueAccent,
          ),
          backgroundColor: Colors.green,
        ),
      ),
      body:StreamBuilder<List<Patients>>(
        stream: patientsProvider.getPatients,
        builder: (context,snapshot){
          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (context,index){
            return ListTile(
              trailing:
              Icon(Icons.edit, color: Theme.of(context).accentColor),
              title: Text('${DateTime.now()}'

              ),
            );
            }
          );
        }
      )
    );
  }
}

I am trying to create a system where a person has to register and register another person. I created a model so that the registered person creates the profile of the other person. The name of this model is patients. I use the provider package to access patients functions. I have created a function named take patients in Firestore and put it in the patient provider. Finally, I call this on the Home page. but the length came null. I can not see the error I would be glad if you help.

patient model registered in Firestore.

Upvotes: 2

Views: 96

Answers (1)

Brandon Pillay
Brandon Pillay

Reputation: 1166

I didn't use your FireStoreService() class. This might be a bit messy but it worked for me. let me know if it works. Try this:

class PatientsProvider with ChangeNotifier {
  ...
  List<Patients> _patients = [];

  // ///Getters
  ...

  // Stream<List<Patients>> get getPatients => fireStoreService.getEntries();
  List<Patients> get getPatients => _patients;

  FirebaseFirestore _fs = FirebaseFirestore.instance;
  StreamSubscription<QuerySnapshot> _stream;

  PatientsProvider() {
    _stream = _fs.collection('patients').snapshots().listen((snapshot) {
      _patients = [];
      snapshot.docs.forEach((queryDocumentSnapshot) {
        _patients.add(Patients.fromJson(queryDocumentSnapshot.data()));
      });
      notifyListeners();
    });
  }
  @override
  void dispose() {
    super.dispose();
    _stream.cancel();
  }

  // savePatient(int agee, String usernamee, List<String> diseasess) {
  ...
  // }
}

Then instead if creating a streambuilder, the provider will update the list when the data changes:

  @override
  Widget build(BuildContext context) {
    PatientsProvider _provider = Provider.of<PatientsProvider >(context);
    return Scaffold(
      body: ListView.builder(
        itemCount: _provider.getPatients.length,
        itemBuilder: (BuildContext context, int index) {
          return ListTile(
            trailing: Icon(Icons.edit, color: Theme.of(context).accentColor),
            title: Text('${...}'),
          );
        },
      ),
    );
  }

To get more information on the listener see this documentation: https://firebase.google.com/docs/firestore/query-data/listen

Upvotes: 1

Related Questions