50

我是 Flutter 的新手。我正在寻找始终为大写的 TextField 值,但我没有找到任何资源。

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

 new TextField(
         controller: _controller,
         decoration: new InputDecoration(
              hintText: 'Search here',
         ),
         onChanged: (str) {
            //need to implement debounce
         }
)
4

12 回答 12

144

适用于Android、iOS、Web、macOS、Windows 和 Linux

您可以实现自定义TextInputFormatter

class UpperCaseTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    return TextEditingValue(
      text: newValue.text.toUpperCase(),
      selection: newValue.selection,
    );
  }
}

用法:

TextField(
  inputFormatters: [
    UpperCaseTextFormatter(),
  ]
)

完整示例

于 2018-03-12T16:10:24.257 回答
84

也许在 TextField 中使用 textCapitalization: TextCapitalization.characters 可以帮助您?尽管这也会在输入内容时将字符大写。

TextField(
    textCapitalization: TextCapitalization.sentences,
)
于 2018-09-14T08:38:20.217 回答
37

您可以使用小部件textCapitalization的属性TextField。也请参考此处的详细 API 信息Text Capitalization Official API

图示如下

示例 1

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.characters,
    )// OUTPUT : FLUTTER CODE CAMP

示例 2

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

示例 3

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.sentences,
    )// OUTPUT : Flutter code camp

示例 4

 TextField(
        initialValue: flutter code camp
        textCapitalization: TextCapitalization.none,
    )// OUTPUT : flutter code camp
于 2020-02-11T17:39:32.403 回答
29

您需要做的就是:

字符串放置后.toUpperCase()

例子:"Some text".toUpperCase()

这在我的情况下有效。我也是新手,希望能帮到你。

于 2018-06-04T18:22:57.867 回答
18

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

TextField(
    textCapitalization: TextCapitalization.characters,
)
于 2019-09-23T04:08:10.913 回答
6

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

TextField(
          controller: controllerReservation,
          onChanged: (value) {               
            controllerReservation.value = 
               TextEditingValue(
                                text: value.toUpperCase(), 
                                selection: controllerReservation.selection);
          },
        )
于 2019-03-31T01:08:34.540 回答
5

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

如果您想将文本输入的全部值大写,请使用

TextField(
  textCapitalization: TextCapitalization.characters,
 )
于 2021-02-26T06:15:48.710 回答
3

做大写

您必须使用textCapitalization: TextCapitalization.characters始终输入大写字母

textCapitalization:TextField 提供了将用户输入的文本大写的选项。

用途TextCapitalization.characters:将句子中的所有字符大写。

TextField(
 textCapitalization: TextCapitalization.characters,
),

去抖动

我们可以轻松地对输入流进行去抖动处理。使用 Timer 创建 Debouncer 类

import 'package:flutter/foundation.dart';
import 'dart:async';

class Debouncer {
  final int milliseconds;
  VoidCallback action;
  Timer _timer;

  Debouncer({ this.milliseconds });

  run(VoidCallback action) {
    if (_timer != null) {
      _timer.cancel();
    }

    _timer = Timer(Duration(milliseconds: milliseconds), action);
  }
}

声明和触发

final _debouncer = Debouncer(milliseconds: 500);

onTextChange(String text) {
  _debouncer.run(() => print(text));
}

Debounce 通过在给定的持续时间内将所有输入事件“搁置”来减轻服务器的压力。

我们可以根据自己的喜好控制去抖动持续时间(500ms 是一个很好的默认值)。

于 2020-11-05T04:02:02.787 回答
2

@Günter-Zöchbauer 的解决方案有效,但是当您在 Android 上切换到数字键盘时,如果您键入一个,它将再次切换到字母键盘。

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

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

import 'package:flutter/services.dart';

class UpperCaseTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    return newValue.copyWith(text: newValue.text.toUpperCase());
  }
}
于 2021-07-28T07:31:52.507 回答
2

以下是对输入文本实现去抖动(或延迟)效果的方法:

1) 导入包

rxdart: ^0.18.1 (or whatever the version will be)

2)在您的有状态小部件中声明以下

final subject = new PublishSubject<String>();

3)在同一个Stateful Widget中,在initState方法下声明如下

subject.stream
    .debounce(new Duration(milliseconds: 500))
    .listen(_loadNewData);

4) 在同一个 Stateful Widget 中,创建以下方法(将在 500 毫秒后触发)

  void _loadNewData(String newData) {
    //do update here
  }

4)将以下行添加到您的 Textfield Widget(您现在可以摆脱 Controller)

onChanged: (string) => (subject.add(string)),
于 2018-09-28T17:34:05.483 回答
1

这是输入 CAPS ON 的简单方法

 textCapitalization: TextCapitalization.characters,

简单的!

于 2021-01-28T19:04:36.557 回答
0
TextField(
  controller: textController,
    onChanged: (value) {
      if (textController.text != value.toUpperCase())
        textController.value = textController.value.copyWith(text: value.toUpperCase());
  },
)
于 2019-09-19T18:48:29.583 回答