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

Flutter中如何为CupertinoSearchTextField添加Cancel按钮?

解决方案

Flutter 的 CupertinoSearchTextField 默认没有内置原生 iOS 样式的「Cancel」按钮(用于移除输入框焦点),但可以通过自定义布局结合焦点管理轻松实现该功能,完全贴合原生交互逻辑。

实现代码示例

import 'package:flutter/cupertino.dart';

class CustomSearchBar extends StatefulWidget {
  const CustomSearchBar({super.key});

  @override
  State<CustomSearchBar> createState() => _CustomSearchBarState();
}

class _CustomSearchBarState extends State<CustomSearchBar> {
  final FocusNode _searchFocusNode = FocusNode();
  final TextEditingController _searchController = TextEditingController();

  @override
  void dispose() {
    _searchFocusNode.dispose();
    _searchController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Expanded(
          child: CupertinoSearchTextField(
            focusNode: _searchFocusNode,
            controller: _searchController,
            placeholder: '搜索',
            onChanged: (value) {
              // 你的搜索逻辑
            },
          ),
        ),
        // 仅在输入框获焦时显示Cancel按钮
        Visibility(
          visible: _searchFocusNode.hasFocus,
          child: Padding(
            padding: const EdgeInsets.only(left: 8.0),
            child: CupertinoButton(
              padding: EdgeInsets.zero,
              onPressed: () {
                // 移除输入框焦点
                _searchFocusNode.unfocus();
                // 可选:清空输入内容
                _searchController.clear();
              },
              child: const Text('Cancel', style: TextStyle(color: CupertinoColors.systemBlue)),
            ),
          ),
        ),
      ],
    );
  }
}

关键细节说明

  • 使用 FocusNode 管理输入框焦点,通过 unfocus() 方法实现点击「Cancel」移除焦点的核心需求
  • 借助 Visibility 组件让按钮仅在输入框获得焦点时显示,和原生 iOS 行为保持一致
  • 搭配 TextEditingController 可实现点击「Cancel」时同时清空输入内容的额外功能(可选)

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:50:29