v1.0.0
firestore_model
Firestore Model fácil de usar coleções do Firestore com dados do modelo
30Curtidas 99Downloads em 30 dias140Pontos Pub
AndroidiOSWebmacOSWindows
Firestore Model fácil de usar coleções do Firestore com dados do modelo
{"sdk":"flutter"}^2.2.0^4.0.5{"sdk":"flutter"}Texto original em inglês. Visite o GitHub para a versão atual.
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
}
);