У меня есть документ в Firestore, в котором есть ссылка на другой документ в Firestore, я хотел бы вызвать конструктор для первого документа, и он одновременно создает ссылочный документ.Кажется, я застрял с использованием Future, когда не могу использовать Future (в конструкторе).
Есть ли способ заставить конструктор ClassA преобразовать DocumentReference ClassB в ClassB (возможно, через ClassB.fromSnapshot ())?
В ClassA я пробовал ClassB.fromRef (DocumentReference), но в ClassB должен возвращать Future, и, насколько я знаю, вы не можете делать Futures в конструкторе.В решениях, которые я видел, они передают часть Future в пользовательский интерфейс, вызывающий ClassA, но я не уверен, как бы я обработал виджет Text таким образом (Text (await classA.classB.toString ())?)
Я могу получить DocumentReference для разрешения с помощью .then (), но я не могу вызвать setState из этой модели (что имеет смысл, это модель, а не представление).Единственный способ увидеть, как это работает, это если со стороны моего представления я сохраняю массив строк для отображения в ListView и выполняю .then (setState ()), но это действительно брутто ...
Полагаю, я хочу иметь возможность ListView
(Item
) с ClassA classA = ClassA.fromSnapshot(shapshot);
и вызывать classA.classB.name
.
. 2 класса следующие:
ClassA.dart:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:msd/models/ClassB.dart';
class ClassA {
/// The firestore ID
String id;
String name;
ClassB classB;
String status;
DocumentReference reference;
ClassA({id, name, classB, status, reference}) {
this.id = id;
this.name = name;
this.classB = classB;
this.status = status;
this.reference = reference;
}
ClassA.fromMap(Map<String, dynamic> map, String id, {this.reference}) {
id = id;
name = map['name'];
status = map['status'];
classB = ClassB.fromRef(map['classB']);
}
ClassA.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, snapshot.documentID, reference: snapshot.reference);
String toString() {
return 'ClassA $name at $ClassB';
}
}
ClassB.dart:
import 'package:cloud_firestore/cloud_firestore.dart';
class ClassB {
/// The firestore ID
String id;
String code;
String email;
String name;
String phone;
DocumentReference reference;
ClassB({id, code, email, name, phone, address, reference}) {
this.id = id;
this.code = code;
this.email = email;
this.name = name;
this.phone = phone;
this.reference = reference;
}
ClassB.fromMap(Map<String, dynamic> map, String id, {this.reference})
: assert(map['code'] != null),
assert(map['email'] != null),
assert(map['name'] != null),
assert(map['phone'] != null),
assert(map['address'] != null),
id = id,
code = map['code'],
email = map['email'],
name = map['name'],
phone = map['phone'];
ClassB.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, snapshot.documentID, reference: snapshot.reference);
static Future<ClassB> fromRef(DocumentReference ref) async {
DocumentSnapshot snapshot = await ref.get();
return ClassB.fromSnapshot(snapshot);
}
String toString() {
return '$name <$code>';
}
}