Flutter开发问题:如何将TextEditingController文本转为整数?
Flutter中正确将TextFormField的duration输入转换为整数的方法
错误原因分析
你的代码报错核心问题有两个:
- 参数类型错误:
int.tryParse()需要传入字符串参数,但你直接传了duration(TextEditingController实例),正确的应该是取它的text属性,即duration.text。 - 时机错误:在State初始化阶段就执行解析,此时
duration.text是空字符串,解析结果为null,而且后续用户输入内容后,这个变量不会自动更新,完全失去意义。
正确实现方案
1. 移除无效的初始化代码
删掉这行错误的变量定义:
int? week = int.tryParse(duration); // Error here under duration
2. 加强输入验证(提前拦截无效内容)
修改duration对应的TextFormField的validator,确保输入是有效整数,避免后续转换失败:
TextFormField( controller: duration, keyboardType: TextInputType.number, validator: (value) { if (value == null || value.isEmpty) { return 'fill the information'; } // 验证输入是否为有效整数 if (int.tryParse(value) == null) { return 'Please enter a valid number'; } return null; }, decoration: InputDecoration( hintText: 'type here', ), ),
3. 在提交时执行转换
在点击"ADD PLAN"的回调里,表单验证通过后再解析duration的输入,此时输入已经被validator校验为有效整数,可以安全转换:
MaterialButton( onPressed: () { if (formKey.currentState!.validate()) { // 转换为整数 int week = int.parse(duration.text); // 根据createPlanQAnswers的参数类型调整传入值:如果需要整数就传week,需要字符串就传week.toString() LifeStyleCubit.get(context).createPlanQAnswers( planName: planName.text, description: description.text, duration: week.toString(), goal: goal, level: levelChoose ); Navigator.push(context, MaterialPageRoute( builder: (context)=>PlanDetailsScreen(model))); } }, child: Text('ADD PLAN',style: TextStyle(color: Colors.white, fontSize: 17),), ),
(可选)实时更新转换结果
如果需要在用户输入时实时获取整数结果,可以给controller添加监听:
@override void initState() { super.initState(); // 监听输入变化实时解析 duration.addListener(() { setState(() { int? week = int.tryParse(duration.text); // 这里可以添加实时更新UI的逻辑 }); }); } @override void dispose() { duration.dispose(); super.dispose(); }
内容的提问来源于stack exchange,提问作者hazem saad
相关产品推荐
相关产品推荐

