我正在尝试从对话框中返回布尔值,但我不明白为什么该值不会根据需要返回。我尝试过将其作为将来的值返回,并在弹出对话框后将这些值与上下文一起返回。
final bool delete = await _showDialog();
print(delete);
Future<bool> _showDialog() {
bool result;
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Delete Appointment'),
content: Text(
'Are you sure? \nThis action cannot undo.',
style: TextStyle(
color: Colors.red,
fontSize: 20
),
),
actions: <Widget>[
FlatButton(
color: Colors.blue,
child: Text(
'CANCEL',
style: TextStyle(
color: Colors.white,
fontSize: 20
),
),
onPressed: () {
setState(() => result = false);
//print(result);
Navigator.pop(context, result);
return Future.value(result);
},
),
SizedBox(
width: 50,
),
FlatButton(
color: Colors.red,
child: Text(
'CONFIRM',
style: TextStyle(
color: Colors.white,
fontSize: 20
),
),
onPressed: () {
setState(() => result = true);
//print(result);
Navigator.pop(context, result);
return Future.value(result);
},
)
],
);
}
);
}
答案 0 :(得分:1)
这是一个基于您的代码的有效示例:
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(onPressed: () async {
bool delete = await _showDialog(context);
print(delete);
})
);
}
Future<bool> _showDialog(context) {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Delete Appointment'),
content: Text(
'Are you sure? \nThis action cannot undo.',
style: TextStyle(
color: Colors.red,
fontSize: 20
),
),
actions: <Widget>[
FlatButton(
color: Colors.blue,
child: Text(
'CANCEL',
style: TextStyle(
color: Colors.white,
fontSize: 20
),
),
onPressed: () {
Navigator.pop(context, false);
},
),
SizedBox(
width: 50,
),
FlatButton(
color: Colors.red,
child: Text(
'CONFIRM',
style: TextStyle(
color: Colors.white,
fontSize: 20
),
),
onPressed: () {
Navigator.pop(context, true);
},
)
],
);
}
);
}
答案 1 :(得分:1)
返回True
Navigator.of(context).pop(true);
返回False
Navigator.of(context).pop(false);
答案 2 :(得分:0)
您将要返回的值传递给Navigator.pop
,它将由showDialog
返回:
final result = await showDialog(
...
// At some point, Navigator.pop is called
Navigator.pop(context, true);
);
print(result); // Prints: true
答案 3 :(得分:0)
查看此完整的唤醒代码。您必须传递要返回的值。
import 'package:flutter/material.dart';
class Delete extends StatefulWidget {
Delete({Key key}) : super(key: key);
@override
_DeleteState createState() => _DeleteState();
}
class _DeleteState extends State<Delete> with SingleTickerProviderStateMixin {
int index = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onPressed: () {
_showDialog().then((value) {
print(value.toString());
});
},
child: Text("press ME!"),
),
),
);
}
_showDialog() {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Delete Appointment'),
content: Text(
'Are you sure? \nThis action cannot undo.',
style: TextStyle(color: Colors.red, fontSize: 20),
),
actions: <Widget>[
FlatButton(
color: Colors.blue,
child: Text(
'CANCEL',
style: TextStyle(color: Colors.white, fontSize: 20),
),
onPressed: () {
Navigator.pop(context, false);
},
),
SizedBox(
width: 50,
),
FlatButton(
color: Colors.red,
child: Text(
'CONFIRM',
style: TextStyle(color: Colors.white, fontSize: 20),
),
onPressed: () {
Navigator.pop(context, true);
},
)
],
);
});
}
}
答案 4 :(得分:0)
onPressed:() {
result = false;
//print(result);
setState(() {});
Navigator.pop(context, result);
}
或
onPressed:() {
setState(() {
result = false;
//print(result);
Navigator.pop(context, result);
});
}