首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振-在setState中等待FutureBuilder然后加载组件

颤振-在setState中等待FutureBuilder然后加载组件
EN

Stack Overflow用户
提问于 2019-11-26 15:26:41
回答 2查看 3K关注 0票数 0

我在尝试类似的事情。在“未来生成器”中加载服务,设置文本字段值,然后编写组件。

代码语言:javascript
运行
复制
 final data = FutureBuilder(
            future: DatameterService.getMapData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                setState(() {
                  calleController.text = snapshot.data.calle;
                  paisController.text = snapshot.data.pais;
                  provinciaController.text = snapshot.data.provincia;
                  poblacionController.text = snapshot.data.poblacion;
                  postalController.text = snapshot.data.postal;
                });
                return form;
              } else {
                return indicator;
              }

但回报

在构建过程中调用

setState()或markNeedsBuild()。

因此,问题是:如何使用TextField填充FutureBuilder输入值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-26 16:13:31

您不应该在构建中调用setState,原因很简单: setState导致构建,构建调用setState --您处于无限循环中。这就是为什么引擎明确告诉您不应该尝试这样做的原因。

实际上,您不应该在构建中执行任何业务逻辑。从您的代码来看,您似乎希望在页面出现时加载一些数据,并为您的TextField设置一些初始字段。我认为您不想在这里使用FutureBuilder,因为您有一个StatefulWidget。相反,您可以将未来移出构建,并在initState中调用它。

就像这样:

代码语言:javascript
运行
复制
class _MyState extends State<MyWidget> {
  Map<String, dynamic> _data;
  bool _loading;
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    // start fetching
    _loading = true;
    _data = {};
    _controller = TextEditingController();
    getData().then((data) {
      setState(() {
        _data = data;
        _loading = false;
        _controller.text = _data['text'];
      });
    });
  }

  Widget build(BuildContext context) {
    // handle loading vs. not loading
    if (_loading) return CircularProgressIndicator();
    return Container(
      // the rest of your code
    );
  }
}

您甚至不需要存储_data,但是它对于重置表单或其他东西可能很有用。

票数 6
EN

Stack Overflow用户

发布于 2020-08-08 13:26:08

基本上,您需要理解FutureBuilder以这种方式调用什么。FutureBuilder有一个子future:,您可以向其分配一个异步方法,该方法将.then附加到该方法。'.then‘将在异步进程完成后被调用。

说到答案,你可以这样打电话给setState。

代码语言:javascript
运行
复制
myFutureMethod.then((value) => {
      setState(() {
        value = true;
      })
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59054185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档