flutter listview 改变状态的时候一直无限添加

直接看代码,setstate的时候会一直无限的调用listview.builder方法.好像一直无限循环

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:video/AppConfig.dart';

class Home extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return HomeState();
  }
}

class HomeState extends State<Home> {
  double _width = 0.0;

  Widget build(BuildContext context) {
    this._width = MediaQuery.of(context).size.width;
    print(this._width);
    return new Scaffold(
      appBar: new AppBar(
          title: new Text("这个是首页的")
      ),
      body: new ListDislay(),
    );
  }


}

//动态列表
class ListDislay extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return ListDisplayState();
  }
}

class ListDisplayState extends State<ListDislay>{
  List _card = new List();
  double _width = 0.0;
  Widget build(BuildContext context){
    this._width = MediaQuery.of(context).size.width;
    this.getList();
    return new Scaffold(
      body:new ListView.builder(
        itemCount: _card.length,
        itemBuilder: (context,i){
          //          return _card[i];
          print("长度:"+this._card.length.toString());
          return new GestureDetector(
            child: _card[i],
            onTap: (){
              print("点击索引"+i.toString());
            },
          );
        },
      ) ,
    );
  }

  getList() async{
    var url = AppConfig.base + '/api/new_list';
    //向指定URL发送GET请求
    http.get(url).then((response) {
      var data = json.decode(response.body);
      var _TempCard = [];
      data.forEach((v){
        print(v);
        _TempCard.add(new Card(
          child: new Flex(
            direction: Axis.vertical,
            children: <Widget>[
              new Image.network(
                AppConfig.base + '/file/'+v["Id"]+'/1.jpg',
                fit: BoxFit.fill,
                width: this._width,
                height: 200.0,
//              width: new Width,
              ),
              new Text(v["Originalname"])
            ],
          ),
        ));
      });
      //下面这不就造成了无限添加.要怎么解决?
      setState(() {
        this._card = _TempCard;
      });
    });

  }
}
阅读 5.3k
1 个回答

你在build的时候调用了加载getList,加载完毕之后,调用了setState,等于又调用了build,这样就是个无限循环。getList要在initState里面调用,不能在build里面调动。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题