Flutter 颤振:自动完成文本字段不使用自定义数据类型
我正在尝试构建一个具有自动完成功能的文本字段。我用的是软件包Flutter 颤振:自动完成文本字段不使用自定义数据类型,flutter,dart,autocomplete,autocompletetextview,Flutter,Dart,Autocomplete,Autocompletetextview,我正在尝试构建一个具有自动完成功能的文本字段。我用的是软件包 final TextEditingController _typeAheadController = TextEditingController(); List<String> usersList; //find and create list of matched strings List<String> _getSuggestions(String query) { List<String
final TextEditingController _typeAheadController = TextEditingController();
List<String> usersList;
//find and create list of matched strings
List<String> _getSuggestions(String query) {
List<String> matches = List();
matches.addAll(usersList);
matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
return matches;
}
//gets user list from db
void _getUsersList() async {
usersList = await databaseHelper.getUsersList();
}
//the above code is defined in the class, before build method
//builds the text field
TypeAheadFormField(
textFieldConfiguration: TextFieldConfiguration(
controller: _typeAheadController,
decoration: InputDecoration(labelText: 'Select a User'),
suggestionsCallback: (pattern) {
return _getSuggestions(pattern);
},
itemBuilder: (context, suggestion) {
return ListTile(
title: Text(suggestion),
);
},
transitionBuilder: (context, suggestionsBox, controller) {
return suggestionsBox;
},
onSuggestionSelected: (suggestion) {
_typeAheadController.text = suggestion;
},
validator: (val) => val.isEmpty
? 'Please select a user...'
: null,
onSaved: (val) => setState(() => _name = val),
),
//function that pulls data from db and create a list, defined in db class
//not directly relevant but it may help someone
Future<List<String>> getUsersList() async {
Database db = await instance.database;
final usersData = await db.query("users");
return usersData.map((Map<String, dynamic> row) {
return row["name"] as String;
}).toList();
}
我使用fromMap
和toMap
方法创建了用户模型类。有一个函数可以从数据库中检索用户并返回用户列表list
以下是构建自动完成字段的代码:
AutoCompleteTextField searchTextField = AutoCompleteTextField<Users>(
key: key,
clearOnSubmit: false,
suggestions: users,
style: TextStyle(color: Colors.black, fontSize: 16.0),
decoration: InputDecoration(
contentPadding: EdgeInsets.fromLTRB(10.0, 30.0, 10.0, 20.0),
hintText: "Search Name",
hintStyle: TextStyle(color: Colors.black),
),
itemFilter: (item, query) {
return item.name.toLowerCase().startsWith(query.toLowerCase());
},
itemSorter: (a, b) {
return a.name.compareTo(b.name);
},
itemSubmitted: (item) {
setState(() {
searchTextField.textField.controller.text = item.name;
});
},
itemBuilder: (context, item) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
item.name,
),
],
);
},
);
AutoCompleteTextField searchTextField=AutoCompleteTextField(
钥匙:钥匙,
clearOnSubmit:false,
建议:用户:,
样式:TextStyle(颜色:Colors.black,fontSize:16.0),
装饰:输入装饰(
contentPadding:EdgeInsets.fromLTRB(10.0,30.0,10.0,20.0),
hintText:“搜索名称”,
hintStyle:TextStyle(颜色:Colors.black),
),
itemFilter:(项目,查询){
return item.name.toLowerCase().startsWith(query.toLowerCase());
},
物品分拣员:(a、b){
返回a.name.compareTo(b.name);
},
已提交项目:(项目){
设置状态(){
searchTextField.textField.controller.text=item.name;
});
},
itemBuilder:(上下文,项){
返回行(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
正文(
item.name,
),
],
);
},
);
Q.我是错过了什么还是做错了什么
注意:
users
对象具有格式正确的用户列表,我已打印以验证这一点flatter\u typeahead
package
final TextEditingController _typeAheadController = TextEditingController();
List<String> usersList;
//find and create list of matched strings
List<String> _getSuggestions(String query) {
List<String> matches = List();
matches.addAll(usersList);
matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
return matches;
}
//gets user list from db
void _getUsersList() async {
usersList = await databaseHelper.getUsersList();
}
//the above code is defined in the class, before build method
//builds the text field
TypeAheadFormField(
textFieldConfiguration: TextFieldConfiguration(
controller: _typeAheadController,
decoration: InputDecoration(labelText: 'Select a User'),
suggestionsCallback: (pattern) {
return _getSuggestions(pattern);
},
itemBuilder: (context, suggestion) {
return ListTile(
title: Text(suggestion),
);
},
transitionBuilder: (context, suggestionsBox, controller) {
return suggestionsBox;
},
onSuggestionSelected: (suggestion) {
_typeAheadController.text = suggestion;
},
validator: (val) => val.isEmpty
? 'Please select a user...'
: null,
onSaved: (val) => setState(() => _name = val),
),
//function that pulls data from db and create a list, defined in db class
//not directly relevant but it may help someone
Future<List<String>> getUsersList() async {
Database db = await instance.database;
final usersData = await db.query("users");
return usersData.map((Map<String, dynamic> row) {
return row["name"] as String;
}).toList();
}
final TextEditingController\u typeAheadController=TextEditingController();
列出用户列表;
//查找并创建匹配字符串的列表
列表\u获取建议(字符串查询){
列表匹配项=列表();
matches.addAll(usersList);
matches.retainWhere((s)=>s.toLowerCase().contains(query.toLowerCase());
返回比赛;
}
//从数据库中获取用户列表
void\u getUsersList()异步{
usersList=等待databaseHelper.getUsersList();
}
//上面的代码是在类中定义的,在build方法之前
//构建文本字段
TypeAheadFormField(
textFieldConfiguration:textFieldConfiguration(
控制器:_-typeAheadController,
装饰:输入装饰(标签文本:“选择用户”),
suggestionsCallback:(模式){
返回建议(模式);
},
itemBuilder:(上下文、建议){
返回列表块(
标题:文本(建议),
);
},
transitionBuilder:(上下文、建议框、控制器){
返回建议框;
},
onSuggestionSelected:(建议){
_typeAheadController.text=建议;
},
验证程序:(val)=>val.isEmpty
?“请选择一个用户…”
:null,
onSaved:(val)=>setState(()=>_name=val),
),
//函数,该函数从db中提取数据并创建一个在db类中定义的列表
//不直接相关,但可能有帮助
未来的getUsersList()异步{
Database db=wait instance.Database;
最终用户数据=等待数据库查询(“用户”);
返回usersData.map((映射行){
以字符串形式返回行[“名称”];
}).toList();
}
PS:关于
autocomplete\u textfield
我错过的一件事是我们可以传递多个参数的方式,因为我们可以从我们自己的自定义模型继承,例如user
model。我知道这是可能的,但我是新手,所以仍然无法让它工作!:(我也遇到了同样的问题,解决方案是放置一个bool并显示一个CircularProgressIndicator,直到加载列表中的所有数据,从而呈现AutoCompleteTextField
例:
_卸载
?循环压缩机指示器()
:searchTextField=AutoCompleteTextField(此处为您的组件)
你的问题是……?“我是错过了什么还是做错了?”
实际上说的不多,它会崩溃吗?如果是这样,发布stacktrace,如果不是,什么不起作用?它不会崩溃,也不会显示预期的结果。大约有5个用户的起始字母A
,当我键入A
时,它会显示以A
开头的用户列表,但它不会显示任何内容。And控制台中没有任何错误。但是,当我键入一些内容并点击字段外部时,它会显示此错误W/IInputConnectionWrapper(5489):getCursorCapsMode on inactive InputConnection异常被手势捕获方法“where”在null上调用。接收器:null尝试调用:where(Closure:(Users)=>bool)
您正在使用?我有很多问题,当我切换到(更好的文档包)时,这些问题就消失了。谢谢,我会使用它。1.如何从项目中完全删除包?(想删除自动完成\u textfield
包)2.如何在末尾获取城镇名称?1.将其从pubspec.yaml
文件中删除,2.数据取自sqflite?您不需要getUsersList()
方法-只需更改\u getSuggestions(字符串模式)
即可返回db.query(“用户”,其中:“name like%?%”,wherergs:[模式])
-非常感谢您的建议,但它不起作用。我尝试了返回等待db.query('users',其中:“name LIKE%?%”,wherergs:[pattern])
并且它抛出了数据库异常
,所以我切换到返回等待db.rawQuery(“从name LIKE“%$pattern%”的用户中选择*))
但现在它抛出了错误:类型“Future”不是类型“FutureOr”的子类型
。我还试图将\u getSuggestions
定义为FutureOr
,但它抛出了不同的错误:类型“QueryRow”不是类型“String”的子类型。
@pskink我注意到类型先行
。如果我定义initial像这样的值\u typeAheadCon