直接看代码,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;
});
});
}
}
你在build的时候调用了加载getList,加载完毕之后,调用了setState,等于又调用了build,这样就是个无限循环。getList要在initState里面调用,不能在build里面调动。