AlertDialog应该显示另一个AlertDialog,但是直到我关闭并再次打开它才发生

时间:2020-08-23 11:52:35

标签: flutter dart

当我单击它的一个子级时,我想显示另一个AlertDialog First AlertDialog

但是当我单击它时却没有 显示它,直到我关闭警报并再次将其打开

Second AlertDialog after I closed it and opened it again

我想导航到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,
                                               
                                              )),
                                        ),
                                      );
                                    }),
                              ),
                            ));```

3 个答案:

答案 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);
                  }),
                ],
              );
            }
          ),
        )
      );
    });
  }
}

结果 enter image description here

答案 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,
        );
      },
    );
  }

然后,我创建了打开第一个对话框的按钮,然后我打开了该对话框

调用了我之前定义的方法

再次感谢您的粪便和肯尼思,您真的帮助了我