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
});
},
),
],
);
},
);
}
)
请注意,状态变量必须保留在有状态构建器的构建器之外。
我有一个使用 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
});
},
),
],
);
},
);
}
)
请注意,状态变量必须保留在有状态构建器的构建器之外。