Flutter TextField值始终为大写和去抖动

Har*_*run 12 flutter

我是Flutter的新人.我正在寻找TextField值总是大写,但我没有找到任何资源.

另一个问题是TextField onChanged事件去抖实现.当我在TextField上键入时,它会立即触发onChanged事件,这不适合我的目标.每次更改文本后,onChange事件将在500ms后触发.

 new TextField(
         controller: _controller,
         decoration: new InputDecoration(
              hintText: 'Search here',
         ),
         onChanged: (str) {
            //need to implement debounce
         }
)
Run Code Online (Sandbox Code Playgroud)

请帮我解决我的问题.提前致谢.

Div*_*mar 28

You can use textCapitalization property of a TextField widget. Also do take a reference for detailed API info here Text Capitalization Official API

Illustration as follow

Example 1

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.characters,
    )// OUTPUT : FLUTTER CODE CAMP
Run Code Online (Sandbox Code Playgroud)

Example 2

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.words,
    )// OUTPUT : Flutter Code Camp
Run Code Online (Sandbox Code Playgroud)

Example 3

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.sentences,
    )// OUTPUT : Flutter code camp
Run Code Online (Sandbox Code Playgroud)

Example 4

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.none,
    )// OUTPUT : flutter code camp
Run Code Online (Sandbox Code Playgroud)


pet*_*s J 20

也许使用textCapitalization:TextField中的TextCapitalization.characters可以帮到你吗?虽然这样可以在输入内容时将字符大写.

TextField(
    textCapitalization: TextCapitalization.sentences,
)
Run Code Online (Sandbox Code Playgroud)


小智 18

你需要做的一切是:

字符串放完后 .toUpperCase()

例: "Some text".toUpperCase()

这适用于我的情况.我也是新人,所以我希望我能帮忙.

  • 这是关于文本输入字段的。没有任何字符串可以更改。给定的文本通过 TextEditingController 检索,然后用于在每次击键时修改字段中的文本。我认为那不可能。 (3认同)

Raf*_*ñoz 11

@G\xc3\xbcnter-Z\xc3\xb6chbauer 的解决方案有效,但是当你切换到 Android 上的数字键盘时,如果你输入一个,它会再次切换到字母键盘。

\n

这是因为您每次都设置一个新的 TextEditingValue。

\n

相反,如果您复制最新的并更改文本,它就会起作用:

\n
import 'package:flutter/services.dart';\n\nclass UpperCaseTextFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    return newValue.copyWith(text: newValue.text.toUpperCase());\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Gün*_*uer 10

您可以实施自定义 TextInputFormatter

class UpperCaseTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    return TextEditingValue(
      text: newValue.text?.toUpperCase(),
      selection: newValue.selection,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以传递给 TextFormField.inputFormatters

有关完整的示例,另请参见https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart

  • 我不知道为什么这个解决方案没有更多的赞成票。据我所知,这是实现自动大写格式(或任何类型的文本字段格式)的正确方法。 (9认同)
  • 完美的。`textCapitalization: TextCapitalization.characters,` 不适用于 Windows,所以这是一个很好的解决方案。 (3认同)
  • 这就是我所说的“优质”解决方案,与其他平台不同,它适用于每个平台,谢谢:) (2认同)
  • 当在键盘中启用自动更正时,此答案会导致错误(它将 OldValue 附加到 NewValue)。例如:我想输入键盘:第一个字母类型 K,第二个字母类型 E,现在它替换为 KKE,依此类推,逐个字母地输入它会在 OldValue 后面附加 NewValue。 (2认同)
  • 此解决方案遇到了新的 Android 键盘问题。它是附加,而不是替换。需要更新。 (2认同)

Joh*_*yan 7

TextField 有一个 textCapitalization 属性,可用于将单词、句子或字符大写

如果您想将文本输入的整个值大写使用

TextField(
  textCapitalization: TextCapitalization.characters,
 )
Run Code Online (Sandbox Code Playgroud)


fel*_*gga 6

您可以TextCapitalization.characters用来使所有键入的字符都大写

TextField(
    textCapitalization: TextCapitalization.characters,
)
Run Code Online (Sandbox Code Playgroud)

  • 不行,因为它只是将用户的键盘切换为大写,但用户可以切换回小写。格式化程序解决方案要好得多 (2认同)

Die*_*cia 5

最简单的方法是添加 TextField 的 onChanged 事件并使用 TextField 的控制器转换为大写,就像上面一样:

TextField(
          controller: controllerReservation,
          onChanged: (value) {               
            controllerReservation.value = 
               TextEditingValue(
                                text: value.toUpperCase(), 
                                selection: controllerReservation.selection);
          },
        )
Run Code Online (Sandbox Code Playgroud)

  • 这会将光标位置移动到开始位置 (2认同)