首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用CachedNetworkImage动态改变图像的ListView

使用CachedNetworkImage动态改变图像的ListView
EN

Stack Overflow用户
提问于 2019-04-01 00:08:27
回答 1查看 451关注 0票数 0

从本质上讲,我想做this,但不是更新单个图像,而是更新图像列表。我有一个基于图像URL的List<String>图像的ListView。如下所示:

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  double padding = 5.0;

  String one = 'https://SOME_URL_HERE.com';
  String two = 'https://SOME_URL_HERE.com';
  String three = 'https://SOME_URL_HERE.com';
  String four = 'https://SOME_URL_HERE.com';
  List urls;

  @override
  Widget build(BuildContext context) {
    urls = List();
    urls.add(one);
    urls.add(two);

    return new MaterialApp(
      debugShowCheckedModeBanner: false,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Image list test"),
        ),
        body: showBody(),
      ),
    );
  }

  Widget showBody() {
    return Padding(
      padding: EdgeInsets.only(top: 15.0, left: 10.0, right: 10.0),
      child: ListView(
        children: <Widget>[
          showItemImages(),
          RaisedButton(
            child: Text("Change image"),
            onPressed: () {
              setState(() {
                urls = List();
                urls.add(three);
                urls.add(four);
              });
            },
          ),
          Container(
            child: Text('urls length: ${urls.length}'),
          ),
        ],
      ),
    );
  }

  Widget showItemImages() {
    return Padding(
      padding: EdgeInsets.all(padding),
      child: Container(
          margin: EdgeInsets.symmetric(vertical: 20.0),
          height: 200,
          child: urls.length > 0 //item.images.length > 0
              ? getImagesListView(context)
              : Container(child: Text('No images yet'))),
    );
  }

  getImagesListView(BuildContext context) {
    return ListView.builder(
      shrinkWrap: true,
      scrollDirection: Axis.horizontal,
      itemCount: urls.length,
      itemBuilder: (BuildContext context, int index) {
        return new Container(
          width: 160.0,
          child: _sizedContainer(
            new CachedNetworkImage(
              key: new ValueKey<String>(urls[index]),
              imageUrl: urls[index],
              //placeholder: (context, url) => new CircularProgressIndicator(),
            ),
          ),
        );
      },
    );
  }

  Widget _sizedContainer(Widget child) {
    return new SizedBox(
      width: 300.0,
      height: 150.0,
      child: new Center(
        child: child,
      ),
    );
  }
}

当我按下按钮时,它应该清除列表并向其中添加两个新元素,但它不起作用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 00:22:53

下面3行代码:

代码语言:javascript
复制
urls = List(); 
urls.add(one); 
urls.add(two);

是否应该将而不是放入@override小部件构建方法中。将它们放在那里意味着您每次设置状态时都要重新初始化urls,您应该将这些行放入@override initState()方法中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55442814

复制
相关文章

相似问题

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