Flutter:Future Builder获取多个数据

时间:2018-09-19 13:07:05

标签: dart flutter

我正在查询网站的新闻部分。 我正在使用Future Builder从网络获取数据。 我遇到的问题与试图在屏幕上显示的图像有关。 而且,当有很多新闻时,数据加载会花费很长时间,而且我不知道是否有解决方案来加快加载速度。

我正在通过json查询新闻文本。 此时,您将获得另一个JSON的URL,其中图像为缩略图格式。

我希望能解决此问题,感谢您的帮助。

enter image description here

News.dart-代码

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: searchBar.build(context),
      key: _scaffoldKey,
      body: new Container(
        color: Colors.grey[800],
        child: new RefreshIndicator(
            child: new ListView(
              children: <Widget>[
                new FutureBuilder<List<Post>>(
                  future: fetchPosts(URLWEB),
                  builder: (context, snapshot) {
                    if(snapshot.hasData) {
                      List<Post> posts = snapshot.data;
                      return new Column(
                        children: posts.map((post2) => new Column(
                          children: <Widget>[
                            new Card(
                                margin: new EdgeInsets.symmetric(vertical: 20.0, horizontal: 20.0),
                                color: Colors.white,
                                child: new GestureDetector(
                                  child: new Column(
                                    crossAxisAlignment: CrossAxisAlignment.stretch,
                                    children: <Widget>[
                                      new FutureBuilder(
                                        future: fetchPostsIMG(post2.imagen),
                                        builder: (context, AsyncSnapshot<PostImg> snapshot2){
                                          return new Container(
                                            height: 200.0,
                                            decoration: new BoxDecoration(
                                                image: new DecorationImage(
                                                    image: CachedNetworkImageProvider(snapshot2.data.imagen == null ? new AssetImage('images/logotipo.png') : snapshot2.data.imagen),
                                                    fit: BoxFit.fitWidth
                                                )
                                            ),
                                            width: MediaQuery.of(context).size.width,
                                          );
                                        },
                                      ),
                                      new ListTile(
                                        title: new Text(post2.titulo.replaceAll("&#8216;", "").replaceAll(
                                            "&#8217;", "").replaceAll("&#8211;", "")
                                            .replaceAll("&#8230;", "").replaceAll(
                                            "&#8221;", "")
                                            .replaceAll("&#8220;", ""),
                                          style: new TextStyle(
                                              color: Colors.black,
                                              fontSize: 18.0,
                                              fontWeight: FontWeight.bold),),
                                        subtitle: new HtmlView(data: post2.informacion),
                                        dense: true,
                                      )
                                    ],
                                  ),
                                  onTap: () {
                                    //Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context)=> new WebView(url: post2.urlweb, titulo: titulo)));
                                  },
                                )
                            )
                          ],
                        )).toList(),
                      );
                    }
                    else if(snapshot.hasError)
                    {
                      return new Container();
                    }
                    return new Center(
                      child: new Column(
                        children: <Widget>[
                          new Padding(padding: new EdgeInsets.all(50.0)),
                          new CircularProgressIndicator(),
                        ],
                      ),
                    );
                  },
                ),
              ],
            ),
            onRefresh: _autoRefresh
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:4)

这是因为您尝试访问空对象上的imagen。您可以像下面这样hasData进行检查

CachedNetworkImageProvider(snapshot2.hasData ? snapshot2.data.imagen : new AssetImage('images/logotipo.png')),