dart - Flutter - 是否可以在不使用 FutureBuilder 的情况下从 Futu

我正在从 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/

相关文章:

android - 将自定义 boxshadow 添加到 Flutter 卡

android - 什么时候在 Flutter 中使用 setState?

flutter - 如何像在 Hamilton Flutter 应用程序中一样在 Flutter 中

loops - 从 List.map() 获取迭代索引

flutter - 将容器缩小到较小的 child 而不是扩大到填充 parent

flutter - 如何拉伸(stretch)图标以填充父级?

firebase - 如何使用 buildArguments 或其他任何东西在 Flutter/Fi

flutter - 如何在 Flutter 中将一个小部件放在另一个小部件之上?

dart - 长文本 flutter 中的换行符

dart - flutter 测试 : Waiting for a certain duration