Flutter桌面应用:如何实现仅接受数字输入的TextField?
问题原因
keyboardType: TextInputType.number 仅对移动端生效——它的作用是唤起数字专用键盘,但在桌面平台(Windows、macOS、Linux)上,用户可通过物理键盘或系统软键盘输入任意字符,该属性无法限制输入内容。
解决方案
要在桌面端实现仅允许输入数字的TextField,需通过inputFormatters配置输入格式化器,过滤非数字字符。具体步骤:
- 导入
flutter/services.dart包,使用内置的FilteringTextInputFormatter - 为每个TextField添加
inputFormatters参数,指定只允许数字输入
修改后的完整代码
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 新增导入 void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Number Sum', home: const NumberSumScreen(), ); } } class NumberSumScreen extends StatefulWidget { const NumberSumScreen({super.key}); @override State<NumberSumScreen> createState() => _NumberSumScreenState(); } class _NumberSumScreenState extends State<NumberSumScreen> { TextEditingController num1Controller = TextEditingController(); TextEditingController num2Controller = TextEditingController(); int totalSum = 0; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Number Sum')), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ TextField( controller: num1Controller, keyboardType: TextInputType.number, maxLength: 10, inputFormatters: [FilteringTextInputFormatter.digitsOnly], // 新增过滤规则 decoration: const InputDecoration( labelText: 'Enter Number 1 (10 digits)'), ), TextField( controller: num2Controller, keyboardType: TextInputType.number, maxLength: 10, inputFormatters: [FilteringTextInputFormatter.digitsOnly], // 新增过滤规则 decoration: const InputDecoration( labelText: 'Enter Number 2 (10 digits)'), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { calculateSum(); }, child: const Text('Calculate Sum'), ), const SizedBox(height: 16), Text( 'Total Sum: $totalSum', style: const TextStyle(fontSize: 20), ), ], ), ), ); } void calculateSum() { int num1 = int.tryParse(num1Controller.text) ?? 0; int num2 = int.tryParse(num2Controller.text) ?? 0; setState(() { totalSum = num1 + num2; }); } }
补充说明
FilteringTextInputFormatter.digitsOnly会自动过滤所有非数字字符,包括键盘输入和粘贴操作的内容- 保留
keyboardType: TextInputType.number依然有意义,它能在移动端提供更适配的数字键盘体验,且不影响桌面端的输入限制
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

