0

我有一个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子项。所以我的问题是如何ColumnAlertDialog动作按钮调用内部更新?

4

2 回答 2

1

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

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

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

于 2019-12-17T19:44:48.097 回答
1

一种可能的选择是添加提供程序,将更改后的布尔值通过提供程序传输到列并使用 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,`
于 2019-12-17T18:25:03.613 回答