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