Navigator.pop 不会在 flutter 中关闭简单对话框
Navigator.pop won't close the simpledialog in flutter
我正在使用 flutter 构建 android 应用。我在以编程方式关闭简单对话框时遇到问题。
现在我有一个名为 ListVessel 的有状态页面。此页面包含数组 otherVessels 中的 listTile。
以下是此页面的代码。
class ListVessel extends StatefulWidget {
final Function() notifyParent;
ListVessel({Key key, @required this.notifyParent}) : super(key: key);
@override
_ListVesselState createState() => _ListVesselState();
}
class _ListVesselState extends State<ListVessel> {
@override
Widget build(BuildContext context) {
return ListView.separated(
separatorBuilder: (context, index) => Divider(color: Colors.blueGrey),
itemCount: otherVessels.length,
itemBuilder: (context, index) {
return ListTile(
title: Text("Name: "+otherVessels[index]["shipName"]),
onTap: () {
showDialog (
context: context,
builder: (_){
return otherTap(idx:index);
}
);
}
);
},
);
}
}
}
从上面的代码中,可以点击每个瓦片(容器)并调用 otherTap() 方法。 otherTap() 方法显示一个简单的对话框(弹出窗口),其中包含被点击容器的详细信息。
下面是 otherTap() 的代码。
class otherTap extends StatefulWidget{
otherTap({Key key, @required this.idx}) : super(key: key);
final int idx;
@override
_otherTapState createState() => new _otherTapState();
}
class _otherTapState extends State<otherTap>{
@override
Widget build(BuildContext context){
_isDialogShowing = true;
return SimpleDialog(
title: Text(otherVessels[widget.idx]["shipName"]),
children: <Widget>[
SimpleDialogOption(
child: Text('MMSI : ' + otherVessels[widget.idx]['MMSI']),
)
],
);
}
}
我有一个全局布尔变量 (_isDialogShowing) 用于在对话框显示时继续跟踪。
现在我希望显示对话框(弹出窗口)在 5 秒后关闭。
我使用 Navigator.pop() 关闭 MyApp 函数中的对话框。我把它放在 setstate() 函数里面。
void main() {
runApp(
MyApp(storage: CounterStorage()),
);
}
class MyApp extends StatefulWidget {
MyApp({Key key, @required this.storage}) : super(key: key);
final CounterStorage storage;
@override
State<StatefulWidget> createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
final appTitle = 'Testing applicatin';
void _update(BuildContext context) async {
await Future.delayed(Duration(milliseconds: 5000));
setState(() {
if(_isDialogShowing){
_isDialogShowing = false;
Navigator.pop(context);
//Navigator.of(context).pop();
}
});
}
@override
Widget build(BuildContext context) {
_update(context);
return new WillPopScope(
onWillPop: null,
child: new MaterialApp(
debugShowCheckedModeBanner: false,
title: appTitle,
home: MyHomePage(title: appTitle),
routes: {
Routes.home: (context) => MyHomePage(),
Routes.settings: (context) => SettingsPage(),
},
),
);
}
}
但是上面的 navigator.pop 方法不会关闭弹出窗口。
有人可以帮忙吗?
您需要在 showDialog() 的构建器中收到的上下文调用 pop,只有这样,由 showDialog() 创建的对话框才会弹出。
将您的 showDialog() 替换为以下内容,它将适用于您:
showDialog(
context: context,
builder: (BuildContext context) {
Future.delayed(Duration(seconds: 5)).then((_) {
Navigator.pop(context);
});
return otherTap(idx:index);
},
);
我已经使用
解决了这个问题
Navigator.of(context, rootNavigator: true).pop();
我正在使用 flutter 构建 android 应用。我在以编程方式关闭简单对话框时遇到问题。
现在我有一个名为 ListVessel 的有状态页面。此页面包含数组 otherVessels 中的 listTile。
以下是此页面的代码。
class ListVessel extends StatefulWidget {
final Function() notifyParent;
ListVessel({Key key, @required this.notifyParent}) : super(key: key);
@override
_ListVesselState createState() => _ListVesselState();
}
class _ListVesselState extends State<ListVessel> {
@override
Widget build(BuildContext context) {
return ListView.separated(
separatorBuilder: (context, index) => Divider(color: Colors.blueGrey),
itemCount: otherVessels.length,
itemBuilder: (context, index) {
return ListTile(
title: Text("Name: "+otherVessels[index]["shipName"]),
onTap: () {
showDialog (
context: context,
builder: (_){
return otherTap(idx:index);
}
);
}
);
},
);
}
}
}
从上面的代码中,可以点击每个瓦片(容器)并调用 otherTap() 方法。 otherTap() 方法显示一个简单的对话框(弹出窗口),其中包含被点击容器的详细信息。
下面是 otherTap() 的代码。
class otherTap extends StatefulWidget{
otherTap({Key key, @required this.idx}) : super(key: key);
final int idx;
@override
_otherTapState createState() => new _otherTapState();
}
class _otherTapState extends State<otherTap>{
@override
Widget build(BuildContext context){
_isDialogShowing = true;
return SimpleDialog(
title: Text(otherVessels[widget.idx]["shipName"]),
children: <Widget>[
SimpleDialogOption(
child: Text('MMSI : ' + otherVessels[widget.idx]['MMSI']),
)
],
);
}
}
我有一个全局布尔变量 (_isDialogShowing) 用于在对话框显示时继续跟踪。
现在我希望显示对话框(弹出窗口)在 5 秒后关闭。
我使用 Navigator.pop() 关闭 MyApp 函数中的对话框。我把它放在 setstate() 函数里面。
void main() {
runApp(
MyApp(storage: CounterStorage()),
);
}
class MyApp extends StatefulWidget {
MyApp({Key key, @required this.storage}) : super(key: key);
final CounterStorage storage;
@override
State<StatefulWidget> createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
final appTitle = 'Testing applicatin';
void _update(BuildContext context) async {
await Future.delayed(Duration(milliseconds: 5000));
setState(() {
if(_isDialogShowing){
_isDialogShowing = false;
Navigator.pop(context);
//Navigator.of(context).pop();
}
});
}
@override
Widget build(BuildContext context) {
_update(context);
return new WillPopScope(
onWillPop: null,
child: new MaterialApp(
debugShowCheckedModeBanner: false,
title: appTitle,
home: MyHomePage(title: appTitle),
routes: {
Routes.home: (context) => MyHomePage(),
Routes.settings: (context) => SettingsPage(),
},
),
);
}
}
但是上面的 navigator.pop 方法不会关闭弹出窗口。
有人可以帮忙吗?
您需要在 showDialog() 的构建器中收到的上下文调用 pop,只有这样,由 showDialog() 创建的对话框才会弹出。
将您的 showDialog() 替换为以下内容,它将适用于您:
showDialog(
context: context,
builder: (BuildContext context) {
Future.delayed(Duration(seconds: 5)).then((_) {
Navigator.pop(context);
});
return otherTap(idx:index);
},
);
我已经使用
解决了这个问题Navigator.of(context, rootNavigator: true).pop();