Flutter:ListView.builder内部的FutureBuilder无限增长



我想从一个在线打开的数据接口中获取数据,然后使用ListView.builder在屏幕上显示它们。因此,我创建了一个FutureBuilder,它返回一个ListView.bbuilder。数据有一个确切的长度,但ListView似乎无限增长。FutureBuilder中是否存在导致此问题的无限循环或任何错误?

导致这个问题的代码部分(我认为(:

Widget build(BuildContext context) {
final key = utf8.encode(AppKey);
final hmac = hmacSha1(key, utf8.encode(SignDate));
final base64HmacString = base64Encode(hmac);
final Authorization = "hmac username="" + AppID + "", algorithm="hmac-sha1", headers="x-date", signature="" + base64HmacString + """;
getNumData();
for(int i = 0 ; i < Numdata.length ; i++){
if(Numdata[i]['stationName'] == DStation){
DStationNum = Numdata[i]['stationCode'];
break;
}
}
for(int i = 0 ; i < Numdata.length; i++){
if(Numdata[i]['stationName'] == AStation){
AStationNum = Numdata[i]['stationCode'];
break;
}
}
return Scaffold(
appBar: AppBar(
backgroundColor: Color.fromRGBO(191, 62, 255, 1),
title: Text('火車查詢'),
),
body: FutureBuilder(
future: getTableData(Authorization, xdate, DStationNum, AStationNum),
builder: (context, snap){
if(!snap.hasData){
return Container();
}
List<dynamic> datas = [];
datas = jsonDecode(snap.data.body);
count1++;
print('count1: ' + count1.toString());
for(int i = 0 ; i < datas.length ; i++){
count2++;
print('count2: ' + count2.toString());
Map<String, dynamic> DailyTrainInfo = datas[i]['DailyTrainInfo'];
Map<String, dynamic> OriginStopTime = datas[i]['OriginStopTime'];
Map<String, dynamic> DestinationStopTime = datas[i]['DestinationStopTime'];
CText.add(DailyTrainInfo["TrainTypeName"]["Zh_tw"]);
print('CText.length: ' + CText.length.toString());
DEPTime1Text.add(OriginStopTime["DepartureTime"]);
DEPTime2Text.add(DestinationStopTime["DepartureTime"]);
TrainText.add(DailyTrainInfo["TrainNo"]);
}
return ListView.builder(
shrinkWrap: true,
itemCount: CText.length,
itemBuilder: (context, index){
print('CText.length: ' + CText.length.toString());
count3++;
print('count3: ' + count3.toString());
return ListTile(title: Text(CText[index] + '      ' + DEPTime1Text[index] + '   =>   ' + DEPTime2Text[index]), subtitle: Text(TrainText[index]),);
},
);
}),
bottomNavigationBar: BottomNavigationBar(
onTap: onTabTapped,
currentIndex: _currentIndex, // this will be set when a new tab is tapped
items: [
new BottomNavigationBarItem(
icon: new Icon(Icons.school),
title: new Text('大學'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.directions_subway),
title: new Text('交通'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.person),
title: new Text('個人'),
)
],
),
);
}

getNumData((函数:

Future getNumData() async{
final String hostNum = 'http://ods.railway.gov.tw/tra-ods-web/ods/download/dataResource/0518b833e8964d53bfea3f7691aea0ee';
final response = await http.get(hostNum);
Numdata = jsonDecode(utf8.decode(response.bodyBytes));
}

默认情况下,ListView会展开以填充可用高度。若要使其收缩,请将shrinkWrap参数设置为true。这应该能解决问题。

最新更新