如何在Flutter中创建数字输入字段?

Jan*_*ala 52 dart flutter

我无法找到一种方法在Flutter中创建一个可以打开数字键盘的输入字段.这可能与Flutter材料小部件有关吗?一些github讨论似乎表明这是一个受支持的功能,但我无法找到任何有关它的文档.

Ris*_*esh 102

您可以使用以下命令将数字指定为TextField的keyboardType:

keyboardType: TextInputType.number
Run Code Online (Sandbox Code Playgroud)

检查我的main.dart文件

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(
      home: new HomePage(),
      theme: new ThemeData(primarySwatch: Colors.blue),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      backgroundColor: Colors.white,
      body: new Container(
          padding: const EdgeInsets.all(40.0),
          child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new TextField(
            decoration: new InputDecoration(labelText: "Enter your number"),
            keyboardType: TextInputType.number,
            inputFormatters: <TextInputFormatter>[
    WhitelistingTextInputFormatter.digitsOnly
], // Only numbers can be entered
          ),
        ],
      )),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 已弃用:inputFormatters:[WhitelistingTextInputFormatter.digitsOnly]。而是使用: inputFormatters: [FilteringTextInputFormatter.digitsOnly] (30认同)
  • 不要忘记 =&gt; import 'package:flutter/services.dart'; (12认同)
  • inputFormatters:[WhitelistingTextInputFormatter.digitsOnly] 在这里也是必需的,因为逗号和点在答案中仍然可以被接受。 (12认同)
  • 但是我可以在该字段上粘贴文本(字符),您还有其他选择吗?@Rissmon Suresh (4认同)
  • 太棒了,谢谢!我真的希望Flutter构造函数文档的格式不是那么糟糕.完全错过了这个. (3认同)
  • 允许放置点、空格和粘贴表情符号 (2认同)

Mat*_*oma 34

为了避免粘贴非数字值,请在后面添加

keyboardType: TextInputType.number
Run Code Online (Sandbox Code Playgroud)

这段代码:

inputFormatters: [FilteringTextInputFormatter.digitsOnly] 
Run Code Online (Sandbox Code Playgroud)

来自https://api.flutter.dev/flutter/services/FilteringTextInputFormatter-class.html


Bil*_*şek 33

对于那些谁正在寻找制作TextFieldTextFormField只接受数字输入,试试这个代码块:

TextFormField(
    controller: _controller,
    keyboardType: TextInputType.number,
    inputFormatters: <TextInputFormatter>[
        WhitelistingTextInputFormatter.digitsOnly
    ],
    decoration: InputDecoration(
        labelText:"whatever you want", 
        hintText: "whatever you want",
        icon: Icon(Icons.phone_iphone)
    )
)
Run Code Online (Sandbox Code Playgroud)

  • 欢迎这样做,以避免用户粘贴非数字字符串(inputFormatters),谢谢。 (4认同)
  • 即使在 Flutter_web 中,这也能很好地工作。原因是在 flutter_web 中我们无法强制使用数字键盘,因此限制是自然的选择。谢谢@BilalŞimşek (4认同)
  • WhitelistingTextInputFormatter.digitsOnly 在 Flutter 2.2.2 中已弃用,而是使用 inputFormatters: &lt;TextInputFormatter&gt;[FilteringTextInputFormatter.digitsOnly] 仅允许数字(不允许使用逗号、空格或 #) (4认同)
  • 这是完美的解决方案! (2认同)
  • @Bensal您也可以将 RegExp(r'[0-9]') 用于controller.text。 (2认同)
  • 我使用 flutter 2.1.0,这仍然有效。`inputFormatters:&lt;TextInputFormatter&gt;[ WhitelistingTextInputFormatter.digitsOnly ],` (2认同)

Pau*_*elo 19

如果您需要使用数:

keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9.,]')),],
onChanged: (value) => doubleVar = double.parse(value),
Run Code Online (Sandbox Code Playgroud)

RegExp('[0-9.,]')允许使用 0 到 9 之间的数字,以及逗号和点。

RegExp('[0-9.,-]')允许使用 0 到 9 之间的数字,以及逗号、点和减号(用于负数)。

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

不要忘记您需要: import 'package:flutter/services.dart';

您可以在此 dartpad上检查和测试完整的演示

如果您只想在字符串开头允许减号:

final RegExp _myPattern = RegExp(r'^-?[\d,.]*$');
(...)
TextInputFormatter.withFunction(
  (TextEditingValue oldValue, TextEditingValue newValue) {
    return _myPattern.hasMatch(newValue.text)
        ? newValue
         : oldValue;
   },
 ),
Run Code Online (Sandbox Code Playgroud)

您可以在另一个 dartpad上检查和测试完整的demo2


Gün*_*uer 14

设置键盘和验证器

String numberValidator(String value) {
  if(value == null) {
    return null;
  }
  final n = num.tryParse(value);
  if(n == null) {
    return '"$value" is not a valid number';
  }
  return null;
}

