Flutter 当使用控制器作为TextEditingController(文本:“输入值”)时,如何使TextField小部件可编辑?

Flutter 当使用控制器作为TextEditingController(文本:“输入值”)时,如何使TextField小部件可编辑?,flutter,dart,datepicker,textfield,provider,Flutter,Dart,Datepicker,Textfield,Provider,我一直试图使初始文本通过controller:TextEditingController(text:“Enter DOB”)传递到TextField小部件中的flatter可编辑,但我找不到任何解决方案(目前) 我想在文本字段内的showDatePicker方法中选择日期后,使selectedDate(或初始文本)可编辑 所以我需要一些帮助。有办法吗 下面是我的代码。我想使控制器中的文本可编辑 TextField( // This controller wi

我一直试图使初始文本通过
controller:TextEditingController(text:“Enter DOB”)
传递到
TextField
小部件中的
flatter
可编辑,但我找不到任何解决方案(目前)

我想在
文本字段
内的
showDatePicker
方法中选择日期后,使
selectedDate
(或初始文本)可编辑

所以我需要一些帮助。有办法吗

下面是我的代码。我想使控制器中的文本可编辑

     TextField(
              // This controller will show the initial value as 'Enter DOB'
              // and when the Date is selected from the showDatePicker it will
              // get updated.
              controller: TextEditingController(
                // the text: property will check if the current value is null or not.
                // if null it will show the "Enter your DOB" text, else the selected## Heading ##Date
                // will get updated.
                text: validator.selectedDate == null
                    ? "Enter your DOB"
                    : "${validator.selectedDate}".split(' ')[0],
              ),
              decoration: InputDecoration(
                suffixIcon: IconButton(
                  icon: Icon(Icons.calendar_today_rounded),
                  onPressed: () {
                    validator.selectDate(context);
                  },
                ),
                labelText: "yyyy-mm-dd",
              ),

              onChanged: (String value) {
                validator.changeDOB(value);
              },
            );

在哪里,

  • selectedDate
    是类型为
    DateTime
    的变量,其初始值为
    null

  • selectDate(BuildContext上下文)
    是带有
    showDatePicker(BuildContext上下文)
    方法的方法

  • changeDOB(字符串值)
    是一种将
    selectedDate
    值更新为
    TextField
    的方法


注意我使用
提供程序
作为状态管理方法。

我认为您必须将
文本编辑控制器
作为局部变量,然后使用
设置状态()

是这样的:

import 'package:flutter/material.dart';

class DateTimeExample extends StatefulWidget {
  @override
  _DateTimeExampleState createState() => _DateTimeExampleState();
}

class _DateTimeExampleState extends State<DateTimeExample> {

  TextEditingController _dobController; // Local variable to store TextFiled text

  @override
  void initState() {
    // Initialize TextEditingController object with default text.
    _dobController = TextEditingController(text: "Enter your DOB: ");
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold( 
      body:Container(
        child: Center(
          child: TextField(
            controller: _dobController,
            decoration: InputDecoration(
              suffixIcon: IconButton(
                icon: Icon(Icons.calendar_today_rounded),
                onPressed: () {
                  String selectedDate=  validator.selectDate(context);
                  setState(() {
                  _dobController.text = selectedDate; // Change the text and refersh UI
                  });
                },
              ),
              labelText: "YYYY-MM-DD",
            ),
            onChanged: (value) {
              validator.changeDOB(value);
            },
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类DateTimeExample扩展StatefulWidget{
@凌驾
_DateTimeExampleState createState()=>\u DateTimeExampleState();
}
类_DateTimeExampleState扩展状态{
TextEditingController _dobController;//用于存储TextField文本的局部变量
@凌驾
void initState(){
//使用默认文本初始化TextEditingController对象。
_dobController=TextEditingController(文本:“输入您的DOB:”);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
儿童:中心(
孩子:TextField(
控制器:\ u控制器,
装饰:输入装饰(
后缀:图标按钮(
图标:图标(图标。日历\u今天\u四舍五入),
已按下:(){
字符串selectedDate=validator.selectDate(上下文);
设置状态(){
_dobController.text=selectedDate;//更改文本并引用UI
});
},
),
标签文本:“YYYY-MM-DD”,
),
一旦更改:(值){
验证程序.changeDOB(值);
},
),
),
),
);
}
}

注意:您的
验证器。selecteDate(Context)
函数必须返回
字符串
,以便刷新您的状态。

已解决

我已经解决了我的问题。上面的答案给了我一个解决问题的想法

  • 我刚刚声明了一个
    TextEditingController()…text=“Enter DOB”
    变量,并将其传递给
    showDatePicker(BuildContext)
    方法

  • 从那里,我将
    selectedDate.toString().split(“”)[0]
    的值输入
    控制器.text

  • 也可以调用
    changeDOB(controller.text)
    ,并将
    controller.text
    作为参数

  • 以下是我的代码:


非常感谢你。。。你的回答给了我一个解决问题的办法。谢谢你,请接受我的回答,以提高我的声誉
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class MyClass with ChangeNotifier {
  // passing the initial text to the textField through controller.
  var controller = TextEditingController()..text = "Enter DOB";

  DateTime selectedDate; // initial value = null;
  selectDate(BuildContext context) async {
    var picked = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(1800),
      lastDate: DateTime.now(),
    );
    if (picked != null && picked != selectedDate) {
      selectedDate = picked;
      // passing the selectedDate to the controller.
      controller.text = selectedDate.toString().split(' ')[0];
      changeDOB(controller.text);
    }
    notifyListeners();
  }
   void changeDOB(String value){
     //TODO: Your validation logic here.
  }
}