Я пытаюсь получить массив карт из моей базы данных - приложение флаттера, но оно застряло в StreamBuilder, если snapshot.hasdata и продолжает загружать индикатор

avatar
Njm Jeb
8 августа 2021 в 19:16
63
2
0

вот как я получаю данные в StreamBuilder

Stream<List<Patient>> get getAllPatients{

return FirebaseFirestore.instance.collection('Patients').snapshots().map(patientsListFromQuerySnapShot);
}

Модель пациентов

class Patient {
  String id,
      name,
      country,
      nationality,
      treatment,
      createdTime,
      addedBy,
  Map<String, dynamic> payments;
  bool paymentStatus;
  int paidAmount, phone;

методpatientsListFromQuerySnapShot:

  List<Patient>  patientsListFromQuerySnapShot(QuerySnapshot querySnapshot){

    return querySnapshot.docs.map((doc) {
      return Patient(
        id: doc['id'],
        treatment: doc['treatment'],
        name: doc['name'],
        country: doc['country'],
        paymentStatus: doc['paymentStatus'],
        phone: doc['phone'],
        payments: doc['payments'],
      );
    }).toList();
  }

закомментирование строки 'payments: doc['payments']' заставляет StreamBuilder работать и получать данные, но я не могу получить список платежей карт, который включает {дата платежа: '', оплаченная сумма: ''} enter image description here

Мой StreamBuilder

return Scaffold(
  drawer: AdminNavigationDrawer(),
  appBar: AppBar(
    title: Text('All Patients'),
  ),
  body: StreamBuilder<List<Patient>>(
    stream: FirebaseApi().getAllPatients,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        var data = snapshot.data;
        return Column(
          children: [
            buildSearch(),
            query == ''
                ? buildAllPatients(data)
                : filteredPatientsNum(data: data).length != 0
                    ? buildFilteredPatients(data)
                    : Center(
                        child: Text('No Patients Found'),
                      ),
          ],
        );
      }
      return Center(child: CircularProgressIndicator());
    },
  ),
);
Источник
Huthaifa Muayyad
8 августа 2021 в 20:10
0

опубликуйте построитель потоков, опубликуйте свои части кода.

Njm Jeb
8 августа 2021 в 20:24
0

@HuthaifaMuayyad я тоже опубликовал StreamBuilder

Ответы (2)

avatar
Sajad Abdollahi
8 августа 2021 в 20:40
1

Проблема в том, что вы пытаетесь назначить список карте

изменить модель пациента

class Patient {
  String id,
      name,
      country,
      nationality,
      treatment,
      createdTime,
      addedBy,
  List<Map<String, dynamic>> payments;
  bool paymentStatus;
  int paidAmount, phone;

а затем анализировать платежи следующим образом

payments: List<Map<String,dyanmic>>.from(doc['payments']),
avatar
Huthaifa Muayyad
8 августа 2021 в 20:38
0

Это решит проблему?

payments: List<Map<String,dyanmic>>.from(doc['payments']),

Какую ошибку вы получаете, прежде чем закомментировать ее.

Njm Jeb
8 августа 2021 в 20:53
0

Это дает мне ошибку "Значение типа "List<Map<String, dynamic>>" не может быть присвоено переменной типа "Map<String, dynamic>"". индикатор и не получение данных из streamBuilder, преобразование платежей в список map<String, dynamic> решило проблему