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');
}
}
解决方案
我没有看到您的所有代码,但我认为小部件树没有被重建。您必须AutoCompleteTextField
使用FutureBuilder
或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()),
),
);
推荐阅读
- machine-learning - Capsule Networks - 面部表情识别
- pyspark - 如何对pyspark中每个组内的变量进行排序?
- python - 为什么这个 Python 代码不匹配欧式看涨期权的公式?
- class - 获取接口本身的名称而不是扩展类的名称
- maven - 检查器框架无法解析符号
${org.checkerframework:jdk8:jar} 问题 - vim - .vimrc 自动命令在打开新文件时添加文本
- ios - 移动设备管理 iOS
- asp.net - 在 ASP.NET GridView 中搜索标签值
- java - 带有斑马 jar 的应用程序无法在带有 INSTALL_FAILED_NO_MATCHING_ABIS 的非斑马设备上构建
- ios - 当 Appdelegate 中未设置 rootcontroller 时,视图隐藏在状态栏后面