You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter桌面应用:如何实现仅接受数字输入的TextField?

问题原因

keyboardType: TextInputType.number 仅对移动端生效——它的作用是唤起数字专用键盘,但在桌面平台(Windows、macOS、Linux)上,用户可通过物理键盘或系统软键盘输入任意字符,该属性无法限制输入内容。

解决方案

要在桌面端实现仅允许输入数字的TextField,需通过inputFormatters配置输入格式化器,过滤非数字字符。具体步骤:

  1. 导入flutter/services.dart包,使用内置的FilteringTextInputFormatter
  2. 为每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:59:50