微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter 动态文本字段自动补全

如何解决Flutter 动态文本字段自动补全

我使用库 autocomplete_textfield 创建具有自动完成功能的文本字段。每次更改文本时,我都会请求获取特定的用户列表,然后将它们设置为我的 AutocompleteTextfield 的建议。该列表似乎已更新(当我打印(list.length)时),但在视觉上不是。有什么想法吗?

我的自动完成文本字段:

AutoCompleteTextField<User>(
  textChanged: (item) async {
    await model.searchRecommendation(item);
  },decoration: Inputdecoration(
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(0)
    ),labelText: 'Recommendations',labelStyle: TextStyle(color: AppColors.blackColor)
  ),key: autocompleteUserSearchTextFieldKey,suggestionsAmount: 3,controller: _userSearchController,itemSubmitted: (item) {},suggestions: model.userRecommendations,itemBuilder: (context,suggestion) => new Padding(
    padding: EdgeInsets.all(16),child: ListTile(
      title: Text(suggestion.email)
    ),),itemSorter: (a,b) => a.email.compareto(b.email),itemFilter: (suggestion,input) => suggestion.email.toLowerCase().startsWith(input.toLowerCase()),

我的视图模型:

List<User> userRecommendations = [];

Future searchRecommendation(String filter) async {
  var token = await SharedPreferenceUtils().getStringValue('jwt');
  final response = await _api.filterUserSearch(filter,currentUser,token);
  if (response is Successstate) {
    List<dynamic> tmp = response.value.payload;
    tmp ??= [];
    userRecommendations = List<User>.from(tmp.map((x) => User.fromJson(x)));
    notifyListeners();
  } else if (response is ErrorState) {
    String error = response.msg;
    print('Error $error');
  } else {
    print('Error');
  }
}

解决方法

我没有看到您的所有代码,但我认为小部件树没有被重建。您必须用 AutoCompleteTextFieldFutureBuilder 包裹 StreamBuilder(取决于您的实现,无论如何 StreamBuilder 在那里似乎更合适)以听取建议结果。

您也可以实现 StatefulWidget 或使用 StatefulBuilder

StatefulBuilder 的示例(它很脏但应该可以工作,理想情况下您可以使用 StreamBuilder):

return StatefulBuilder(
  builder: (context,setState) => AutoCompleteTextField<User>(
    textChanged: (item) async {
      await model.searchRecommendation(item);
      setState(() {});
    },decoration: InputDecoration(
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(0)),labelText: 'Recommendations',labelStyle: TextStyle(color: AppColors.blackColor)),key: autocompleteUserSearchTextFieldKey,suggestionsAmount: 3,controller: _userSearchController,itemSubmitted: (item) {},suggestions: model.userRecommendations,itemBuilder: (context,suggestion) => new Padding(
      padding: EdgeInsets.all(16),child: ListTile(title: Text(suggestion.email)),),itemSorter: (a,b) => a.email.compareTo(b.email),itemFilter: (suggestion,input) => suggestion.email.toLowerCase().startsWith(input.toLowerCase()),);
,

Nvm 我找到了答案! AutocompleteTextfield 有一个名为 updateSuggestions() 的方法。我只是不得不使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。