【问题标题】:Flutter - Text Field display date after date pickedFlutter - 选择日期后的文本字段显示日期
【发布时间】:2020-07-09 04:25:46
【问题描述】:

我基本上是在尝试为我的应用创建一个注册屏幕。我已经为其他数据包含了所有其他 TextFormField。但是,我现在卡在日期输入部分,我设法创建了一个 TextFormField 包裹在一个 GestureDetector 中,一旦点击 TextFormField,它将打开一个日期选择器来选择一个日期。我的问题是我想用日期选择器中选择的日期设置日期TextFormField 的值,我不知道为什么我拥有的代码非常不一致,有时它确实显示日期和其他时候它不会更新并继续显示hintText,而且由于在点击该字段时会弹出一个日期选择器,我如何在关注日期字段时禁用键盘显示。

class DateState extends StatefulWidget {
  const DateState({
    Key key,
  }) : super(key: key);

  @override
  _DateState createState() => _DateState();
}

class _DateState extends State<DateState> {
  DateTime selectedDate = DateTime.now();

  Future<Null> _selectDate(BuildContext context) async {
    final DateTime picked = await showDatePicker(
        context: context,
        initialDate: selectedDate,
        firstDate: DateTime(1950),
        lastDate: DateTime.now());
    if (picked != null && picked != selectedDate)
      setState(() {
        selectedDate = picked;
      });
  }

  @override
  Widget build(BuildContext context) {
    var dateValue = TextEditingController();
    return DateFieldContainer(
      child: GestureDetector(
        child: TextFormField(
          controller: dateValue,
          onTap: () {
            _selectDate(context);
            dateValue.text = "${selectedDate.toLocal()}".split(' ')[0];
          },
          decoration: InputDecoration(
            hintText: "Select Date",
            focusedBorder: UnderlineInputBorder(
              borderSide: BorderSide(color: PrimaryColor),
            ),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    只需将您的_selectDate() 替换为以下代码即可。

    void _selectDate(){
        showDatePicker(
          context: context,
          initialDate: selectedDate,
          firstDate: DateTime(1950),
          lastDate: DateTime.now(),
        ).then((pickedDate) {
          if (pickedDate == null) {
            return;
          }
    
          setState(() {
            selectedDate = pickedDate;
            dateValue.text = "${selectedDate.toLocal()}".split(' ')[0];
          });
        });
      }
    

    用下面的代码替换你的 onTap() 实现

    onTap: () {
                _selectDate();
              }
    

    var dateValue = TextEditingController(); 保留在 build() 方法之外。

    【讨论】:

    • 感谢@Alpesh Rathod 的回答。我已经尝试过了,它仍然没有改变值。我是否还必须删除 Future
    • @Vinny 它应该可以工作,不需要返回 Future
    • 我明白了,它正在工作。谢谢@Alpesh Rathod!在试用您的代码时,我删除了一些我不应该拥有的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-10-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多