Flutter 如何更新颤振警报框中的按钮文本

Flutter 如何更新颤振警报框中的按钮文本,flutter,Flutter,我在flatter中有一个提醒框,提示用户输入名称和日期。名称是一个简单的文本字段,通过单击按钮打开日期选择器来输入日期。最初,按钮将当前日期作为文本。我希望按所选日期进行更新,但无法实现。但当我返回到文本输入时,它确实会得到更新 谢谢你的帮助 我当前的代码如下所示 Future getNameDate(BuildContext) 异步的 { 返回显示对话框( 上下文:上下文, 禁止:错误, 生成器:(BuildContext上下文){ 返回警报对话框( 标题:文本(“保存事件”), 内容:新专

我在flatter中有一个提醒框,提示用户输入名称和日期。名称是一个简单的文本字段,通过单击按钮打开日期选择器来输入日期。最初,按钮将当前日期作为文本。我希望按所选日期进行更新,但无法实现。但当我返回到文本输入时,它确实会得到更新

谢谢你的帮助

我当前的代码如下所示

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),