我正在从 TextField
中读取用户提供的输入(在本例中为邮政编码),我需要对照数据库检查其有效性。但是,我需要在提交按钮(在这种情况下为 RaisedButton
)onPressed: () {}
lambda 函数内进行异步数据库查询。在大多数编程语言中,这是一项相当简单明了的任务。然而,我在 Flutter 中遇到的问题是,从异步数据库查询返回的 Future
对象只能由 FutureBuilder
对象使用,而这些对象又只返回 Widget
对象。我只需要返回一个 String
,然后我可以使用它通过 MaterialPageRoute
对象传递到新路由,或者在不更改路由的情况下向用户显示错误。有没有办法用 Flutter 做到这一点?返回一个小部件对我来说毫无用处,因为我不想创建一个新的小部件来显示。我正在使用 Flutter 0.3.2 和 Dart 2.0.0
作为我需要调用数据库查询的简化示例:
@override
Widget build(Buildcontext context) {
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Container(
padding: const EdgeInsets.all(16.0),
child: new TextField(
keyboardType: TextInputType.number,
controller: _controller,
decoration: new InputDecoration(
hintText: 'Zip Code',
),
onSubmitted: (string) {
return string;
},
),
),
new RaisedButton(
onPressed: () {
// use regex to test against user input
if (_controller.text != null && _controller.text.isNotEmpty) {
RegExp zipCodeRegExp = new RegExp(r"^(\d{5})$");
// if the user input validates...
if (zipCodeRegExp.hasMatch(_controller.text)) {
zipCode = _controller.text;
// need to perform database query here and return a string, not a Widget
} else {
// an else condition here
}
} else {
// an else condition here
}
}
}
),
],
);
}
也许我没有遵循 Flutter 的“口头禅”?感谢您对此的考虑和意见。
最佳答案
FutureBuilder
只是一个方便的助手,可以在 Future 完成时重建小部件树。
你可以使用
funcThatReturnsFuture().then((result) {
print(result);
setState(() {
someVal = result;
})
})
或
Future funcThatMakesAsyncCall() async {
var result = await funcThatReturnsFuture();
print(result);
setState(() {
someVal = result;
})
}
主要限制是你不能在没有 Future
的情况下直接将值返回给调用者,因为没有办法从异步执行返回到同步执行。
关于dart - Flutter - 是否可以在不使用 FutureBuilder 的情况下从 Future 中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296061/