Flutter 如何更新颤振警报框中的按钮文本
我在flatter中有一个提醒框,提示用户输入名称和日期。名称是一个简单的文本字段,通过单击按钮打开日期选择器来输入日期。最初,按钮将当前日期作为文本。我希望按所选日期进行更新,但无法实现。但当我返回到文本输入时,它确实会得到更新 谢谢你的帮助 我当前的代码如下所示Flutter 如何更新颤振警报框中的按钮文本,flutter,Flutter,我在flatter中有一个提醒框,提示用户输入名称和日期。名称是一个简单的文本字段,通过单击按钮打开日期选择器来输入日期。最初,按钮将当前日期作为文本。我希望按所选日期进行更新,但无法实现。但当我返回到文本输入时,它确实会得到更新 谢谢你的帮助 我当前的代码如下所示 Future getNameDate(BuildContext) 异步的 { 返回显示对话框( 上下文:上下文, 禁止:错误, 生成器:(BuildContext上下文){ 返回警报对话框( 标题:文本(“保存事件”), 内容:新专
Future getNameDate(BuildContext)
异步的
{
返回显示对话框(
上下文:上下文,
禁止:错误,
生成器:(BuildContext上下文){
返回警报对话框(
标题:文本(“保存事件”),
内容:新专栏(
儿童:[
新扩展(
孩子:新文本字段(
自动对焦:对,
装饰:新的输入装饰(
labelText:“事件名称”
),
一旦更改:(值){
名称=值;
},
提交:(值){
},
),
),
新扩展(
孩子:新的一排(
儿童:[
新文本(“事件日期”),
新升起的按钮(
子项:文本(日期格式(“dd/MM/yyyy”).format(when)),
onPressed:()异步{
已拾取日期时间=等待显示日期选择器(
上下文:上下文,
起始日期:何时,
firstDate:DateTime(2015年8月),
lastDate:DateTime(2101),
);
设置状态(){
当=拾取时;
});
}),
],
)
)
],
),
行动:[
新扁平按钮(
子项:常量文本('OK'),
已按下:(){
Navigator.of(context.pop)(true);
}),
新扁平按钮(
子项:常量文本(“取消”),
已按下:(){
Navigator.of(context.pop)(false);
}),
],
);
},
);
}
很抱歉我的评论。如果能够以更好的方式回答问题,那就太好了。无论如何,我希望我能创建一个更通用的“有状态对话框”,所以我创建了这样的东西
class StateDialog扩展StatefulWidget
{
最终警报对话框;
StateDialog({Key,@required this.dialog}):super(Key:Key);
@凌驾
StateDialogState createState()=>StateDialogState(对话框:对话框);
}
类StateDialogState扩展状态
{
最终警报对话框;
StateDialogState({@required this.dialog});
@凌驾
小部件构建{
返回对话框;
}
}
然后在我现有的函数中将其更改为
返回显示对话框(
上下文:上下文,
禁止:错误,
生成器:(BuildContext上下文)
{
返回状态对话框(对话框:AlertDialog(
标题:文本(“保存事件”),
内容:新专栏(
儿童:[
等
但是这仍然没有更新日期按钮中的文本。我很想知道为什么。这是因为
setState()
方法实际上不是更新alertDialog
而是更新树上的小部件。alertDialog
没有自己的状态。您可以签出,如果需要,这里有一个代码示例,您可以根据需要进行一些更改:
试试这个:我对它进行了测试,在选择一个新的日期后,按钮的文本将更新为您刚刚选择的正确日期
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
void main() {
runApp(new MaterialApp(
home: new MyHomePage(),
));
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _selectedIndex = 0;
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text("StackoverFlow"),
),
body: Container(),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await _dialogCall(context);
},
),
);
}
Future<void> _dialogCall(BuildContext context) {
return showDialog(
context: context,
builder: (BuildContext context) {
return MyDialog();
});
}
}
class MyDialog extends StatefulWidget {
@override
_MyDialogState createState() => new _MyDialogState();
}
class _MyDialogState extends State<MyDialog> {
String name = "";
bool button = false;
DateTime when = DateTime.now();
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text("Save Event"),
content: new Column(
children: <Widget>[
new Expanded(
child: new TextField(
autofocus: true,
decoration: new InputDecoration(labelText: "Event Name"),
onChanged: (value) {
name = value;
},
onSubmitted: (value) {},
),
),
new Expanded(
child: new Row(
children: <Widget>[
new Text("Date of Event "),
new RaisedButton(
child: Text(DateFormat("dd/MM/yyyy").format(when)),
onPressed: () async {
DateTime picked = await showDatePicker(
context: context,
initialDate: when,
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101),
);
setState(() {
when = picked;
});
}),
],
))
],
),
actions: <Widget>[
new FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop(true);
}),
new FlatButton(
child: const Text("CANCEL"),
onPressed: () {
Navigator.of(context).pop(false);
}),
],
);
}
Future<bool> getNameDate(BuildContext context) async {
return showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Save Event"),
content: new Column(
children: <Widget>[
new Expanded(
child: new TextField(
autofocus: true,
decoration: new InputDecoration(labelText: "Event Name"),
onChanged: (value) {
name = value;
},
onSubmitted: (value) {},
),
),
new Expanded(
child: new Row(
children: <Widget>[
new Text("Date of Event "),
new RaisedButton(
child: Text(DateFormat("dd/MM/yyyy").format(when)),
onPressed: () async {
DateTime picked = await showDatePicker(
context: context,
initialDate: when,
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101),
);
setState(() {
when = picked;
});
}),
],
))
],
),
actions: <Widget>[
new FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop(true);
}),
new FlatButton(
child: const Text("CANCEL"),
onPressed: () {
Navigator.of(context).pop(false);
}),
],
);
},
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
void main(){
runApp(新材料)PP(
主页:新建MyHomePage(),
));
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _selectedIndex=0;
小部件构建(构建上下文){
归还新脚手架(
appBar:appBar(
标题:文本(“堆栈溢出”),
),
主体:容器(),
浮动操作按钮:浮动操作按钮(
onPressed:()异步{
等待对话调用(上下文);
},
),
);
}
Future\u dialogCall(构建上下文){
返回显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回MyDialog();
});
}
}
类MyDialog扩展了StatefulWidget{
@凌驾
_MyDialogState createState()=>new_MyDialogState();
}
类_MyDialogState扩展了状态{
字符串名称=”;
bool按钮=假;
DateTime when=DateTime.now();
@凌驾
小部件构建(构建上下文){
返回警报对话框(
标题:文本(“保存事件”),
内容:新专栏(
儿童:[
新扩展(
孩子:新文本字段(
自动对焦:对,
装饰:新输入装饰(标签文本:“事件名称”),
一旦更改:(值){
名称=值;
},
OnSubmited:(值){},
),
),
新扩展(
孩子:新的一排(
儿童:[
新文本(“事件日期”),
新升起的按钮(
子项:文本(日期格式(“dd/MM/yyyy”).format(when)),
onPressed:()异步{
已拾取日期时间=等待显示日期选择器(
上下文:上下文,
起始日期:何时,
firstDate:DateTime(2015年8月),
lastDate:DateTime(2101),