颤振刷新AlertDialog中的列

时间:2019-12-17 17:39:18

标签: flutter state flutter-alertdialog

我有一个使用AlertDialog方法显示的showDialog(),在其中有一个Column,其中包含两个Text小部件,其中一个是不可见的。我要在此处执行的操作是使用AlertDialog操作按钮更改文本的可见性。

我最初创建的是Column,如下所示:

bool textVisibility = false;
var column = Column(
    mainAxisSize: MainAxisSize.min,
    mainAxisAlignment: MainAxisAlignment.start,
    children: <Widget>[
        Text("Visible Text"),
        Visibility(
            visible: textVisibility,
            child: Text("Invisible Text!"),
        )
    ],
); 

然后将其包含在AlertDialog中,如下所示:

showDialog(
    context: context,
    builder: (context) {
        return StatefulBuilder(
            builder: (context,StateSetter dialogState) {
                return AlertDialog(
                    content: column,
                    actions: <Widget>[
                        FlatButton(
                            child: Text("Yes"),
                            onPressed: () {
                                dialogState(() {
                                    textVisibility = true
                                });
                            },
                        ),
                    ],
                );
            },
        );
    }
)

这显然不起作用,因为dialogState()将更新对话框的数据,而不是其Column子级的数据。所以我的问题是如何从Column操作按钮调用内部更新AlertDialog

2 个答案:

答案 0 :(得分:1)

一个可能的选择是添加一个提供程序,将提供程序上已更改的布尔值传输到该列,然后使用notifylistener更新它。像以下这样的东西可能有用。

//在AlertDialog的“操作”按钮上

Provider.of<foo>(context).setBoolean(true)

//在提供程序中

boolean isButtonVisible = false;
void setBoolean(bool visible){
isButtonVisible = visible;
notifylistener;
}
bool getBoolean()=>isButtonVisible;

//在操作按钮的列中

Visibility{
visible: `Provider.of<foo>(context).getBoolean,`

答案 1 :(得分:1)

您可以做的一件事是将列的初始化和声明移到builder函数中,因为这是在调用状态指示程序之后重建列的唯一方法,这样您将拥有类似的东西。

showDialog(
    context: context,
    builder: (context) {
        var column = Column(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
           Text("Visible Text"),
           Visibility(
            visible: textVisibility,
            child: Text("Invisible Text!"),
            )
          ],
        ); 

        return StatefulBuilder(
            builder: (context,StateSetter dialogState) {
                return AlertDialog(
                    content: column,
                    actions: <Widget>[
                        FlatButton(
                            child: Text("Yes"),
                            onPressed: () {
                                dialogState(() {
                                    textVisibility = true
                                });
                            },
                        ),
                    ],
                );
            },
        );
    }
)

请注意,状态变量必须位于statefulbuilder的构建器之外。