Итак, я попытался создать классы моделей, аналогичные rails, laravel или другим фреймворкам, чтобы лучше организовать свой код, и я хотел добавить методы экземпляра для сохранения данных в базе данных, вот мой класс. Однако, по какой-то причине, когда я вызываю метод save в моем классе событий. Я получаю эту ошибку MissingPluginException (не найдена реализация для метода DocumentReference # setData на канале plugins.flutter.io/cloud_firestore).
Я попытался запустить очистку флаттера, после поиска в Google, обновления флаттера, удаления приложения и запуска пакетов получить и ничего не получалось. Наконец, я попытался создать обычную функцию внутри моего компонента виджета, чтобы создать новый документ и добавить данные. Функция работала нормально без ошибок. Кроме того, да, я сделал соответствующий импорт импорта облачного пожарного хранилища в свой класс событий, а также geoflutterfire. Почему я получаю сообщение об ошибке и есть ли способ организовать мой код? Разве методы firestore не работают в файлах dart, которые не являются виджетами, которые наследуются от виджетов без состояния или статичных виджетов? Я попытался импортировать пакеты с дротиками для фундамента и материала, и они оба были закрашены Firestore, а мой класс privateEvent явно не использовал его.
final bool feedbackLocationOrActivity;
final String id;
final bool feedbackTimeAndDate;
final String name;
final String mediaUrl;
final String address;
final DateTime startTime;
final DateTime endTime;
List categories;
final String creatorId;
final String groupId;
final GeoFirePoint location;
List coHosts;
final String details;
final bool guestsCanInviteFriends;
PrivateEvent(
{this.feedbackLocationOrActivity,
this.id,
this.feedbackTimeAndDate,
this.name,
this.mediaUrl,
this.address,
this.startTime,
this.endTime,
this.categories,
this.creatorId,
this.location,
this.coHosts,
this.guestsCanInviteFriends,
this.details,
this.groupId});
factory PrivateEvent.fromDocument(DocumentSnapshot doc) {
return PrivateEvent(
id: doc['id'],
feedbackLocationOrActivity: doc['feedbackLocationOrActivity'],
feedbackTimeAndDate: doc['feedbackTimeAndDate'],
name: doc['name'],
mediaUrl: doc['mediaUrl'],
address: doc['address'],
startTime: doc['startTime'],
endTime: doc['endTime'],
categories: doc['categories'],
creatorId: doc['creatorId'],
groupId: doc['groupId'],
coHosts: doc['coHosts'],
guestsCanInviteFriends: doc['guestsCanInviteFriends'],
details: doc['details'],
location: doc['location']);
}
save() async {
return Firestore.instance
.collection('privateEvents')
.document(this.groupId)
.collection("events")
.add({
"id": this.id,
"feedbackLocationOrActivity": this.feedbackLocationOrActivity,
"feedbackTimeAndDate": this.feedbackTimeAndDate,
"name": this.name,
"mediaUrl": this.mediaUrl,
"address": this.address,
"startTime": this.startTime,
"endTime": this.endTime,
"categories": FieldValue.arrayUnion(this.categories),
"creatorId": this.creatorId,
"location": this.location.data,
"details": this.details,
"coHosts": FieldValue.arrayUnion(this.coHosts),
"guestsCanInviteFriends": this.guestsCanInviteFriends
}).then((response) {
response.updateData({"id": response.documentID});
return true;
}).catchError((onError) {
print("this is the error $onError");
return false;
});
}
}
The save method is the method that should save it to the database however it gets an error.
Here is where I call it.
createEvent({screenWidth, screenHeight, isLandscape}) async {
setState(() {
loading = true;
});
final String mediaUrl = await uploadImage(file);
if (mediaUrl.isEmpty || mediaUrl == null) {
setState(() {
loading = false;
});
eventTimeWarning(
screenWidth: screenWidth,
screenHeight: screenHeight,
isLandscape: isLandscape,
warningMessage:
"Your image didn't upload properly. There could be a problem with your internet connection. Please try again");
return;
}
PrivateEvent privateEvent = PrivateEvent(
feedbackTimeAndDate: feedbackTimeAndDate,
feedbackLocationOrActivity: feedbackLocationOrActivity,
name: eventName,
mediaUrl: mediaUrl,
address: eventAddress,
startTime: eventStartTimeAndDate,
endTime: eventEndTimeAndDate,
categories: selectedCategories(),
creatorId: Provider.of<UserData>(context).getUserId,
location: eventLocation,
guestsCanInviteFriends: guestsCanInviteFriends,
details: detailsController.text.trim(),
groupId:
Provider.of<PrivateGroupNormalData>(context).getGroupId);
final bool eventUploadSuccess = await sendEventInfo();
if (!eventUploadSuccess) {
setState(() {
eventTimeWarning(
screenWidth: screenWidth,
screenHeight: screenHeight,
isLandscape: isLandscape,
warningMessage:
"There was a problem creating your event. Please, check your internet connection and try again.");
loading = false;
});
return;
}
print("EVENT CREATED SUCCESSFULLY!");
}
As I said before. The above doesn't work. However On creating a function within the widget. The data is added to the database and there is no missingexception error.
Here is the working version.
Future<bool> sendEventInfo({String mediaUrl}) {
return Firestore.instance
.collection('privateEvents')
.document(Provider.of<PrivateGroupNormalData>(context).getGroupId)
.collection("events")
.add({
"feedbackLocationOrActivity": this.feedbackLocationOrActivity,
"feedbackTimeAndDate": this.feedbackTimeAndDate,
"name": this.eventName,
"mediaUrl": mediaUrl,
"address": eventAddress,
"startTime": eventStartTimeAndDate,
"endTime": eventEndTimeAndDate,
"categories": selectedCategories(),
"creatorId": Provider.of<UserData>(context).getUserId,
"location": eventLocation.data,
"details": detailsController.text.trim(),
"coHosts": FieldValue.arrayUnion(),
"guestsCanInviteFriends": this.guestsCanInviteFriends
}).then((response) {
response.updateData({"id": response.documentID});
return true;
}).catchError((onError) {
print("this is the error $onError");
return false;
});
}
All I do is replace the call to instance method with the call to the above function and now it works fine without the missing plugin error.