如何限制颤动中的两个点?

时间:2019-12-30 13:02:11

标签: flutter dart

我需要限制用户输入1 ..这样的时间。我正在使用文本输入表单字段。我需要使用小数点输入文本格式化程序的类似1.23的输入

4 个答案:

答案 0 :(得分:4)

不推荐使用WhitelistingTextInputFormatter

TextField(
 keyboardType: TextInputType.numberWithOptions(decimal: true),
 inputFormatters: <TextInputFormatter>[
      FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d*')),
  ], // Only numbers can be entered
),

答案 1 :(得分:1)

解决方案

这是您针对特定用例需要做的事情:

TextFormField(
    inputFormatters: [
        WhitelistingTextInputFormatter(RegExp(r"\d+([\.]\d+)?")),
    ],
);

说明

您需要使用TextInputFormatter类。具体是WhitelistingTextInputFormatter

以上代码仅允许您在问题中提供的模式编号。可以选择任意数量的十进制数字(允许带一个小数点)的数字。

r中的字符串前面的r""前缀使字符串成为raw string。这样可以防止过滤和处理字符串中的特殊字符。来自docs

  

请注意,在上面的示例中使用了原始字符串(以r开头的字符串)。使用原始字符串将字符串中的每个字符视为文字字符。

正则表达式解剖

这里是正则表达式模式^\d+([\.]\d+)?$的剖析:

  • \d位数字-来自所有语言的allows位数字。
  • +一个或多个事件。
  • (PATTERN)?出现零次或多次-允许数字不带小数点/数字。
  • [\.]允许使用点字符-由于\是正则表达式中的控制字符,因此\可以将其转义。

来源

答案 2 :(得分:1)

我们可以创建自己的TextInputFormatter

检查

import 'package:flutter/services.dart';

class DecimalTextInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    final regEx = RegExp(r"^\d*\.?\d*");
    String newString = regEx.stringMatch(newValue.text) ?? "";
    return newString == newValue.text ? newValue : oldValue;
  }
}

用法:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstPage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: TextField(
          inputFormatters: [DecimalTextInputFormatter()],
        ),
      ),
    );
  }
}

答案 3 :(得分:1)

om-ha的答案是正确的,但是为了将来参考,从1.20版开始,Flutter中不推荐使用WhitelistingTextInputFormatter,现在我们应该改用FilteringTextInputFormatter.allow()。

或者如果需要的话,使用FilteringTextInputFormatter.deny代替BlacklistingTextInputFormatter。

以上代码应变为:

   TextFormField(
     inputFormatters: [
       FilteringTextInputFormatter.allow(RegExp(r"\d+([\.]\d+)?")),
     ],
    );