我在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);
}
这些模型将存储在mymodels
集合中的Google Firestore中:
mymodels/abc
mymodels/def
...
要从Firestore获取这些模型的列表,我需要在某处存储mymodels
类型的集合路径(MyModel
)。所以我以后在获取模型时可以使用它:
Future<List<T>> fetchList() {
// How to know `path` by knowing T?
_firestore.collection('path').getDocuments()
}
在哪里存储该收集路径?我想在Model
界面中声明一个静态属性,但是Dart似乎不允许覆盖静态属性。
Dart注释是否适合这种情况?
不幸的是,我遇到的最好的选择是让collectionPath
成为一名成员。以下是Dart / Flutter的Repository模式示例:
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');
如果您希望保存要在任何地方使用的硬编码变量并且可以用作字符串,则可以使用由静态变量组成的类。假设你在firebase中有一些收藏。
您可以将它们保存在类中:
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)
可以通过编程方式动态访问。只要导入了创建此类的文件,就可以在任何地方访问它。