v1.0.0
firestore_model
Firestore Model 透過模型資料輕鬆使用 Firestore 集合
30喜歡 99近 30 天下載140Pub 分數
AndroidiOSWebmacOSWindows
Firestore Model 易於使用的 Firestore 集合與模型資料
{"sdk":"flutter"}^2.2.0^4.0.5{"sdk":"flutter"}以下為英文專案原文快照,最新內容請造訪 GitHub。
Easy way to use firestore collection with data model
In your project's pubspec.yaml file,
# pubspec.yaml
dependencies:
firestore_model: ^<latest version>
void main() async {
await FirebaseApp.initializeApp(
settings: FirestoreModelSettings(
//persistenceEnabled: true,
));
runApp(MyApp());
}
UserFirestoreModel with your model Typeclass User extends FirestoreModel<User> {
}
toMap && responseBuilderclass User extends FirestoreModel<User> {
String? firstName;
String? lastName;
User({this.firstName, this.lastName});
// use to read
User.fromMap(Map<String, dynamic> map) {
this.firstName = map['first_name'];
this.lastName = map['last_name'];
}
// use to write
@override
Map<String, dynamic> get toMap => {
'first_name': this.firstName,
'last_name': this.lastName,
};
@override
ResponseBuilder<User> get responseBuilder => (map) => User.fromMap(map);
}
users.collectionName in your model.@override
String get collectionName => 'users';
FirestoreModel.inject(User());
FirestoreModel.injectAll([User()]);
FirestoreModel.use<User>();
To Write in data base:
User user = User(firstName: "Mohamed", lastName: "Abdullah 3");
create method from your model like this:user.create();
user.create(docId: 'hdoihvnoirejiu9345j');
save:user.firstName = 'new firstname';
user.save()
update:user.update(data: {
"first_name": "Mohamed",
"last_name": "Abdullah"
})
update by pass docId:FirestoreModel.use<User>().update(
docId: 'hdoihvnoirejiu9345j',
data: {
"first_name": "Mohamed",
"last_name": "Abdullah"
})
delete:user.delete();
delete by pass docId:FirestoreModel.use<User>().delete(docId: 'hdoihvnoirejiu9345j')
exists by docId:bool isExists = await FirestoreModel.use<User>().exists('hdoihvnoirejiu9345j')
find:User user = await FirestoreModel.use<User>().find('hdoihvnoirejiu9345j')
streamFind:Stream<User> streamUser = FirestoreModel.use<User>().streamFind('hdoihvnoirejiu9345j')
all:List<User> users = await FirestoreModel.use<User>().all()
streamAll:Stream<List<User>> streamUsers = FirestoreModel.use<User>().streamAll()
first:where orderBy or any query buildr methods:User firstUser = await FirestoreModel.use<User>().first(
queryBuilder: (query) => query.where('score', isGreaterThan: 100)
.orderBy('score', descending: true)
);
get:where orderBy or any query buildr methods:List<User> topUsers = await FirestoreModel.use<User>().get(
queryBuilder: (query) => query.orderBy('score', descending: true).limit(10)
);
streamGet:Stream<List<User>> topUsers = await FirestoreModel.use<User>().streamGet(
queryBuilder: (query) => query.orderBy('score', descending: true).limit(10)
);
paginate.where orderBy or any query buildr methods.perPage in your call or set in your modelList<User> topUsers = await FirestoreModel.use<User>().paginate(
perPage: 15,
queryBuilder: (query) => query.orderBy('score', descending: true),
);
streamPaginate:Stream<List<User>> topUsers = await FirestoreModel.use<User>().streamPaginate(
perPage: 15,
queryBuilder: (query) => query.orderBy('score', descending: true),
);
ModelSingleBuilder: get first or find by docId.ModelSingleBuilder<User>(
// your query to get first result
query: (q) => q.orderBy('createdAt'),
// pass document id if you need to get only this document
docId: 'iuiouurpoeuriqwe',
builder: (_, snapshot) {
// your widget
});
ModelGetBuilder: get documents with any query.ModelGetBuilder<User>(
// your query to get results
query: (q) => q.orderBy('createdAt'),
builder: (_, snapshot) {
// your list builder
});
ModelStreamGetBuilder: stream get documents with any query.ModelStreamGetBuilder<User>(
// your query to stream results
query: (q) => q.orderBy('createdAt'),
builder: (_, snapshot) {
// your list builder
});
ModelStreamSingleBuilder: stream first or find by docId.ModelStreamSingleBuilder<User>(
// your query to stream first result
query: (q) => q.orderBy('createdAt'),
// pass document id if you need to stream only this document
docId: 'iuiouurpoeuriqwe',
builder: (_, snapshot) {
// your widget
});
you can listen to any builder:
* onLoading => fire when builder is loading.
* onChange => fire when your data in stream builder changed.
* onSuccess => fire when builder return data
* onError => fire if error in query
* onEmpty => fire if builder success but data is empty
onChange: () {
print("Data Change");
},
onLoading: () {
return Center(
child: Text("Loading"),
);
},
onEmpty: () => Center(
child: Text("Sorry Your List is Empty"),
),
onSuccess: (data) {
//return builder widget;
},
onError: (error) => print("Error $error"),
increment: increment field value// this increase user score by 1;
user.increment(field: 'score');
// this increase user score by 2;
user.increment(field: 'score', value: 2);
decrement: decrement field value// this decrease user score by 1;
user.decrement(field: 'score');
// this decrease user score by 2;
user.decrement(field: 'score', value: 2);
arrayUnion: union elements to array// append 'kotlin' to user languages
user.arrayUnion(field: 'languages', elements: ['kotlin']);
arrayRemove: remove elements from array// remove 'kotlin' from user languages
user.arrayRemove(field: 'languages', elements: ['kotlin']);
remove: remove field from document// remove 'languages' field from user document
user.remove(field: 'languages');
SubCollection is a collection associated with a specific document.
Model for SubCollection and extends model with SubCollectionModel with your model Type:class Post extends SubCollectionModel<Post> {
}
toMap && responseBuilderposts.subCollectionName in your model@override
String get subCollectionName => 'posts';
Post post = user.subCollection<Post>();
post.title = "new test Title For post ${DateTime.now()}";
post.description = "Description Title in post Sub collection";
post.create();
// use `update` to update document in subCollection
post.update(data: {'title': 'updated title'});
// or you can use `save`
post.description = 'new description';
post.save();
SubCollectionModel you can work as any FirestoreModelparentModelModelStreamGetBuilder<Post>(
// parent model for Post SubCollectionModel
parentModel: user,
builder: (_, snapshot) {
// your list builder
}
);