Как сохранить путь к коллекции для модели?

#generics #design-patterns #data-structures #types #dart

#дженерики #шаблоны проектирования #структуры данных #типы #dart

Вопрос:

Я создаю модели для своего приложения в 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 type . Чтобы я мог использовать его позже при выборке моделей:

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

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

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

Комментарии:

1. Если я правильно понимаю, вы хотите жестко закодировать пути, верно, и вам нужно место для хранения путей, почти как перечисление?

2. @ThinkDigital это правильно

3. Понял. Добавление ответа

Ответ №1:

К сожалению, лучший вариант, к которому я пришел, — это создать collectionPath член класса. Вот пример шаблона репозитория для 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');
  

Ответ №2:

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

  1. мои модели/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) может быть доступен программно и динамически. Пока файл, в котором создан этот класс, импортирован, вы можете получить к нему доступ в любом месте.

Комментарии:

1. Спасибо, но, насколько я понимаю, это не вариант. Пожалуйста, посмотрите Future<List<T>> fetchList() Функцию в моем примере. Как динамически искать правильный путь к коллекции в этой функции?

2. @AndreyGordeev вы можете ввести check it. Я обновлю свой ответ.

3. во-первых, какую информацию вы хотите использовать для определения правильного пути?

4. Просто введите. T extends Model .

5. Я имею в виду, какие данные вы хотите использовать для их вычисления? Какую переменную вы хотите использовать для определения T?