Flutter TextField 值总是大写和去抖动

Posted

技术标签:

【中文标题】Flutter TextField 值总是大写和去抖动【英文标题】:Flutter TextField value always uppercase & debounce 【发布时间】:2018-08-20 16:33:59 【问题描述】:

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

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

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

【问题讨论】:

您想将第一个字符大写还是所有文本都大写?您可以使用来自github.com/ReactiveX/rxdart的 debounce 需要所有字符大写。 @GünterZöchbauer 您的问题涉及 TextField 的两个不同方面。下次请教两个问题。我拒绝对一个本来很好的问题投赞成票。 【参考方案1】:

适用于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(),
  ]
)

Full example

【讨论】:

我不知道为什么这个解决方案没有更多的赞成票。据我所知,这是实现自动大写格式(或任何类型的文本字段格式)的正确方法。 嘿,如果你只需要在一个特定的地方,你实际上并不需要实现 textinputformater,看看我的回答如何在不扩展 TextInputFormatter 的情况下使用它 这就是我所说的“质量”解决方案,与其他平台不同,适用于每个平台,谢谢 :) 此答案在键盘中启用自动更正时会导致错误(它将 OldValue 与 NewValue 附加)。例如:我想输入 KEYBOARD:第一个字母类型 K,第二个字母类型 E,现在它替换为 KKE,依此类推,逐个字母键入它是在 OldValue 后面加上 NewValue。 @rjkolli 我无法重现您的问题。这个解决方案似乎有效。【参考方案2】:

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

TextField(
    textCapitalization: TextCapitalization.sentences,
)

【讨论】:

@praveenb textCapitalization.sentences 在输入文本字段时是否无法完全工作或值无法大写? p.s.每个句子的第一个单词仅大写,并在每个句号 (.) 后激活。 是的,我的错误......我看看我是否在 Textfield 中输入文本,然后它会被大写。以前,我预先填充了大写不起作用的文本。我认为应该。感谢您的澄清:)【参考方案3】:

您可以使用TextField 小部件的textCapitalization 属性。也请参考这里的详细 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

【讨论】:

【参考方案4】:

你需要做的就是:

在字符串之后放 .toUpperCase()

示例:"Some text".toUpperCase()

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

【讨论】:

这是关于文本输入字段的。没有可以更改的字符串。给定的文本是通过 TextEditingController 检索的,然后应该使用它在每次击键时修改字段中的文本。我不认为这是可能的。【参考方案5】:

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

TextField(
    textCapitalization: TextCapitalization.characters,
)

【讨论】:

不行,因为它只是将用户的键盘切换为大写,但用户可以切换回小写。格式化程序解决方案要好得多【参考方案6】:

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

TextField(
          controller: controllerReservation,
          onChanged: (value)                
            controllerReservation.value = 
               TextEditingValue(
                                text: value.toUpperCase(), 
                                selection: controllerReservation.selection);
          ,
        )

【讨论】:

这会将光标位置移动到开始 @Wahyu 我很确定我在发布这个答案时已经测试过了,但它没有。但如果需要,我会再次测试并发布改进版本。 @DiegoGarcia,我刚刚使用了您的代码示例,它确实将光标设置为字符串的开头并反转字符串 @PaulStoner 很抱歉很久才回答,我已经编辑了修复程序! 这是命令式思维。颤振完全相反。【参考方案7】:

TextField 有一个 textCapitalization 属性,您可以使用它来将单词、句子或字符大写

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

TextField(
  textCapitalization: TextCapitalization.characters,
 )

【讨论】:

我无法在 cmets 中发布完整代码,但如果您有一个简单的 Flutter 应用程序并输入一个文本字段,您可以在 Flutter 桌面上轻松验证这一点【参考方案8】:

要做大写

你必须使用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 是一个很好的默认值)。

【讨论】:

【参考方案9】:

以下是您如何在输入文本上实现去抖动(或延迟)效果:

1) 导入包

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

2) 在你的 Stateful Widget 中声明如下

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)),

【讨论】:

【参考方案10】:

@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());
  

【讨论】:

【参考方案11】:

 textCapitalization: TextCapitalization.characters,

简单!

【讨论】:

这应该是公认的答案。谢谢Apoorv 不起作用,兄弟。 @RahulKushwaha 哎呀!也许有些地方发生了变化,你能分享代码让我看看吗?【参考方案12】:
TextField(
  controller: textController,
    onChanged: (value) 
      if (textController.text != value.toUpperCase())
        textController.value = textController.value.copyWith(text: value.toUpperCase());
  ,
)

【讨论】:

以上是关于Flutter TextField 值总是大写和去抖动的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Newbie:修改 Textfield 值打破对 TextField 的关注

如何在flutter中获取TextField值

Flutter TextField 设置默认值和光标位置

Flutter:使用初始值文本时如何隐藏TextField文本指针(光标)(Android)

使用 TextField Flutter 选择购物车数量

在 TextInputType 更改后控制器重置的 Flutter TextField