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

Flutter中Search Delegate内pushNamed引发安卓键盘异常问题

Flutter SearchDelegate跳转页面后目标页面底部空白(与键盘高度一致)的解决方法

在使用Flutter的SearchDelegate组件时,点击搜索建议中的ListTile触发pushNamed跳转页面后,目标页面底部会出现与键盘高度一致的空白区域,仿佛键盘未收起;手动关闭键盘后,页面显示恢复正常。

相关代码

跳转逻辑:

void showAndNavigate(BuildContext context, title, title2, gameId) {
    super.showResults(context);
    Navigator.pushNamed(context, RouteName.homeDetail, arguments: {
      'data': {
        'title': title,
        'title2': title2,
        'GameId': gameId,
      }
    });
}

搜索建议ListTile:

ListTile(
    title: Text(suggestion),
    onTap: () {
        query = suggestion;
        close(context, null);
        showAndNavigate(
            context, query, suggestionTitles[index], gameIds[index]);
    },
);

问题截图

  • SearchDelegate界面:Search delegate
  • 未手动关闭键盘跳转的异常界面:push without dismissing keyboard manually
  • 手动关闭键盘跳转的正常界面:push with dismissing keyboard manually

解决方法

方法1:跳转前强制收起键盘

在执行页面跳转前,调用FocusManager.instance.primaryFocus?.unfocus()手动收起键盘,确保目标页面布局计算时键盘已关闭:

void showAndNavigate(BuildContext context, title, title2, gameId) {
    // 强制收起键盘
    FocusManager.instance.primaryFocus?.unfocus();
    super.showResults(context);
    Navigator.pushNamed(context, RouteName.homeDetail, arguments: {
      'data': {
        'title': title,
        'title2': title2,
        'GameId': gameId,
      }
    });
}

方法2:使用SearchDelegate原生方法处理建议选择

SearchDelegate提供了onSelectedSuggestion和selectSuggestion方法,专门用于处理搜索建议的点击事件,原生逻辑会自动处理键盘收起和搜索界面关闭,更符合组件设计规范:

  1. 重写onSelectedSuggestion方法:
@override
void onSelectedSuggestion(String suggestion) {
    int index = suggestionsList.indexOf(suggestion);
    // 关闭搜索界面并收起键盘
    close(context, suggestion);
    // 跳转目标页面
    Navigator.pushNamed(context, RouteName.homeDetail, arguments: {
      'data': {
        'title': suggestion,
        'title2': suggestionTitles[index],
        'GameId': gameIds[index],
      }
    });
}
  1. 修改ListTile的onTap:
ListTile(
    title: Text(suggestion),
    onTap: () => selectSuggestion(suggestion),
);

问题原因

点击ListTile跳转时,键盘仍处于激活状态,Flutter未及时触发目标页面的布局重绘,导致页面保留了键盘占用的高度空间。手动关闭键盘会触发布局重新计算,因此显示恢复正常。通过提前收起键盘或使用组件原生方法,可避免该布局异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:57:18