【问题标题】:Dart / Flutter: building widget from data obtained using async methodDart / Flutter:从使用异步方法获得的数据构建小部件
【发布时间】:2018-09-08 02:34:09
【问题描述】:

我想在构建小部件之前使用由从异步方法获取数据的小部件填充的 LietView.build。这是我从网站收集数据的函数:

fetchBasicData(String URL) async {
  final response = await http.get(URL);
  var document = parse(response.body);

  var result = new List<dom.Node>();
  result = document.getElementsByClassName('datas-nev');
  var dogName = result[0].nodes[1].toString();
  result = document.getElementsByClassName('datas-tipus');
  var dogBreed = result[0].nodes[1].toString();
  result = document.getElementsByClassName('datas-nem');
  var dogGender = result[0].nodes[1].toString();
  result = document.getElementsByClassName('datas-szin');
  var dogColor = result[0].nodes[1].toString();
  result = document.getElementsByClassName('datas-kor');
  var dogAge = result[0].nodes[1].toString();

  result = document.getElementsByClassName('pirobox_gall');
  String imageLink;
  imageLink = urlPrefix + result[0].nodes[0].attributes.values.first;

  return new Dog.basic(
      URL,
      dogName,
      dogBreed,
      dogGender,
      dogColor,
      dogAge,
      imageLink);
}

该函数已执行并收集数据,但小部件构建失败并显示type '_Future' is not a subtype of type 'Widget' of 'child' where

这是构建小部件的函数:

buildBasicWidget(String URL) async {
    Dog myDog = await fetchBasicData(URL);
    return new SizedBox(
      width: 500.0,
      height: 400.0,
      child: new Card(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            //Header image row
            new Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                new Expanded(
                    child: new FutureBuilder(
                        future: fetchPortrait(myDog.imageLink),
                        builder: (context, snapshot) {
                          if (snapshot.hasData) {
                            return new Image.network(
                              snapshot.data,
                              fit: BoxFit.scaleDown,
                            );
                          } else {
                            if (snapshot.hasError) {
                              return new Text('Hiba');
                            }
                          }
                          return new Center(
                            child: new CircularProgressIndicator(),
                          );
                        }))
              ],
            ), //Header image row
            new Row(
              children: <Widget>[
                new Expanded(
                    child: new Text(
                  dogName,
                  style: new TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 18.0,
                      color: Colors.black),
                ))
              ],
            ),
            new Row(
              children: <Widget>[
                new Expanded(
                    child: new Text(myDog.dogColor +
                        'színű, ' +
                        myDog.dogBreed +
                        ' ' +
                        myDog.dogGender))
              ],
            ),
            new Row(
              children: <Widget>[
                new Expanded(child: new Text('Kora: kb. ' + myDog.dogAge))
              ],
            )
          ],
        ),
      ),
    );
  }

我也尝试将此函数设为异步,并使其等待fetchBasicDetails() 完成,以便数据在使用时存在。

我什至尝试过使用dynamic fetchBasicData(String URL) async {...},但这也无济于事。 使用Future&lt;Dog&gt; 而不是dynamic 也会导致错误。

如何让buildBasicWidget 使用fetchBasicData 结果?还是我应该将fetchBasicData 中的小部件构建作为一种简单的解决方法?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    您需要使用FutureBuilder 并在future 参数中添加您的async 函数,否则在获取数据之前会调用build 方法。

    或者在initState 中执行您的异步请求。

    【讨论】:

    • 您不应在 future 参数中调用异步函数,因为它将在每次重建时重新启动(例如,每次重建时触发请求)。在initStatedidUpdateConfigdidChangeDependencies 期间获取未来并将其作为future 参数传递到您的build 方法中。 api.flutter.dev/flutter/widgets/FutureBuilder-class.html
    猜你喜欢
    • 2020-11-04
    • 2020-08-01
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2020-12-30
    • 2019-10-11
    相关资源
    最近更新 更多