我无法找到在Flutter中创建一个只打开数字键盘并且仅接受数字输入的输入字段的方法。使用Flutter材料小部件是否可能实现这一点?一些GitHub讨论似乎表明这是一个支持的功能,但是我无法找到任何相关文档。
keyboardType: TextInputType.number
import 'package:flutter/material.dart';
import 'package:flutter/services.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>[
FilteringTextInputFormatter.digitsOnly
], // Only numbers can be entered
),
],
),
),
);
}
}
TextField
或TextFormField
只接受数字输入的人,可以尝试使用以下代码块:
适用于Flutter 1.20或更新版本
TextFormField(
controller: _controller,
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
// for below version 2 use this
FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
// for version 2 and greater youcan also use this
FilteringTextInputFormatter.digitsOnly
],
decoration: InputDecoration(
labelText: "whatever you want",
hintText: "whatever you want",
icon: Icon(Icons.phone_iphone)
)
)
对于早期版本的1.20
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)
)
)
注意:使用FilteringTextInputFormatter
时,需要导入services.dart
import 'package:flutter/services.dart';
inputFormatters: <TextInputFormatter>[ WhitelistingTextInputFormatter.digitsOnly ],
(该代码)用于输入文本格式化,并只允许输入数字。 - SilkeNL通过这个选项,你可以严格限制另一个字符而不包括数字。
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
keyboardType: TextInputType.number,
要使用上述选项,您需要导入此内容
import 'package:flutter/services.dart';
使用这种选项,用户无法在文本字段中粘贴字符
设置键盘和验证器
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
...
num
不可用。需要更改名称。 - Günter Zöchbauer为避免粘贴非数字值,请在后面添加
keyboardType: TextInputType.number
这段代码:
inputFormatters: [FilteringTextInputFormatter.digitsOnly]
来自 https://api.flutter.dev/flutter/services/FilteringTextInputFormatter-class.html
对于那些需要在文本字段中使用货币格式的人:
只能使用:, (逗号)和. (句点)
并屏蔽符号:- (连字号、减号或破折号)
以及:⌴(空格)
在您的TextField中,只需设置以下代码:
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [BlacklistingTextInputFormatter(new RegExp('[\\-|\\ ]'))],
连字符和空格符号将仍然出现在键盘上,但将变成被阻止的状态。
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:flutter/services.dart';
您可以在this dartpad上检查和测试完整的演示。
如果您只想在字符串开头允许负号:
final RegExp _myPattern = RegExp(r'^-?[\d,.]*$');
(...)
TextInputFormatter.withFunction(
(TextEditingValue oldValue, TextEditingValue newValue) {
return _myPattern.hasMatch(newValue.text)
? newValue
: oldValue;
},
),
TextField
小部件必须设置keyboardType: TextInputType.number,
和inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly]
,以仅接受数字作为输入。 TextField(
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly
], // Only numbers can be entered
),
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"),
],
)),
);
}
}
你可以将这两个属性与TextFormField一起使用
TextFormField(
keyboardType: TextInputType.number
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
只允许输入数字,其他字符无效。
https://api.flutter.dev/flutter/services/TextInputFormatter-class.html
keyboardType
会触发数字键盘:keyboardType: TextInputType.number
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
],
问题在于,这个正则表达式每次只匹配一个符号,所以无法通过这种方式限制小数点的数量(例如)。
此外,其他人也表明,如果需要对十进制数进行验证,可以使用TextFormField
及其validator
参数来实现:
new TextFormField(
keyboardType: TextInputType.number,
validator: (v) => num.tryParse(v) == null ? "invalid number" : null,
...
这样做的问题是它不能在交互式中实现,只能在表单提交时实现。
我想要只允许输入十进制数,而不是稍后进行验证。我的解决方案是编写一个利用int.tryParse
的自定义格式化程序:
/// Allows only decimal numbers to be input.
class DecimalNumberFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
// Allow empty input and delegate formatting decision to `num.tryParse`.
return newValue.text != '' && num.tryParse(newValue.text) == null
? oldValue
: newValue;
}
}
另一种方法是使用正则表达式作为定制格式化程序,这将适用于整个输入,而不仅仅是单个符号:
/// Allows only decimal numbers to be input. Limits decimal plates to 3.
class DecimalNumberFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
// Allow empty input.
if (newValue.text == '') return newValue;
// Regex: can start with zero or more digits, maybe followed by a decimal
// point, followed by zero, one, two, or three digits.
return RegExp('^\\d*\\.?\\d?\\d?\\d?\$').hasMatch(newValue.text)
? newValue
: oldValue;
}
}
这样,我还可以将小数点位数限制为3。