Flutter 刷新 AlertDialog 中的列

Flutter refreshing a column inside an AlertDialog

我有一个使用 showDialog() 方法显示的 AlertDialog,在它里面我有一个 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 子项。所以我的问题是如何从 AlertDialog 操作按钮调用中更新 Column

一个可能的选择是添加一个提供程序,将更改的布尔值通过提供程序传输到列并使用 notifylistener 更新它。像下面这样的东西可以工作。

//在AlertDialog的Action按钮处

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

//在提供者中

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

//在actionbutton的Column中

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

您可以做的一件事是将列初始化和声明移到构建器函数中,因为这是在调用状态设置器后重建列的唯一方法,因此您将得到类似这样的东西。

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

请注意,状态变量必须保留在有状态构建器的构建器之外。