如何在Dart文件间传值?timePicker.dart到showTime.dart传值遇异常
解决Flutter中timePicker与showTime页面的值传递问题
问题原因
你碰到的问题核心有两点:
showDialog是异步操作,你在调用它之后立刻给showTimeController赋值,这时用户还没完成时间选择,全局变量还是初始值- 全局变量更新后,
showTime页面不会自动感知状态变化,没法触发UI刷新
最优解决方案(无需全局变量)
利用showDialog的返回值获取选择的时间,这是弹窗交互场景下最直接、耦合度最低的方案。
修改timePicker.dart,让Dialog返回选中时间
// timePicker.dart Future<TimeOfDay?> showTimePickerDialog(BuildContext context, TimeOfDay initialTime) { return showDialog<TimeOfDay>( context: context, builder: (context) { TimeOfDay _selectedTime = initialTime; return AlertDialog( title: const Text('选择时间'), content: TextField( controller: TextEditingController() ..text = DateTimes.periodTime(time: _selectedTime), readOnly: true, onTap: () async { final pickedTime = await showTimePicker( context: context, initialTime: _selectedTime, ); if (pickedTime != null) { setState(() { _selectedTime = pickedTime; }); } }, ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('取消'), ), TextButton( onPressed: () => Navigator.pop(context, _selectedTime), child: const Text('确认'), ), ], ); }, ); }
修改showTime.dart,等待Dialog返回后更新控制器
// showTime.dart TextFormField( readOnly: true, controller: showTimeController, decoration: InputDecoration( suffixIcon: IconButton( icon: const Icon(Icons.open_in_new_rounded), onPressed: () async { // 等待时间选择弹窗返回结果 final selectedTime = await showTimePickerDialog( context, TimeOfDay.now(), // 可根据需求设置初始时间 ); if (selectedTime != null) { // 将选中时间转为字符串后赋值给控制器 showTimeController.text = DateTimes.periodTime(time: selectedTime); } }, ), ), )
为什么不推荐全局变量方案
全局变量会导致状态耦合度高,不易维护,而且没法自动触发页面UI刷新,需要手动调用setState更新,容易引发状态混乱。
内容的提问来源于stack exchange,提问作者Ae Gg
相关产品推荐
相关产品推荐

