[英]Flutter - return Search delegate result string to a textfield
我有一个带有应该有医生姓名的文本字段的表单,单击它时会调用 ShowSearch() 来搜索医生姓名
我已经实现了几乎所有东西,我不能做的是当用户单击其中一个建议时,我希望这个建议(单个文本)到 go 回到上一个小部件中的 Textfield。
我的文本字段:
TextFormField(
onTap: (){showSearch(context: context, delegate: DataSearch());},
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600),
decoration: new InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.white, width: 2.0),
borderRadius:
BorderRadius.circular(8.0),
),
labelText: "Doctor name",
labelStyle: MyFontStyles.textFieldsLabelStyle(context),
),
),
我的节目搜索():
class DataSearch extends SearchDelegate<String> {
@override
List<Widget> buildActions(BuildContext context) {
return [IconButton(icon:Icon(Icons.clear),onPressed: (){query
="";},)];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow,
progress: transitionAnimation,
),
onPressed: () {close(context, "search result");},
);
}
@override
Widget buildResults(BuildContext context) {
// TODO: implement buildResults
throw UnimplementedError();
}
// ! CALLS SYNC FUNCTIONS WITHOUT AWAIT !
@override
Widget buildSuggestions(BuildContext context) {
DoctorsController.fetchAllDoctors();
List doctorsList = DoctorsController.getDoctorsNamesAsList();
final List<String>suggestionList =query.isEmpty? doctorsList :
doctorsList.where((element) => element.contains(query)).toList();
return ListView.builder(
itemBuilder: (context, index) {
String sugText = suggestionList[index];
return ListTile(
title:
RichText(
text: TextSpan(
text:sugText.substring(0, sugText.indexOf(query)),
style:
TextStyle(color: Colors.grey),
children: [
TextSpan(
text: sugText.substring(sugText.indexOf(query), sugText.indexOf(query)+query.length),
style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),
),TextSpan(
text: sugText.substring(sugText.indexOf(query)+query.length, sugText.length),
style: TextStyle(color: Colors.grey),
)
],
),
)
);},
itemCount: suggestionList.length,
);
}
}
应使用所选结果作为参数调用 close。 这将关闭搜索页面并将结果返回给 [showSearch] 的初始调用者。
例如
class CustomSearch extends SearchDelegate<String> {
CustomSearch({String hintText});
@override
Widget buildSuggestions(BuildContext context) {
...
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, i) {
return ListTile(
title: Text(data[i]),
onTap: () {close(context, data[i])},
)
...
}
并将结果返回给 [showSearch] 的初始调用者
onTap: () async {
final result = await showSearch(
context: context,
delegate: CustomSearch(hintText: "My Custom Search"),
);
}
使用 TextEditingController 作为您的 TextField controller。 将其传递给您的 searchDelegate。
class DataSearch extends SearchDelegate<String> {
final TextEditingController controller;
DataSearch(this.controller);
// in buildSuggestions method
@override
...
ListTile(
onTap: controller.text = sugText,
)
...
}
final TextEditingController controller = TextEditingController();
onTap: () {
showSearch(
context: context,
delegate: DataSearch(controller ),
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.