Flutter 日期的颤振输入格式化程序

Flutter 日期的颤振输入格式化程序,flutter,Flutter,我正在寻找一个文本字段的inputformatter示例,它将是一个日期mm/dd/yyyy,这是我在用户类型更新格式时尝试执行的操作。例如,用户开始键入mm,然后输入/,然后在输入dd时,输入/ 有人这样做过,或者有一个例子吗?我已经用其他语言做过了,但在flutter/dart中找不到类似的方法 这是我迄今为止尝试过的,但逻辑不正确。有什么想法吗 class _DateFormatter extends TextInputFormatter { @override TextE

我正在寻找一个文本字段的inputformatter示例,它将是一个日期mm/dd/yyyy,这是我在用户类型更新格式时尝试执行的操作。例如,用户开始键入mm,然后输入/,然后在输入dd时,输入/

有人这样做过,或者有一个例子吗?我已经用其他语言做过了,但在flutter/dart中找不到类似的方法

这是我迄今为止尝试过的,但逻辑不正确。有什么想法吗

    class _DateFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue,
      TextEditingValue newValue
      ) {
    final int newTextLength = newValue.text.length;
    int selectionIndex = newValue.selection.end;
    int usedSubstringIndex = 0;
    final StringBuffer newText = new StringBuffer();
    if (newTextLength == 2) {
      newText.write(newValue.text.substring(0, 2) + '/ ');
      if (newValue.selection.end == 3)
        selectionIndex+=3;
    }
    if (newTextLength == 5) {
      newText.write(newValue.text.substring(0, 5) + '/ ');
      if (newValue.selection.end == 6)
        selectionIndex += 6;
    }
    // Dump the rest.
    if (newTextLength >= usedSubstringIndex)
      newText.write(newValue.text.substring(usedSubstringIndex));
    return new TextEditingValue(
      text: newText.toString(),
      selection: new TextSelection.collapsed(offset: selectionIndex),
    );
  }
}

谢谢

我也在努力解决这个问题。我最终得到了以下不那么优雅的解决方案:

class DateInputTextField extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _DateInputTextFieldState();
  }
}

class _DateInputTextFieldState extends State<DateInputTextField> {
  @override
  Widget build(BuildContext context) {
    return TextField(
      keyboardType: TextInputType.number,
      inputFormatters: [DateTextFormatter()],
      onChanged: (String value) {},
    );
  }
}

class DateTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {

    //this fixes backspace bug
    if (oldValue.text.length >= newValue.text.length) {
      return newValue;
    }

    var dateText = _addSeperators(newValue.text, '/');
    return newValue.copyWith(text: dateText, selection: updateCursorPosition(dateText));
  }

  String _addSeperators(String value, String seperator) {
    value = value.replaceAll('/', '');
    var newString = '';
    for (int i = 0; i < value.length; i++) {
      newString += value[i];
      if (i == 1) {
        newString += seperator;
      }
      if (i == 3) {
        newString += seperator;
      }
    }
    return newString;
  }

  TextSelection updateCursorPosition(String text) {
    return TextSelection.fromPosition(TextPosition(offset: text.length));
  }
}
class DateInputTextField扩展StatefulWidget{
@凌驾
状态createState(){
返回_DateInputTextFieldState();
}
}
类_DateInputTextFieldState扩展状态{
@凌驾
小部件构建(构建上下文){
返回文本字段(
键盘类型:TextInputType.number,
inputFormatters:[DateTextFormatter()],
onChanged:(字符串值){},
);
}
}
类DateTextFormatter扩展了TextInputFormatter{
@凌驾
TextEditingValue formatEditUpdate(TextEditingValue旧值,TextEditingValue新值){
//这修复了退格错误
如果(oldValue.text.length>=newValue.text.length){
返回新值;
}
var dateText=_addseparators(newValue.text,“/”);
返回newValue.copyWith(文本:dateText,选择:UpdateCorsOrPosition(dateText));
}
字符串\u添加分隔符(字符串值、字符串分隔符){
value=value.replaceAll('/','');
var newString='';
for(int i=0;i
这是一个基于Jochem Toolenaar答案的改进版本。此版本将自动删除正向斜杠,并将用户限制为8位

class DateTextFormatter extends TextInputFormatter {
  static const _maxChars = 8;

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    var text = _format(newValue.text, '/');
    return newValue.copyWith(text: text, selection: updateCursorPosition(text));
  }

  String _format(String value, String seperator) {
    value = value.replaceAll(seperator, '');
    var newString = '';

    for (int i = 0; i < min(value.length, _maxChars); i++) {
      newString += value[i];
      if ((i == 1 || i == 3) && i != value.length - 1) {
        newString += seperator;
      }
    }

    return newString;
  }

  TextSelection updateCursorPosition(String text) {
    return TextSelection.fromPosition(TextPosition(offset: text.length));
  }
}
类DateTextFormatter扩展了TextInputFormatter{
静态常数_maxChars=8;
@凌驾
文本编辑值格式编辑更新(
TextEditingValue旧值,TextEditingValue新值){
var text=_格式(newValue.text,“/”);
返回newValue.copyWith(文本:text,选择:updateCursorPosition(文本));
}
字符串_格式(字符串值、字符串分隔符){
value=value.replaceAll(分隔符“”);
var newString='';
对于(int i=0;i
为什么不使用日期选择器而不是让用户键入?嗨@AkashDadnwate,欢迎来到Stack Overflow!由于你是新来的,我强烈建议你看看指南。如果您解释代码并清楚地说明它是如何解决问题的,那就更好了。
class DateTextFormatter extends TextInputFormatter {
  static const _maxChars = 8;

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    var text = _format(newValue.text, '/');
    return newValue.copyWith(text: text, selection: updateCursorPosition(text));
  }

  String _format(String value, String seperator) {
    value = value.replaceAll(seperator, '');
    var newString = '';

    for (int i = 0; i < min(value.length, _maxChars); i++) {
      newString += value[i];
      if ((i == 1 || i == 3) && i != value.length - 1) {
        newString += seperator;
      }
    }

    return newString;
  }

  TextSelection updateCursorPosition(String text) {
    return TextSelection.fromPosition(TextPosition(offset: text.length));
  }
}