android - Flutter-如何使DatePicker中的选定值显示在TextFormField中?

标签 android ios flutter dart datepicker

到目前为止,我做了什么:我在TextFormField中有一个onTap() Action 。此onTap()操作调用_selectDate来打开日期选择器。在_selectDate内,我使用了我创建的辅助变量presentText,并在TextFormField的initialValue内部分配了此变量。问题是,即使我更改日期选择器中的日期,initialValue始终为空,TextFormField的initialValue仍为空白。在调试中,我看到presentText已正确填充,但是我不知道为什么该值不进入TextFormField。

   class _DetailFormState extends State<DetailForm> {
              DateTime selectedDate = DateTime.now();
              String presentText;

              Future<Null> _selectDate(BuildContext context) async {
                final DateTime picked = await showDatePicker(
                    context: context,
                    initialDate:
                        widget.user.birthday != null ? widget.user.birthday : selectedDate,
                    firstDate: DateTime(2015, 8),
                    lastDate: DateTime(2101));
                if (picked != null && picked != selectedDate)
                  setState(() {
                    selectedDate = picked;
                    widget.user.birthday = picked;
                    presentText = "${widget.user.birthday.toLocal()}" != null
                        ? "${widget.user.birthday.toLocal()}".split(' ')[0].toString()
                        : "${selectedDate.toLocal()}".split(' ')[0].toString();
                  });
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                  body: SingleChildScrollView(
                    padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
                    child: Form(
                      key: _formKey,
                      autovalidate: true,
                      child: Column(
                        children: <Widget>[

                             Padding(
                              padding: EdgeInsets.only(top: 15),
                              child: Text(
                                'Birthday',
                                textAlign: TextAlign.left,
                                overflow: TextOverflow.ellipsis,
                                style: TextStyle(fontWeight: FontWeight.bold),
                              )),

                          GestureDetector(
                              onTap: () => _selectDate(context),
                              child: AbsorbPointer(
                                  child: TextFormField(
                                initialValue: presentText
                              ))),
                               ],
                  ),
                ],
              ),
            ),
          ),
        );
      }

最佳答案

您可以在下面复制粘贴运行完整代码
您可以使用TextEditingController
程式码片段

final myController = TextEditingController();

myController.text = "${widget.user.birthday.toLocal()}" != null
            ? "${widget.user.birthday.toLocal()}".split(' ')[0].toString()
            : "${selectedDate.toLocal()}".split(' ')[0].toString();

AbsorbPointer(
                      child: TextFormField(controller: myController

工作演示

enter image description here

完整的代码
import 'package:flutter/material.dart';

class User {
  DateTime birthday;

  User({this.birthday});
}

class DetailForm extends StatefulWidget {
  User user;

  DetailForm({this.user});
  @override
  _DetailFormState createState() => _DetailFormState();
}

class _DetailFormState extends State<DetailForm> {
  DateTime selectedDate = DateTime.now();
  String presentText;
  final _formKey = GlobalKey<FormState>();
  final myController = TextEditingController();

  Future<Null> _selectDate(BuildContext context) async {
    final DateTime picked = await showDatePicker(
        context: context,
        initialDate:
            widget.user.birthday != null ? widget.user.birthday : selectedDate,
        firstDate: DateTime(2015, 8),
        lastDate: DateTime(2101));
    if (picked != null && picked != selectedDate)
      setState(() {
        selectedDate = picked;
        widget.user.birthday = picked;
        myController.text = "${widget.user.birthday.toLocal()}" != null
            ? "${widget.user.birthday.toLocal()}".split(' ')[0].toString()
            : "${selectedDate.toLocal()}".split(' ')[0].toString();
      });
  }

  @override
  void dispose() {
    // Clean up the controller when the widget is removed from the
    // widget tree.
    myController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
        child: Form(
          key: _formKey,
          autovalidate: true,
          child: Column(
            children: <Widget>[
              Padding(
                  padding: EdgeInsets.only(top: 15),
                  child: Text(
                    'Birthday',
                    textAlign: TextAlign.left,
                    overflow: TextOverflow.ellipsis,
                    style: TextStyle(fontWeight: FontWeight.bold),
                  )),
              GestureDetector(
                  onTap: () => _selectDate(context),
                  child: AbsorbPointer(
                      child: TextFormField(controller: myController
                          //initialValue: presentText
                          ))),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: DetailForm(user: User()),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

关于android - Flutter-如何使DatePicker中的选定值显示在TextFormField中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61743208/

相关文章:

android - 登录错误 : there is an error in logging you into this application. 请稍后在 android 模块的 flutter 中重试

android - 动态改变 Activity 主题

android - 如何创建响应式 GridView 以覆盖整个屏幕?

ios - scrollViewDidScroll 不进入条件

ios - 未收到 Flutter FCM IOS 静默(仅数据)通知

flutter - 第一个Flutter App卡在Linux Mint中的 “Running Gradle task ' assembleDebug'…”

java - 播放不间断的声音声音池

android - 如何删除 AlertDialog 中的分隔线

ios - FBSDKLoginButton Programmatic Height Constraint 呈现比相同 GIDSignInButton Storyboard Height Constraint 更大的高度

ios - 当使用 CGContext 缩放到小尺寸时,CGImage 的像素数据不完整