Flutter 如何关闭特定的颤振警报对话框?
复制步骤: 在DartPad.dev/flatter中复制粘贴以下代码 快跑 单击DoAPI调用按钮 您应该看到两个弹出窗口,一个在下面,一个在上面 5秒钟后,需要关闭的不是上面的,而是下面的 如何关闭下面的一个,让上面的一个打开Flutter 如何关闭特定的颤振警报对话框?,flutter,dart,Flutter,Dart,复制步骤: 在DartPad.dev/flatter中复制粘贴以下代码 快跑 单击DoAPI调用按钮 您应该看到两个弹出窗口,一个在下面,一个在上面 5秒钟后,需要关闭的不是上面的,而是下面的 如何关闭下面的一个,让上面的一个打开 import 'package:flutter/material.dart'; final Color darkBlue = Color.fromARGB(255, 18, 32, 47); void main() { runApp(MyApp()); }
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: CloseSpecificDialog(),
),
),
);
}
}
class CloseSpecificDialog extends StatefulWidget {
@override
_CloseSpecificDialogState createState() => _CloseSpecificDialogState();
}
class _CloseSpecificDialogState extends State<CloseSpecificDialog> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text('Do API call'),
onPressed: () async {
showDialogBelow();
showDialogAbove();
await Future.delayed(Duration(seconds: 5));
closeDialogBelowNotAbove();
},
)),
);
}
void showDialogBelow() {
showDialog(
context: context,
builder: (BuildContext contextPopup) {
return AlertDialog(
content: Container(
width: 350.0,
height: 150.0,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
CircularProgressIndicator(),
Text('I am below (you should not see this after 5 sec)'),
],
),
),
),
);
});
}
void showDialogAbove() {
showDialog(
context: context,
builder: (BuildContext contextPopup) {
return AlertDialog(
content: Container(
height: 100.0,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
CircularProgressIndicator(),
Text('I am above (this should not close)'),
],
),
),
),
);
});
}
/// This should close the dialog below not the one above
void closeDialogBelowNotAbove() {
Navigator.of(context).pop();
}
}
除去
添加Future.delayed
注意:Navigator.pop方法始终在屏幕上可用的警报/小部件上方弹出,因为它与小部件当前拥有的BuildContext一起工作。弹出将删除最新添加的路由,showDialog只需使用Dialog推送一条新路径,您可以直接使用堆栈中的Dialog小部件,并使用布尔变量管理状态,以实现相同的效果
class _MyHomePageState extends State<MyHomePage> {
bool showBelow = true;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
await Future.delayed(Duration(seconds: 5));
setState(() {
showBelow = false;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
if(showBelow) AlertDialog(
title: Text('Below..'),
content: Text('Beyond'),
),
AlertDialog(
title: Text('Above..'),
),
],
),
);
}
}
Navigator.ofcontext.pop;将获取您当前的上下文并弹出它。在您的情况下,它是顶部显示的警报对话框,而不是底部显示的对话框。理想情况下,您不应该在另一个警告对话框的顶部显示一个警告对话框,而不在HandPopping将在>first outWhy downvote中取消此规则之前取消前一个警告对话框?这是一个有效的解决方案。请评论。@TSR:您能回复吗?
void showDialogAbove() {
showDialog(
context: context,
builder: (BuildContext contextPopup) {
Future.delayed(Duration(seconds: 5), () {
closeDialogBelowNotAbove();
});
return AlertDialog(
content: Container(
height: 100.0,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
CircularProgressIndicator(),
Text('I am above (this should not close)'),
],
),
),
),
);
});
}
class _MyHomePageState extends State<MyHomePage> {
bool showBelow = true;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
await Future.delayed(Duration(seconds: 5));
setState(() {
showBelow = false;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
if(showBelow) AlertDialog(
title: Text('Below..'),
content: Text('Beyond'),
),
AlertDialog(
title: Text('Above..'),
),
],
),
);
}
}