new TextFormField(
    keyboardType: TextInputType.number, 
    validator: numberValidator, 
    textAlign: TextAlign.right
    ...
Run Code Online (Sandbox Code Playgroud)


San*_*dal 9

您可以将这两个属性与 TextFormField 一起使用

 TextFormField(
         keyboardType: TextInputType.number
         inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
Run Code Online (Sandbox Code Playgroud)

只允许输入数字,不允许输入其他内容..

https://api.flutter.dev/flutter/services/TextInputFormatter-class.html


Jav*_*haq 9

TextField控件需要设置keyboardType: TextInputType.number,inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly]接受数字只能作为输入。

     TextField(
            keyboardType: TextInputType.number,
            inputFormatters: <TextInputFormatter>[
              FilteringTextInputFormatter.digitsOnly
            ], // Only numbers can be entered
          ),
Run Code Online (Sandbox Code Playgroud)

DartPad 中的示例

飞镖的屏幕截图

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
          theme: ThemeData(primarySwatch: Colors.blue),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return HomePageState();
      }
    }
    
    class HomePageState extends State<HomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.white,
          body: Container(
              padding: const EdgeInsets.all(40.0),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("This Input accepts Numbers only"),
                  SizedBox(height: 20),
                  TextField(
                    decoration: InputDecoration(
                      focusedBorder: OutlineInputBorder(
                        borderSide:
                            BorderSide(color: Colors.greenAccent, width: 5.0),
                      ),
                      enabledBorder: OutlineInputBorder(
                        borderSide: BorderSide(color: Colors.red, width: 5.0),
                      ),
                      hintText: 'Mobile Number',
                    ),
                    keyboardType: TextInputType.number,
                    inputFormatters: <TextInputFormatter>[
                      FilteringTextInputFormatter.digitsOnly
                    ], // Only numbers can be entered
                  ),
                  SizedBox(height: 20),
                  Text("You can test be Typing"),
                ],
              )),
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)


Fel*_*hes 7

对于那些需要在文本字段中使用Money格式的人:

仅使用:,(逗号)和。(期)

并阻止符号:-(连字符,减号或破折号)

以及:(空格处)

在您的TextField中,只需设置以下代码:

keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [BlacklistingTextInputFormatter(new RegExp('[\\-|\\ ]'))],
Run Code Online (Sandbox Code Playgroud)

simbol连字符和空格仍将出现在键盘中,但会被阻塞。


小智 6

以下是 Android 上实际手机键盘的代码:

关键部分:keyboardType: TextInputType.phone,

  TextFormField(
    style: TextStyle(
      fontSize: 24
    ),
    controller: _phoneNumberController,
    keyboardType: TextInputType.phone,
    decoration: InputDecoration(
      prefixText: "+1 ",
      labelText: 'Phone number'),
    validator: (String value) {
      if (value.isEmpty) {
        return 'Phone number (+x xxx-xxx-xxxx)';
      }
      return null;
    },
  ),
Run Code Online (Sandbox Code Playgroud)


Har*_*ani 6

通过此选项,您可以严格限制没有编号的其他字符。

 inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
 keyboardType: TextInputType.number,
Run Code Online (Sandbox Code Playgroud)

对于使用以上选项,您必须导入此

import 'package:flutter/services.dart';
Run Code Online (Sandbox Code Playgroud)

使用这种选项的用户不能将char粘贴到文本字段中

  • 如果我只想要小数和数字。如何添加“.” 进入格式化程序的白名单? (3认同)
  • @anoop4real是的,我只是使用TextFormField(keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.allow((RegExp("[.0-9]"))) ], ) 有一个“。” 在正则表达式中 (3认同)
  • FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d*$')) (3认同)
  • @shababhsiddique它允许多个“.”。我想接受双数。知道怎么做吗? (2认同)

Blo*_*oss 6

仅限数字类型

keyboardType: TextInputType.number
Run Code Online (Sandbox Code Playgroud)

以及带有数字键盘的更多选项

keyboardType: TextInputType.numberWithOptions(decimal: true,signed: false)
Run Code Online (Sandbox Code Playgroud)


Ana*_*nan 6

只需将其添加到您的TextFormField

  keyboardType: TextInputType.number,
  inputFormatters: <TextInputFormatter>[
  FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), ],
Run Code Online (Sandbox Code Playgroud)

例子,

TextFormField(
        controller: textController,
        onChanged: (value) {
         print(value);
        },
        keyboardType: TextInputType.number,
        inputFormatters: <TextInputFormatter>[
          FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
        ],
      ),
Run Code Online (Sandbox Code Playgroud)


Pra*_*ave 6

要创建数字输入字段,您只需在textfieldtextformfield中提供以下属性。

TextField(
  keyboardType: TextInputType.number, // Set the keyboard type to number
  decoration: InputDecoration(
    hintText: 'Enter a number',
  ),
);
Run Code Online (Sandbox Code Playgroud)

快乐飘飘!


sta*_*anm 5

正如接受的答案所述,指定keyboardType会触发数字键盘:

keyboardType: TextInputType.number
Run Code Online (Sandbox Code Playgroud)

其他好的答案指出,一个简单的基于正则表达式的格式化程序可用于只允许输入整数:

inputFormatters: [
  FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
],
Run Code Online (Sandbox Code Playgroud)

这样做的问题是正则表达式一次只匹配一个符号,因此无法通过这种方式限制小数点的数量(例如)。

此外,其他人也表明,如果想要验证十进制数,可以通过使用 aTextFormField及其validator参数来实现:

new TextFormField(
    keyboardType: TextInputType.number, 
    validator: (v) => num.tryParse(v) == null ? "invalid number" : null, 
    ...
Run Code Online (Sandbox Code Playgroud)

这样做的问题是它不能以交互方式实现,而只能在表单提交时实现。


我想只允许输入十进制数字,而不是稍后验证。我的解决方案是编写一个自定义格式化程序,利用int.tryParse

keyboardType: TextInputType.number
Run Code Online (Sandbox Code Playgroud)

或者,可以为自定义格式化程序使用正则表达式,它适用于整个输入,而不仅仅是单个符号:

inputFormatters: [
  FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
],
Run Code Online (Sandbox Code Playgroud)

这样,我也可以将小数位数限制为 3。