Как установить значение объекта модели во флаттере и использовать его в FutureBuilder ListView? - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу получить данные из пожарного магазина и отобразить их в виде карточек с помощью ListView. Я желаю, чтобы данные, извлеченные из пожарного хранилища в объекте, можно было использовать повторно на тех же экранах, что и на других экранах, но я не могу этого сделать. Я создал модель и службу базы данных для ее обслуживания;

Я попытался создать карту, в которой можно хранить объекты HomePage. Каждый объект списка создает новую карту, но я не могу назначать значения в объектах. Я попытался использовать оператор print ниже, но никаких выходных данных не было

Любые указания о том, как решить эту проблему, будут очень благодарны.

модель

class HomePage {
  bool confirmed;
  DriverDetails driverDetail;

  HomePage({this.confirmed, this.driverDetails});
}

class DriverDetails {
  String driverUID;
  String driverName;
  String vehicalNumber;
  String vehicalName;
  String timeOfReporting;
  String placeOfReporting;
  LatLng reportingCord;

  DriverDetails({
    this.driverName,
    this.driverUID,
    this.placeOfReporting,
    this.reportingCord,
    this.timeOfReporting,
    this.vehicalName,
    this.vehicalNumber,
  });
}

Служба базы данных

class DatabaseService {
  final Firestore _db = Firestore.instance;
  static DriverDetails driverdetails;
  static bool confirmed;
  Map homeObject = new Map<String, HomePage>();

  HomePage home = new HomePage(
    confirmed: confirmed,
    driverDetail: driverdetails,
  );

  /// Query a subcollection
  Future streamHomePage(FirebaseUser user) async {
    var ref = _db
        .collection('homepage')
        .document(user.uid)
        .collection('h')
        .document('28032020');
    await ref.get(source: Source.serverAndCache).then((ref) => {
          ref.data.forEach((index, value) => {
//            Prints "index = WE10203 and value Swargate and null"
                print(
                    "index = $index and value ${value['dd']['p']} and ${home.driverDetail}"),
                driverdetails.placeOfReporting = value['dd']['p'],
//              The below line prints nothing
                print("driverdetails = $driverdetails"),
                homeObject[index] = home
              }),
        });
    return homeObject;
  }
} }

Экран домашней страницы

           FutureBuilder(
              future: databaseService(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  stringMap = snapshot.data;
                }
                return ListView.builder(
                  itemBuilder: (context, index) {
                    stringMap.forEach((index, value) => {
                          print("The stringMap is ${stringMap.keys.toList()}"),
                        });
                    return HomepageCards(
                      user: widget.user,
                      cardDetails: stringMap[stringMap.keys.toList()[index]],
                    );
                  },
                  itemCount: stringMap.length,
                  scrollDirection: Axis.vertical,
                  controller: _controller,
                  shrinkWrap: true,
                );
              },
            )


  databaseService() async {
    return DatabaseService().streamHomePage(widget.user);
  }

1 Ответ

1 голос
/ 06 апреля 2020

Попробуйте использовать такие модели:

import 'package:cloud_firestore/cloud_firestore.dart';

class EmployeeData {
  final DocumentReference reference;
  String address;
  String designation;
  String email;

EmployeeData.data(
 this.reference, [
 this.address,
 this.designation,
 this.email,
]);

factory EmployeeData.from(DocumentSnapshot document) => EmployeeData.data(
    document.reference,
    document.data['Address'],
    document.data['Designation'],
    document.data['Email'],
  );

void save() {
  reference.setData(toMap());
}

Map<String, dynamic> toMap() {
  return {
  'address': address,
  'designation': designation,
  'email': email,
  };
 }
}

, поэтому, когда у вас есть данные, вы можете использовать вот так:

return StreamBuilder<QuerySnapshot>(
  stream: Firestore().collection('Workers').snapshots(),
  builder: (context, snapshot) {
    if (snapshot.data != null) {
      // Here u will get list of document snapshots
      final List<DocumentSnapshot> documents = snapshot.data.documents;
      final List<EmployeeData> employeeDataList = documents
            .map((snapshot) => EmployeeData.from(snapshot))
            .toList();
      // now u can access each document by simply specifying its number
      // u can also use list view to display every one of them
      return ListView.builder(
        itemCount: documents.length,
        itemBuilder: (context, int index) => Text(employeeDataList[index].email),
      );
    } else {
      // Show loading indicator here
    }
  },
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...