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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:45:44