如何解决警报对话框通过后退按钮保持打开状态
我有一个我似乎无法弄清楚的小错误,我相信这是由于我的 Alert Dialog 实现造成的。我正在使用 flutter Provider 包,并像这样打开我的对话框:
_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上,当用户按下后退按钮时,Dialog没有关闭,但Dialog后面的页面弹出了一个页面。我在 Dialog 上有一个关闭按钮可以成功关闭对话框,但我希望用户能够使用后退按钮以获得更好的体验。如果用户也在对话框外单击,对话框也会关闭。我试过用 WillPopScope 包装对话框,但它不会在按下后退按钮时被调用。
谁能解释一下我在这里做错了什么?
我已经尝试使用 WillPopScope 将 Widget 包装在调用方法中
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,));
以及将警报对话框本身包装在构建函数中
@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 永远不会被调试器命中
解决方法
如果应用有多个 Navigator 对象,可能需要调用 Navigator.of(context,rootNavigator: true).pop(result) 来关闭对话框,而不仅仅是 Navigator.pop(context,result)。>
如果您有多个导航器对象,我希望这会关闭警报对话框。试试看
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
,嗨,我遇到了类似的问题,下面的方法对我有用,因为 Vinoth vino 告诉将您的页面包装在 WillPopScope 小部件中并尝试在那里添加弹出功能
0 => 0
100 => 1
200 => 2
300 => 3
400 => 4
500 => 5
600 => 6
700 => 7
800 => 8
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。