#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.
- мои модели/ModelA
- mymodels/ModelB
- mymodels/exampleC
- 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?