Flutter 颤振中的仅数字TextFormField

Flutter 颤振中的仅数字TextFormField,flutter,dart,Flutter,Dart,我正在开发一款应用程序,它需要在¥中输入价格,因此没有小数点。 如果我们使用键盘类型:TextInputType.numberWithOptions()我们可以获得数字键盘输入。 如果我们使用验证器:(输入){}我们可以检查输入是否有效,但我们无法阻止它 问题是我们可以保存不需要验证的草稿。 因此,我们最好首先只允许数字输入 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyA

我正在开发一款应用程序,它需要在
¥
中输入价格,因此没有小数点。 如果我们使用
键盘类型:TextInputType.numberWithOptions()
我们可以获得数字键盘输入。 如果我们使用
验证器:(输入){}
我们可以检查输入是否有效,但我们无法阻止它

问题是我们可以保存不需要验证的草稿。 因此,我们最好首先只允许数字输入

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Digits Only',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextFormField(
              autovalidate: true,
              keyboardType: TextInputType.number,
              validator: (input) {
                final isDigitsOnly = int.tryParse(input);
                return isDigitsOnly == null
                    ? 'Input needs to be digits only'
                    : null;
              },
            ),
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“仅限数字”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
TextFormField(
自动验证:true,
键盘类型:TextInputType.number,
验证器:(输入){
最终isDigitsOnly=int.tryParse(输入);
返回isDigitsOnly==null
?“输入只需是数字”
:null;
},
),
],
),
),
);
}
}

有没有办法阻止某些文本输入而只允许数字?

是的,您可以使用
inputFormatters
属性并添加
whitelistingdeputformatter.digitsOnly
表达式

  import 'package:flutter/services.dart';


  TextFormField(
          ...
          inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
        )
您可以在此处找到更多信息:

在Flatter 1.12之后,
WhiteListingDeputFormatter
已被弃用,并且您正在运行更新的版本,请使用:

FilteringtComputFormatter.digitsOnly


如果我没有误解您的意思,只需在textfield中使用
键盘类型:TextInputType.number,

我们需要两个组件:

  • 输入格式化程序

    这是数字键盘内部的主要技巧。您可以将其
    whitelistingteputformatter
    属性设置为
    digitsOnly

    要使用此键盘,首先需要
    导入services.dart
    文件

    TextFormField(
      ...
      inputFormatters: <TextInputFormatter>[
        WhitelistingTextInputFormatter.digitsOnly
      ],
    );
    
    keyboardType: TextInputType.number,
    
  • 这两个组件都是这样的

    TextField(
        keyboardType: TextInputType.number,
        inputFormatters: <TextInputFormatter>[
          WhitelistingTextInputFormatter.digitsOnly
        ],
    );
    
    TextField(
    键盘类型:TextInputType.number,
    输入格式化程序:[
    WhiteListingPutFormatter.digitsOnly
    ],
    );
    
    已弃用
    白名单设置器
    并使用双倍数字:

    keyboardType: TextInputType.numberWithOptions(decimal: true),
    inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9.,]+')),],
    onChanged: (value) => doubleVar = double.parse(value),
    
    RegExp('[0-9.,]+')
    允许0到9之间的数字,以及逗号和点

    您可以使用
    RegExp('([0-9]+(\.[0-9]+)?))
    只允许数字和一个点。见解释

    double.parse()
    将字符串转换为双精度

    别忘了你需要:
    import'package:flatter/services.dart'

    2021年4月或之后的更新:

    TextField(
       inputformatter: [
          FilteringTextInputFormatter.digitsOnly,
          ],
       textInputType: TextInputType.number,
    
    使用输入格式化程序的其他示例包括:

    TextField(
      inputFormatters: [
        FilteringTextInputFormatter.deny(RegExp(r'[/\\]')),
      ],
    )
    

    因此,在上述情况下,您可以

    inputFormatters: [
            WhitelistingTextInputFormatter(RegExp("[a-z A-Z á-ú Á-Ú 0-9]"))
          ]
    

    但是如何将键盘强制为数字?哦,很抱歉我找到了这个
    键盘类型:TextInputType.number,
    谢谢@diegoveloper,我使用了inputFormatters,同时使用了键盘类型的属性,谢谢alot@SunaArun当然:),跟随我的twitter了解更多关于颤振的信息:)我如何将数字限制在1-3之间。因此,只能键入数字
    1
    2
    3
    TextInputType。数字
    不能用作此处的解决方案,因为它仍然允许小数点,例如:14.50对于Flatter web,这很好。但如果在按非数字后返回空格,则会出错。谢谢您的帮助回答。它救了我。但是我有一个问题,如何只允许一个点?比如这个例子(8.88),为了防止像这样的事情(8..88),也为了防止像这样的事情(8.88.8)等等?Hi@xSuperMu。请尝试此正则表达式:^([0-9]+(\[0-9]+)?),如此答案所示:应为可接受答案
    
    Other options include:
    
    > lowercase letters: a-z
    > capital letters: A-Z
    > lowercase vowels accented: á-ú
    > capital vowels accented: Á-Ú
    > numbers: 0-9
    > space : (space)
    
    inputFormatters: [
            WhitelistingTextInputFormatter(RegExp("[a-z A-Z á-ú Á-Ú 0-9]"))
          ]