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界面:

- 未手动关闭键盘跳转的异常界面:

- 手动关闭键盘跳转的正常界面:

解决方法
方法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方法,专门用于处理搜索建议的点击事件,原生逻辑会自动处理键盘收起和搜索界面关闭,更符合组件设计规范:
- 重写
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], } }); }
- 修改ListTile的onTap:
ListTile( title: Text(suggestion), onTap: () => selectSuggestion(suggestion), );
问题原因
点击ListTile跳转时,键盘仍处于激活状态,Flutter未及时触发目标页面的布局重绘,导致页面保留了键盘占用的高度空间。手动关闭键盘会触发布局重新计算,因此显示恢复正常。通过提前收起键盘或使用组件原生方法,可避免该布局异常。
内容的提问来源于stack exchange,提问作者Louis Liang
相关产品推荐
相关产品推荐

