我对 Flutter 和 Dart 非常陌生,所以我正在尝试构建一个简单的搜索应用程序,其中基于在 Flutters showSearch 搜索栏中输入的单词进行查询。我理解 listtile 是为了向用户显示建议而构建的,点击该建议将激活 buildresults 小部件。但是,我想启用键盘上的搜索按钮来简单地搜索输入的单词,而不是点击有限的建议列表。
正常点击按钮时,键盘关闭,构建结果不激活。到目前为止,您必须实际单击建议的列表选项。有没有办法让键盘的搜索按钮搜索输入的文本?或者用户是否仅限于建议的列表选项?我将在下面列出我的 showSearch 委托:
class StockDelegate extends SearchDelegate<String> {
final stocks = [
"IBM",
"NKLAW",
"DKNGZ",
"DRD",
"PRTS",
"TSLA",
"KIRK",
"VBIV"
];
final suggested = ["IBM", "TSLA", "BNTX"];
@override
// TODO: implement textInputAction
// TODO: implement textInputAction
TextInputAction get textInputAction => super.textInputAction;
@override
List<Widget> buildActions(BuildContext context) {
//actions for app bar
StockProvider _stockProvider =
Provider.of<StockProvider>(context, listen: true);
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () {
query = '';
}),
];
}
@override
Widget buildLeading(BuildContext context) {
//Leading icon on the left of the app bar
return IconButton(
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow,
progress: transitionAnimation,
),
onPressed: () {
close(context, null);
});
}
@override
Widget buildResults(BuildContext context) {
//build results code
}
@override
Widget buildSuggestions(BuildContext context) {
// show when someone search for something
stocks.insert(0, query.toString());
final suggestionList = query.isEmpty
? suggested
: stocks.where((p) => p.startsWith(query)).toList();
return ListView.builder(
itemCount: suggestionList.length,
itemBuilder: (context, index) => ListTile(
onTap: () async {
Provider.of<StockProvider>(context, listen: false)
.searchBySymbol(suggestionList[index]);
if (!stocks.contains(suggestionList[index]))
suggestionList.add(suggestionList[index]);
showResults(context);
},
leading: Icon(Icons.attach_money),
title: Text(suggestionList[index]),
),
);
}
不知道你是否了解onSubscribed属性,它是在
TextField/Text/TextFormField
中使用的。因为,我在任何地方都看不到你的TexFormField/Text/TextField
,但我认为你一定在某个地方使用它。
所以,这就是
onFieldSubmitted
的使用方式,它可以完成您想要的工作,即 当用户点击键盘上的放大镜时,它会运行您的功能
TextFormField(
controller: _yourTextEditingController,
textInputAction: TextInputAction.search,
onFieldSubmitted: (){
// here you do your operation when you hit the
// keypad magnifying lens
// check with print()
print('Pressed via keypad');
}
)
不要与
onSubmitted
名称混淆,onFieldSubmitted
用于 TextFormField/Text/TextField
,它使用 onSubmitted
属性。我希望这能回答您的问题:) 让我知道,这就是您正在寻找的东西。
覆盖
showResults()
方法,类似于buildSuggestions()
。
覆盖
showResults
方法如下:
@override
void showResults(BuildContext context) {
super.showResults(context);
showSuggestions(context);
FocusScope.of(context).unfocus();
}
TextFormField(
controller: _keyword,
textInputAction: TextInputAction.search, //<-- Enable search on keyboard
onFieldSubmitted: (value){//handle submit} //<-- Submit search on keyboard
)