Flutter中FutureBuilder循环异常仅返回首个匹配Card、i++未执行问题
问题根因
你在for循环内部匹配到符合条件的项后直接执行了return操作,该操作会直接终止整个builder函数的执行,循环自然不会继续执行后续的i++逻辑,因此只能返回第一个匹配的Card组件。
修复方案
先遍历所有数据收集全部符合条件的Card组件,再将组件列表放在可滚动容器中统一返回,修改后的参考代码如下:
return FutureBuilder<BerichtList>( future: futureBerichte, builder: (context, snapshot) { if (snapshot.hasData) { // 先收集所有符合条件的Card List<Widget> matchCards = []; for (var i = 0; i < snapshot.data.berichte.length; i++) { if (snapshot.data.berichte[i].team == team) { print(i); matchCards.add( Container( width: double.infinity, margin: EdgeInsets.all(15.0), child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0)), elevation: 5, color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, // 让Column自适应内容高度 children: <Widget>[ Container( margin: EdgeInsets.symmetric(vertical: 15), child: Text( DateFormat("dd.MM.yyyy HH:mm").format( DateTime.parse( snapshot.data.berichte[i].spielDatum)), style: TextStyles.body, ), ), Container( child: Text( snapshot.data.berichte[i].spiele, style: TextStyles.body, ), ), Container( margin: EdgeInsets.only(bottom: 15), child: Text( snapshot.data.berichte[i].ergebnis, style: TextStyles.body, ), ), Container( margin: EdgeInsets.only(bottom: 15), child: Text( snapshot.data.berichte[i].ueberschrift, style: TextStyles.headline4, ), ), Container( margin: EdgeInsets.only(bottom: 30), child: Text( snapshot.data.berichte[i].bericht, style: TextStyles.body, ), ), ], ), ), ), ); } } // 所有符合条件的卡片收集完成后统一返回 if(matchCards.isNotEmpty){ return ListView( children: matchCards, ); }else{ return Container(); } } else { return Center(child: AppProgressIndicator()); } } );
如果你不需要滚动效果,只需要把所有卡片放在同一页展示,可以将返回的ListView替换为SingleChildScrollView(child: Column(children: matchCards))即可。
内容的提问来源于stack exchange,提问作者mame
相关产品推荐
相关产品推荐

