繁体   English   中英

Flutter - 将搜索委托结果字符串返回到文本字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM