Flutter - 是否可以在不使用FutureBuilder的情况下从Future中提取数据?

Ad *_*tra 9 dart flutter

我正在阅读用户提供的输入(在这种情况下是一个邮政编码)TextField,我需要检查数据库的有效性.但是,我需要在提交按钮(RaisedButton在本例中为一个)onPressed: () {}lambda函数内部进行异步数据库查询.在大多数编程语言中,这是一项相当简单和简单的任务.然而,我在Flutter中遇到的问题是,Future从异步数据库查询FutureBuilder返回的Widget对象只能由反过来只返回对象的对象使用.我只需要一个String返回,然后我可以使用它来通过一个MaterialPageRoute对象传递给一个新的路由,或者在不改变路由的情况下向用户显示错误.Flutter有没有办法做到这一点?返回Widget对我来说没用,因为我不想创建一个新的Widget来显示.我正在使用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
                        }
                    }
                }
            ),
        ],
    );
}
Run Code Online (Sandbox Code Playgroud)

也许我不是在跟随Flutter的"口头禅"?我感谢您对此的考虑和意见.

Ad *_*tra 17

我已经想通了(我相信这是君特最初所说的,但当时我不清楚根本原因)。能够在Future不创建Widget对象的情况下使用a的唯一方法是使用FutureAPI。该FutureAPI允许的解析Future对象,就好像它是一个AsyncSnapshot对象(它是其中一个将解析.dataFutureBuilder builder:函数)。这可以在返回的Future对象上执行(可以async与 一起使用await)。例如:

Future regionName = dbClient.getRegionNameFromZipCode(int.parse(zipCode)); <-- this database method getRegionNameFromZipCode returns a Future object and uses async and await

regionName.then((data) {
   String hZonesString = data[0]['hzone'];
   print(hZonesString);
}, onError: (e) {
     print(e);
   });
Run Code Online (Sandbox Code Playgroud)

一旦您了解了如何利用FutureAPI 以及它的意图与使用FutureBuilder. 很高兴知道这种语言的新手,比如我自己!


Gün*_*uer 13

FutureBuilder 只是一个方便的助手,可以在Future完成时重建小部件树.

您可以使用

funcThatReturnsFuture().then((result) {
  print(result);
  setState(() {
    someVal = result;
  })
})
Run Code Online (Sandbox Code Playgroud)

要么

Future funcThatMakesAsyncCall() async {
  var result = await funcThatReturnsFuture();
  print(result);  
  setState(() {
    someVal = result;
  })
}
Run Code Online (Sandbox Code Playgroud)

主要限制是你不能在没有a的情况下直接将值返回给调用者Future,因为没有办法从异步执行返回到同步执行.