未实施Flutter TextField maxLength

问题描述

我正在实现两个简单的对话框,以允许用户在我的应用程序中编辑两个设置。从代码中可以看到,它们非常相似。 第一个,用于输入5位数字(稍后将String转换为数字):

var tfController = TextEditingController();
String newPort = await showDialog<String>(
    context: context,builder: (BuildContext context) {
      return AlertDialog(
        content: Center(
            heightFactor: 1,child: TextField(
              controller: tfController,keyboardType: TextInputType.number,maxLength: 5,autofocus: true,decoration: Inputdecoration(labelText: "Insert number:"),onEditingComplete: () {
                Navigator.of(context).pop(tfController.text);
              },)),actions: [
          FlatButton(
            child: Icon(Icons.done),onpressed: () {
              Navigator.of(context).pop(tfController.text);
            },),FlatButton(
              child: Icon(Icons.clear),onpressed: () {
                Navigator.of(context).pop();
              })
        ],);
    });

第二个对话框,通用文本输入:

var tfController = TextEditingController();
String newHeader = await showDialog<String>(
    context: context,keyboardType: TextInputType.text,maxLength: 30,maxLengthEnforced: true,//added later even if it's true by default,doesn't change anything
              autofocus: true,decoration: Inputdecoration(labelText: "Insert text:"),);
    });

一个对话框可以正常工作:需要时,它会弹出并显示已聚焦的字段,键盘显示数字,并且输入会自动限制为长度5,如预期的那样。因此,当我需要用户输入有限的文本字符串时,我只需复制代码,只更改长度即可。 一切似乎都可以正常工作,因此起初我什至没有去检查maxLength是否得到了执行:我很久以后才发现,第二个对话框允许用户超过最大长度,尽管它正确无误。将提示和下划线的颜色更改为红色,以使用户知道出了什么问题。

我知道我可以轻松地为此设置解决方法,例如在用户确认输入后将String截断,但问题更多是关于为什么两个对话框的行为方式不同而不是如何解决 strong>。

解决方法

我不确定它是否会正常工作,我在使用maxLength时遇到了同样的问题,并且已经通过使用inputFormatters属性来解决了这个问题。以下代码会将textFormField的长度限制为30:

首先导入软件包import 'package:flutter/services.dart';

new TextField(
  inputFormatters: [
    new LengthLimitingTextInputFormatter(30),],),
,

您应该仔细阅读official document

maxLength属性

文本字段中允许的最大字符数(Unicode标量值)。

如果设置,将在该字段下方显示一个字符计数器,显示已输入的字符数。如果设置为大于0的数字,则还将显示允许的最大数字。如果设置为TextField.noMaxLength,则仅显示当前字符数。

输入maxLength字符后,除非将maxLengthEnforced设置为false,否则将忽略其他输入。文本字段使用LengthLimitingTextInputFormatter强制执行长度,该长度在提供的inputFormatters(如果有)之后进行评估。

此值必须为null,TextField.noMaxLength或大于0。如果为null(默认值),则可以输入的字符数没有限制。如果设置为TextField.noMaxLength,则不会强制执行任何限制,但是仍将显示输入的字符数。

字符计数中包含空格字符(例如,换行符,空格,制表符)。

如果将maxLengthEnforced设置为false,则可能会输入超过maxLength个字符,但是当超出限制时,错误计数器和除法器将切换到装饰的InputDecoration.errorStyle。

限制 文本字段当前不计算Unicode字素簇(即,用户可见的字符),而是计算Unicode标量值,从而遗漏了许多有用的可能字符(例如许多emoji表情和合成字符),因此在这些字符的存在。如果您希望遇到这类字符,请大方使用maxLength。

例如,字符“ö”可以表示为“ \ u {006F} \ u {0308}”,即字母“ o”后跟组成的透音符号“¨”,也可以表示为'\ u {00F6}',它是Unicode标量值“带有DIAERESIS的拉丁文小写字母O”。在第一种情况下,即使用户看不到输入的差异,文本字段也将计数两个字符,第二种情况将被计数为一个字符。

同样,某些表情符号由多个标量值表示。 Unicode“ THUMBS UP SIGN + MEDIUM SKIN TONE MODIFIER”,“??”,应视为一个字符,但因为它是两个Unicode标量值'\ u {1F44D} \ u {1F3FD}'的组合,则被视为两个字符。

Here是您要寻找的。 @刺客有一个很好的答案。

,

这个问题变得无关紧要,因为 maxLengthEnforced 参数已被弃用,取而代之的是 maxLengthEnforcement,后者具有更复杂的行为。

,

你需要升级到flutter 1.22.6

在控制台写一条命令:

flutter version 1.22.6