Flutter嵌套列表数据下TabBarView子项构建报错如何解决
问题根因
你当前写了两层for循环生成TabBarView的children数组,外层遍历3个book,内层遍历每个book的contentList元素,相当于把5+1+3=8个GridView直接平铺塞进了children,自然和你需要的3个Tab子项数量不匹配,触发长度报错。
修正方案
你需要的是每个book对应1个GridView作为Tab的子项,不需要内层循环,直接在GridView内部绑定对应book的contentList数据源即可,修改后代码如下:
TabBarView( physics: const NeverScrollableScrollPhysics(), controller: _booksController, children: [ // 只保留一层遍历,每个book生成一个GridView for (int i = 0; i < _books.length; i++) GridView.builder( padding: EdgeInsets.zero, scrollDirection: Axis.vertical, shrinkWrap: true, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisSpacing: 0, mainAxisSpacing: 0, crossAxisCount: 3, childAspectRatio: 1 / 0.4, ), // 绑定当前book的contentList长度作为GridView的item数量 itemCount: _books[i].contentList.length, itemBuilder: (BuildContext context, index) { final title = _books[i].contentList[index].title; final page = _books[i].contentList[index].page; // 这里返回你的网格项Widget即可 return YourGridItem(title: title, page: page); } ), ] ),
可选优化
如果存在contentList为空的book,可以在GridView外层加判断,空数据时显示占位Widget:
for (int i = 0; i < _books.length; i++) _books[i].contentList.isEmpty ? const Center(child: Text('暂无内容')) : GridView.builder(/* 原有逻辑 */)
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

