当我单击它的一个子级时,我想显示另一个AlertDialog
但是当我单击它时却没有 显示它,直到我关闭警报并再次将其打开
我想导航到Second AlertDialog而不关闭它
任何帮助将不胜感激
任何使它打开另一个对话框的方法或关闭它然后再次打开它的方法
这是代码
padding: const EdgeInsets.only(top: 12.0),
child: ListView(children: [
FutureBuilder<DropDown>(
future: getDropData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
DropDown dropdown = snapshot.data;
return RaisedButton(
color: maincolor,
splashColor: accentcolor,
onPressed: () {
showDialog(
context: context,
useSafeArea: true,
child: Center(
child: Padding(
padding: const EdgeInsets.only(top: 20),
child: ListView.builder(
itemCount: dropdown.categories.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(
top: 8.0, right: 8, left: 8),
child: Container(
),
child: FlatButton(
onPressed: () {
setState(() {
categoryID = dropdown
.categories[index]
.categoryId;
});
getDropData();
},
child: Text(
dropdown.categories[index].name,
)),
),
);
}),
),
));```
答案 0 :(得分:2)
我认为您只需要使用setState()
来包装showDialog()
,但由于没有DropDown
类,因此无法对其进行测试。
编辑
我尝试了一个简单的结构,并且效果很好。正如Dung Ngo所述,只需使用StatefulBuilder
来构建第一个AlertDialog
小部件的内容。触发另一个showDialog()
内部以调出第二个AlertDialog
小部件。
class _YourWidgetState extends State<YourWidget> {
AlertDialog alert = AlertDialog(content: Center(child:Text("Second Alert Dialog")));
@override
Widget build(BuildContext context) {
return RaisedButton(onPressed: (){
showDialog(
context: context,
builder: (_) => AlertDialog(
content: StatefulBuilder(
builder: (BuildContext context, StateSetter setState){
return Column(
children: <Widget>[
RaisedButton( onPressed: (){
showDialog(context: context, builder: (_) => alert);
}),
RaisedButton(onPressed: (){
showDialog(context: context, builder: (_) => alert);
}),
],
);
}
),
)
);
});
}
}
答案 1 :(得分:1)
在关闭第一个setState之前,它无法工作,因为它属于主页的上下文,而不是第一个对话框的上下文。
您可以使用StatefulBuilder创建一个StateSetter,该StateSetter根据第一个对话框的上下文调用重建:https://api.flutter.dev/flutter/widgets/StatefulBuilder-class.html
答案 2 :(得分:0)
感谢Dung Ngo和Kennith的回答,这确实帮助了我,我从您的回答中学到了很多,您的回答很正确
这是我所做的
打开第二个对话框的方法
showGeneralDialog(
barrierLabel: "Barrier",
barrierDismissible: true,
barrierColor: maincolor,
transitionDuration: Duration(milliseconds: 200),
context: context,
pageBuilder: (_, __, ___) {
return FutureBuilder<Manufacturer>(
future: getManufucturer(categoryID, parentID),
builder: (context, snapshot) {
if (snapshot.hasData) {
Manufacturer dropdown = snapshot.data;
return Container(
height: 400,
width: 200,
child: ListView.builder(
itemCount: dropdown.manufacturers.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 60),
child: RaisedButton(
child: Text(
dropdown.manufacturers[index].name,
style: GoogleFonts.cairo(
color: maincolor,
fontSize: 14,
fontWeight: FontWeight.bold),
),
onPressed: () async {
parentID =
dropdown.manufacturers[index].manufacturerId;
manufacturerID = parentID;
print(parentID);
Manufacturer newDropDown =
await getManufucturer(categoryID, parentID);
Navigator.pop(context);
Navigator.pop(context);
}),
);
},
),
);
} else {
return Center(
child: CircularProgressIndicator(
strokeWidth: 12,
backgroundColor: maincolor,
),
);
}
});
},
transitionBuilder: (_, anim, __, child) {
return ScaleTransition(
scale: Tween(begin: 0.0, end: 1.0).animate(anim),
child: child,
);
},
);
}
然后,我创建了打开第一个对话框的按钮,然后我打开了该对话框
调用了我之前定义的方法
再次感谢您的粪便和肯尼思,您真的帮助了我