Почему flutter возвращает ошибку для методов Firestore внутри классов, но это нормально внутри виджета? - PullRequest
0 голосов
/ 10 февраля 2020

Итак, я попытался создать классы моделей, аналогичные 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...