Флаттер будущего в конструкторе - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть документ в 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>';
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...