在我的应用程序中,用户必须在textformfield中插入一个名字。当用户在写一个查询时,应该对数据库进行查询,这控制着这个名字是否已经存在。这个查询返回这个名字存在的次数。到目前为止,我可以在按下一个按钮时进行查询。
此函数返回名称的计数:
checkRecipe(String name) async{
await db.create();
int count = await db.checkRecipe(name);
print("Count: "+count.toString());
if(count > 0) return "Exists";
}
这是TextFormField,应该异步验证:
TextField(
controller: recipeDescription,
decoration: InputDecoration(
hintText: "Beschreibe dein Rezept..."
),
keyboardType: TextInputType.multiline,
maxLines: null,
maxLength: 75,
validator: (text) async{ //Returns an error
int count = await checkRecipe(text);
if (count > 0) return "Exists";
},
)
代码的错误是:
无法将参数类型Future分配给参数类型String
我知道这个错误是什么意思。但是我不知道如何解决这个问题。如果有人能帮助我,那就太好了。
我找到了solution。
“我的代码”现在如下所示:
//My TextFormField validator
validator: (value) => checkRecipe(value) ? "Name already taken" : null,
//the function
checkRecipe<bool>(String name) {
bool _recExist = false;
db.create().then((nothing){
db.checkRecipe(name).then((val){
if(val > 0) {
setState(() {
_recExist = true;
});
} else {
setState(() {
_recExist = false;
});
}
});
});
return _recExist;
}
3条答案
按热度按时间6ie5vjzr1#
也许您可以使用
onChange
处理程序运行async
检查,并设置一个局部变量来存储结果。比如:
uyto3xhc2#
我希望我们的一个应用程序也有同样的行为,最后写了一个小部件(我最近发布到pub.dev)。
您可以为
validator
传入一个Future<bool>
函数,并设置文本发送到服务器之前的时间间隔。该代码在github上提供。
kkih6yb83#
试试这样的方法: