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

Flutter中关闭DatePicker后TextFormField自动获焦问题求助

问题原因

当showDatePicker弹出时,系统会自动移除TextFormField的焦点;但在日期选择器关闭后,Flutter会默认将焦点重新返还给之前的输入框,这就会再次触发FocusNode的hasFocus监听,导致日期选择器重复弹出。

解决方法

在弹出日期选择器之前,主动调用_focusNode.unfocus()让输入框失去焦点,避免关闭选择器后焦点自动返回。同时添加状态标记,防止重复触发逻辑,提升稳定性。

修改后的完整代码

class MyWidget extends Stateful Widget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final FocusNode _focusNode = FocusNode();
  final TextEditingController _textEditingController = TextEditingController();
  bool _isDatePickerShowing = false;

  @override
  void initState() {
    _focusNode.addListener(() async {
      if (_focusNode.hasFocus && !_isDatePickerShowing) {
        // 主动移除输入框焦点,避免关闭选择器后焦点自动恢复
        _focusNode.unfocus();
        _isDatePickerShowing = true;
        
        DateTime? selectedDate = await showDatePicker(
          useRootNavigator: false,
          context: context,
          initialDate: DateTime.now(),
          firstDate: DateTime(2000),
          lastDate: DateTime(2100),
        );

        if (selectedDate != null) {
          _textEditingController.text = selectedDate.toLocal().toString();
        }
        _isDatePickerShowing = false;
      }
    });
    super.initState();
  }

  @override
  void dispose() {
    _focusNode.dispose();
    _textEditingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: _textEditingController,
      focusNode: _focusNode,
      // 可选:设置为只读,禁止手动输入日期,仅通过选择器填充
      readOnly: true,
    );
  }
}

关键修改说明

  • 弹出日期选择器前调用_focusNode.unfocus(),彻底移除输入框焦点,从根源避免关闭选择器后焦点自动恢复的问题。
  • 添加_isDatePickerShowing状态标记,防止在日期选择器显示期间重复触发监听逻辑,避免意外重复弹出。
  • 可选设置readOnly: true,让输入框仅支持通过日期选择器填充内容,符合业务逻辑且提升交互体验。

内容的提问来源于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 15:42:20