Как сохранить путь сбора для модели? - PullRequest
0 голосов
/ 21 апреля 2019

Я строю модели для своего приложения в Dart / Flutter.Вот как выглядит модель:

abstract class Model {
  /// A unique identifier of the model.
  /// Gets generated by Firestore.
  final String id;

  Model(this.id);
}

class MyModel extends Model {
  final String name;
  final String description;
  final int order;

  MyModel(String id, this.name, this.items, this.order) : super(id);
}

Эти модели будут храниться в Google Firestore в коллекции mymodels:

mymodels/abc
mymodels/def
...

Чтобы получить список этих моделей из Firestore, мне нужногде-то хранить путь сбора (mymodels) для типа MyModel.Поэтому я мог бы использовать его позже при извлечении моделей:

Future<List<T>> fetchList() {
  // How to know `path` by knowing T?
  _firestore.collection('path').getDocuments()
}

Где хранить этот путь сбора?Я думал объявить статическое свойство в интерфейсе Model, но Дарт, похоже, не позволяет переопределить статические свойства.

Подойдут ли для этого аннотации Dart?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

К сожалению, лучший вариант, к которому я пришел, - сделать collectionPath членом класса. Вот пример шаблона Repository для Dart / Flutter:

class FirebaseRepository<T extends Model> extends Repository<T> {
  final Firestore _firestore;
  final String _collectionPath;

  FirebaseRepository(this._firestore, this._collectionPath)
      : assert(_firestore != null),
        assert(_collectionPath != null);

  @override
  Future<List<T>> fetchList() async {
    final snapshot =
        await _firestore.collection(_collectionPath).getDocuments();
    // TODO: Map snapshot documents to [T] and return.
  }

Использование:

final Repository<MyModel> repository = FirebaseRepository(_firestore, 'mymodels');
0 голосов
/ 28 апреля 2019

Если вы хотите сохранить жестко запрограммированные переменные, которые вы хотите использовать повсюду и которые можно использовать как строки, вы можете использовать класс, состоящий из статических переменных.Скажем, у вас есть несколько коллекций в FireBase.

  1. mymodels / modelA
  2. mymodels / modelB
  3. mymodels / exampleC
  4. mymodels / exampleD

Вы можете сохранить их в классе следующим образом:

class Path {
    static String modelA = "mymodels/modelA";
    static String modelB = "mymodels/modelB";
    static String exampleC = "mymodels/exampleC";
    static String exampleD = "mymodels/exampleD";
}

, а затем получить к ним доступ в своем коде, и он будет преобразован в String.Например: Firestore.instance.collection(Path.modelA) может быть доступен программно и динамически.Пока импортируется файл, в котором создан этот класс, вы можете получить к нему доступ в любом месте.

...