Flutter - может только всплывать AlertDialog ИЛИ выполнять переданную функцию - нужно делать и то, и другое

Вкратце: попытка передать вызов функции пользовательскому AlertDialog. AlertDialog нужно вытолкнуть после того, как функция -> не может заставить ее работать.

Я создал собственный AlertDialog для использования во всем приложении. Это выглядит примерно так:

 customAlertDialog({required context, buttonAction}){
  showDialog(context: context, builder: (context) => AlertDialog(
    title: Text("example title", style: TextStyle(color: AppTheme.colors.white),),
    content: const Text("some content"),
    actions: [
       TextButton(onPressed:  () {Navigator.of(context).pop();}, child: Text(
        "Abbrechen",
        style: TextStyle(
            color: AppTheme.colors.white),
      ),),
      TextButton(
          child: Text("do something",
            style: TextStyle(
                color: AppTheme.colors.lightRed),
          ),
          onPressed: buttonAction)
    ],
  ),);
}

CustomAlertDialog принимает вызов функции в качестве аргумента (здесь он называется buttonAction) для последнего действия TextButtons onPressed. Он отлично работает, когда я передаю:

buttonAction: () => deleteUser(context)

Проблема в том, что это не работает в сочетании с поп-методом. В дальнейшем будет вызываться только deleteUser:

buttonAction: () => [deleteUser(context), Navigator.of(context).pop()]

то же самое, если написать так:

buttonAction: () {deleteUser(context), Navigator.of(context).pop()}

Я предполагаю, что контекст самого customAlertDialog должен быть извлечен. Итак, я пробовал следующее в customAlertDialog (buttonAction содержит () => deleteUser (контекст):

onPressed: () => [buttonAction, Navigator.of(context).pop()]

Теперь он только открывает диалоговое окно, вероятно, потому, что дротик не может интерпретировать действие кнопки. Поэтому я пытался найти способ передать только ту функцию, которая должна быть вызвана, но безуспешно.

Итак, мой вопрос: Как я могу передать функцию и по-прежнему открывать диалоговое окно?

Обновлено: Как упомянул @SlowDeepCoder, проблема могла заключаться в том, что метод Navigator.pop() выбрасывает контекст из стека до того, как deleteUser() завершится, и поэтому он не работает. Это пытались исправить следующим образом, но это не сработало:

buttonAction: () async{ await deleteUser(context); Navigator.of(context).pop(); }

Может ли быть так, что метод deleteUser является асинхронным, и когда вы открываете диалоговое окно перед ожиданием результата, контекст выбрасывается из стека?

SlowDeepCoder 17.05.2022 19:42

Да, это асинхронно. Я попытался поместить Navigator.pop() в метод deleteUser(), но он тоже не работает.

Niklas 17.05.2022 19:57

Попробуйте следующее: buttonAction: () async{ await deleteUser(context); Navigator.of(context).pop(); }

SlowDeepCoder 17.05.2022 19:59

К сожалению, @SlowDeepCoder все еще не работает. Возможно ли, что контекст передается с помощью метода с моего начального экрана в AlertDialog() и, следовательно, не может его вытолкнуть. Есть ли способ получить контекст текущего представления?

Niklas 17.05.2022 20:25
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не всегда нужно использовать функцию стрелки для передачи пользовательской функции.

Вы можете просто передать функцию как

buttonAction: (){
     deleteUser(context);
     Navigator.of(context).pop();
}

Привет, также пробовал это -> он также вызывает только функцию deleteUser(), но не появляется.

Niklas 17.05.2022 18:25

Вы получаете какую-либо проблему или сообщение об этом?

suzan 17.05.2022 18:28

Да: «При обработке жеста была выдана следующая ошибка _CastError: оператор проверки нуля используется для нулевого значения». Я не смог найти ссылку на свой код в стеке. Я не получаю эту ошибку при использовании только deleteUser()

Niklas 17.05.2022 18:39
Ответ принят как подходящий

Это потому, что вы называете pop() на Navigator из неправильного BuildContext. Итак, вместо

buttonAction: () {
  deleteUser(context);
  Navigator.of(context).pop();
}

вы должны сделать что-то вроде этого:

buttonAction: (innerContext) {
  deleteUser(innerContext); // not sure if you need the innerContext here. Depends on your other app code
  // deleteUser(context); // use this line if the above does not work
  Navigator.of(innerContext).pop();
}

вместе с

TextButton(
  child: Text("do something"),
  onPressed: () => buttonAction(context),
)

Я также рекомендую вам дать боту ваших BuildContexts (customAlertDialog и showDialog) разные имена.

Другие вопросы по теме