Почему данные, которые я извлек из firebase, поступают из null?

#firebase #flutter #dart #google-cloud-firestore

#firebase #flutter #dart #google-cloud-firestore

Вопрос:

Файл dart модели пациентов;

 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;

 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;

 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());
  }}
  

Главный экран;

 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()}'

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

Я пытаюсь создать систему, в которой человек должен зарегистрироваться и зарегистрировать другого человека. Я создал модель так, чтобы зарегистрированный пользователь создавал профиль другого пользователя. Название этой модели — пациенты. Я использую пакет поставщика для доступа к функциям пациентов. Я создал функцию с именем take patients в Firestore и поместил ее в поставщика пациентов. Наконец, я вызываю это на домашней странице. но длина стала нулевой. Я не вижу ошибки, я был бы рад, если бы вы помогли.

модель пациента зарегистрирована в Firestore.

Комментарии:

1. В вашем patientsProvider нет никакого метода getPatients. Я прав?

2. @Akif Я случайно удалил вопрос во время подготовки, я отредактировал его сейчас, есть геттеры, как в вопросе.

3. Вы обращаетесь к Firebase Firestore как аутентифицированный пользователь?

4. Вы хотите обновлять пользовательский интерфейс при изменении данных или просто извлекать данные один раз?

5. @BrandonPillay Я хочу обновить данные. Да, я обращаюсь к аутентифицированному пользователю.

Ответ №1:

Я не использовал ваш класс FireStoreService(). Это может быть немного запутанно, но у меня это сработало. дайте мне знать, если это сработает. Попробуйте это:

 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) {
  ...
  // }
}
  

Тогда вместо этого при создании streambuilder поставщик обновит список при изменении данных:

   @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('${...}'),
          );
        },
      ),
    );
  }
  

Для получения дополнительной информации о прослушивателе см. Эту документацию:
https://firebase.google.com/docs/firestore/query-data/listen