You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何实现TextField输入内容自动格式化为MAC地址格式

Flutter下TextField自动格式化MAC地址实现方案

完全可行,直接通过Flutter内置的TextInputFormatter能力就能实现,不需要依赖第三方库,也不需要额外监听控制器做复杂的文本处理,可完全匹配需求。

核心实现逻辑

自定义输入格式化类,拦截每次输入变更事件,依次做三个处理:

  • 剥离文本中已有的分隔符,拿到纯输入的有效字符
  • 有效字符长度达到阈值(排除分隔符共16位)时直接截断,禁止后续输入
  • 按每2个字符为一组插入:分隔符,同时修正光标位置,避免分隔符插入后光标错位

自定义格式化器代码

class MacAddressInputFormatter extends TextInputFormatter {
  static const int _segmentLength = 2;
  static const String _separator = ':';
  static const int _maxRawLength = 16; // 排除分隔符后的最大有效输入长度

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    // 提取纯有效字符,过滤所有已存在的分隔符
    String rawContent = newValue.text.replaceAll(_separator, '');
    // 超出最大长度直接截断,不再接收后续输入
    if (rawContent.length > _maxRawLength) {
      rawContent = rawContent.substring(0, _maxRawLength);
    }

    // 按段拼接分隔符
    final buffer = StringBuffer();
    for (int i = 0; i < rawContent.length; i += _segmentLength) {
      final segmentEnd = (i + _segmentLength > rawContent.length) 
          ? rawContent.length 
          : i + _segmentLength;
      buffer.write(rawContent.substring(i, segmentEnd));
      // 非最后一段则追加分隔符
      if (segmentEnd != rawContent.length) {
        buffer.write(_separator);
      }
    }

    // 修正光标位置
    int cursorOffset = buffer.length;
    final newInputOffset = newValue.selection.baseOffset;
    if (newInputOffset < buffer.length) {
      cursorOffset = newInputOffset;
      // 光标落在分隔符前时自动后移一位,避免输入位置错乱
      if (cursorOffset > 0 && buffer.toString()[cursorOffset - 1] == _separator) {
        cursorOffset += 1;
      }
    }

    return TextEditingValue(
      text: buffer.toString(),
      selection: TextSelection.collapsed(offset: cursorOffset),
    );
  }
}

组件接入方式

直接将格式化器传入TextField的inputFormatters配置即可,额外可搭配内置的字符过滤规则,限制仅能输入MAC地址合法的十六进制字符:

TextField(
  inputFormatters: [
    // 限制仅允许输入十六进制字符和分隔符,过滤非法输入
    FilteringTextInputFormatter.allow(RegExp(r'[0-9a-fA-F:]')),
    MacAddressInputFormatter(),
  ],
  decoration: const InputDecoration(
    labelText: 'MAC地址',
    border: OutlineInputBorder(),
  ),
)

实际效果

  • 输入过程中每输入2个有效字符,自动插入:分隔符,无需用户手动输入
  • 自动去重用户误输入的冒号,不会出现连续分隔符的格式错误
  • 有效字符(排除冒号)达到16位时自动拦截后续输入,打字、粘贴长内容场景均生效
  • 自动适配光标位置,不会出现分隔符插入后光标跳转到末尾、卡在分隔符位置的异常

内容的提问来源于stack exchange,提问作者eskemender

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:21:49