Диалоговое окно оповещения остается открытым при нажатии кнопки «Назад»

#android #flutter #provider

#Android #флаттер #поставщик

Вопрос:

У меня небольшая ошибка, которую я не могу понять, и я считаю, что это связано с моей реализацией диалогового окна оповещения. Я использую пакет поставщика flutter и открываю свой диалог следующим образом:

   _openSearchHistory(
      BuildContext context, TextEditingController searchController) {
    final searchModel = Provider.of<SearchModel>(context, listen: false);
    showDialog(
        context: context,
        builder: (_) => ChangeNotifierProvider<SearchModel>.value(
              value: searchModel,
              child: DialogSearchHistory(
                searchHistory: searchModel.searchHistory,
                searchController: searchController,
              ),
            ));
  }
 

Проблема в том, что когда на Android пользователь нажимает кнопку «Назад», диалоговое окно не закрывается, но страница за диалогом возвращает страницу. У меня есть кнопка закрытия в диалоговом окне, которая успешно закрывает диалоговое окно, но я хочу, чтобы пользователи могли использовать кнопку «Назад» для лучшего взаимодействия. Диалоговое окно закрывается, если пользователь также щелкает за его пределами. Я попытался обернуть диалоговое окно с помощью WillPopScope, но оно не вызывается при нажатии кнопки «Назад».

Может ли кто-нибудь пролить свет на то, что я здесь делаю неправильно?

Я попытался обернуть виджет в вызывающий метод с помощью WillPopScope

 showDialog(
    context: context,
    builder: (_) => ChangeNotifierProvider<SearchModel>.value(
          value: searchModel,
          child: WillPopScope(
            onWillPop: () {
              Navigator.of(context).pop();
              return Future.value(false);
            },
            child: DialogSearchHistory(
              searchHistory: searchModel.searchHistory,
              searchController: searchController,
            ),
          ),
        ));
 

А также обертывание самого диалогового окна оповещения в функции сборки

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.of(context).pop();
        return Future.value(false);
      },
      child: AlertDialog(
        backgroundColor: kCardColor,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(20.0)),
        ),...
 

Ни один из них не сработал. Страница за диалогом возвращается, но диалоговое окно остается на месте. onWillPop никогда не попадает в отладчик

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

1. Можете ли вы показать мне, что вы написали внутри onWillPop метода WillPopScope ?

2. … дочерний элемент: WillPopScope( onWillPop: () { Navigator.of(context).pop(); возвращает Future.value(false); },

3. Можете ли вы проверить мой ответ @Swisscheese

4. Также попробуйте обернуть маршрут (например, обернуть каркас) с помощью WillPopScope вместо диалогового окна оповещения

Ответ №1:

Если приложение имеет несколько объектов Navigator, может потребоваться вызвать Navigator.of(контекст, rootNavigator: true).pop(результат), чтобы закрыть диалоговое окно, а не просто Navigator.pop(контекст, результат).

Я надеюсь, что это закроет диалоговое окно оповещения, если у вас есть несколько объектов navigator. Попробуйте

 onWillPop: (){
  Navigator.of(context, rootNavigator: true).pop();
  return  Future.value(false);
},
 

или

Попробуйте Navigator.pop(context); , это вызовет внутренний Navigator.of(context).pop() метод.

Официальная реализация Navigator.pop() метода.

 static void pop<T extends Object>(BuildContext context, [ T result ]) {
  Navigator.of(context).pop<T>(result);
}
 

Документ — https://api.flutter.dev/flutter/widgets/Navigator/pop.html

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

1. Спасибо за вашу помощь, но вы упускаете главную проблему. onWillPop никогда не вызывается, поэтому любой код внутри него на данный момент не имеет значения. Кажется, я не могу понять, почему onWillPop никогда не вызывается, я думал, что это связано с тем, как я представлял диалоговое окно оповещения, но я не уверен.

2. Конечно, onWillPop будет вызван, если вы нажмете кнопку «Назад». Вам просто нужно обернуть весь экран (обернуть каркас) с помощью WillPopScope вместо того, чтобы просто оборачивать диалоговое окно оповещения @Swisscheese

3. Обертывание всего каркаса с его помощью действительно закрывает диалоговое окно. Проблема в том, что это затрудняет дальнейшую обратную навигацию, которую будет выполнять пользователь. Я могу просто добавить проверку, чтобы увидеть, открыто ли диалоговое окно, и должен иметь возможность вызывать «Navigator.of (context, rootNavigator: true).pop (‘dialog’);», чтобы только закрыть его. Мне кажется, что я делаю что-то не так

Ответ №2:

Привет, я сталкиваюсь с аналогичной проблемой, и приведенный ниже метод сработал для меня, так как Vinoth vino сообщает, что оберните свою страницу в виджет WillPopScope и попробуйте добавить туда функцию pop, например

 body: WillPopScope(
    onWillPop: (){
    Navigator.of(context).pop();
    return  Future.value(false);
    },
  child:...your code
 

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

1. У меня не работает, я попытался обернуть виджет, как из вызова метода, а также обернуть диалоговое окно оповещения в сборке