Ошибка: Этот виджет был отключен, поэтому состояние больше не имеет контекста . Подумайте об отмене любой активной работы во время «утилизации»

#flutter #dart

Вопрос:

Я отправляю форму на сервер, и форма успешно отправляется, а код результата возвращается, но по какой-то странной причине моя showsavingdialog функция застряла при сохранении и не продолжает показывать форму сообщения, отправленную успешно. Что я делаю не так?

создать запись

 Future<void> createEntry(
      String id,
      String formName,
      String dataContent,
      String dateCreated,
      String dateUpdated,
      String userLocation,
      String imeI,
      String updatedBy,
      bool isNew) async {
    debugPrint("createEntry web called");
    String apiUrl = hostUrl   "entry";
    debugPrint("sending form to $apiUrl");
    if (isNew) {
      // creating new record
      try {
        Map<String, dynamic> data = {
          "id": id,
          "formName": formName,
          "dateCreated": dateCreated,
          "dataContent": dataContent,
          "dateUpdated": dateUpdated,
          "userLocation": "userLocation",
          "imeI": "imeI",
          "updatedBy": updatedBy,
          "synced": true
        };

        var resp = await Dio().post(apiUrl, data: data);
        int result = resp.statusCode;
        if (result == 201) {
          _showAlertDialog("Success", "Your form has been saved");
        } else {
          _showAlertDialog(
              "Error", "Your form could not be saved due to an error");
        }
      } on DioError catch (e) {
        debugPrint("$e");
        debugPrint(e.message);
          _showAlertDialog(
              "Error", "Your form could not be saved due to an error");
      } finally {
        saving = false; // change save button back to "save"
      }
    } 
 

функция сохранения

 void _save() async {
    debugPrint("_save() called");
    saving = true; // switch save button to display "saving..."
    setFacility();
    isFormValid();
    _showSavingDialog();

    String uuid = this.dbForm.id == null ? Uuid().v4() : this.dbForm.id;
    String op = this.dbForm.id == null ? "insert" : "update";
    // create variables, then store in server
    final String id = uuid;
    final String formName = template.form_name;
    final String dateCreated = DateTime.now().toString();
    final String dateUpdated = DateTime.now().toString();
    final String dataContent = encodeResponse();
    final String updatedBy = username;
    final String userLocation = "isAndroid";

    final String imeI = "isAndroid" ;

    // List<Future> futures = <Future>[];
    if (op == "insert") {
      await createEntry(id, formName, dataContent, dateCreated, dateUpdated,
          userLocation, imeI, updatedBy, true);
    } else {
      await createEntry(id, formName, dataContent, dateCreated, dateUpdated,
          userLocation, imeI, updatedBy, false);
    }
  }
 

диалоговое окно показать сохранение

  void _showSavingDialog() {
    AlertDialog saveDialog = AlertDialog(
        content: Row(
          children: <Widget>[
            Padding(
              child: SizedBox(
                  child: CircularProgressIndicator(
                    valueColor: AlwaysStoppedAnimation<Color>(Colors.black54),
                  ),
                  height: 15.0,
                  width: 15.0),
              padding: EdgeInsets.only(left: 15.0),
            ),
            Padding(
              child: Text(
                "Saving...",
                style: TextStyle(color: Colors.black54),
                textAlign: TextAlign.center,
              ),
              padding: EdgeInsets.all(15.0),
            ),
          ],
        ));
    showDialog(
        context: context,
        builder: (_) => saveDialog,
        barrierDismissible: false);
  }
 

Я всегда получаю ошибку

Ошибка: Этот виджет был отключен, поэтому состояние больше не имеет контекста (и должно считаться несуществующим). Рассмотрите возможность отмены любой активной работы во время «удаления» или использования «смонтированного» геттера, чтобы определить, по-прежнему ли состояние активно.

и диалог сохранения застрял на сохранении, любая помощь будет оценена по достоинству

Комментарии:

1. Вы решили эту проблему?

2. Да, я dd @HaizadAnnuar, я буду искать исправление и обновление

3. @arriff итак, каково же было решение?

Ответ №1:

какая часть кода помечена ошибкой?

вы можете получить этот код внутри:

 if (mounted) {
  ...
}