我有一个使用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
?
答案 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的构建器之外。