Flutter新手求助:如何在TabBarView中添加多组Widget数组?
问题解决:TabBarView 参数错误及多Tab内容配置
错误原因
TabBarView 的 children 属性仅接受单个Liststack、info、addStuff三个独立列表,属于传递了过多位置参数,导致报错。此外,info和addStuff列表的初始化存在语法错误(元素后多了分号)。
修复步骤及代码
1. 修正列表语法错误
去掉info和addStuff列表中Widget后的分号:
final List<Widget> info = <Widget>[ _infoScreen() // 移除多余分号 ]; final List<Widget> addStuff = <Widget>[ _someAdditionalStuff() // 移除多余分号 ];
2. 正确配置TabBarView的children
将三个Tab对应的内容包装成一个List,每个Tab的内容需是单个Widget:
- 第一个Tab:用
Stack包裹stack列表(因为stack里包含了正常内容和加载遮罩,需要叠加显示) - 第二个Tab:用
ListView包裹info列表,直接展示其中的Widget - 第三个Tab:用
ListView包裹addStuff列表,直接展示其中的Widget
修改后的TabBarView代码:
body: TabBarView( children: [ // Tab1:叠加显示stack中的所有Widget Stack(children: stack), // Tab2:显示info列表的内容 ListView(children: info), // Tab3:显示addStuff列表的内容 ListView(children: addStuff), ], ),
完整修正后的代码
@override Widget build(BuildContext context) { final List<Widget> stack = <Widget>[]; final List<Widget> info = <Widget>[ _infoScreen() ]; final List<Widget> addStuff = <Widget>[ _someAdditionalStuff() ]; if (_queryProductError == null) { stack.add( ListView( children: <Widget>[ _buildConnectionCheckTile(), _buildProductList(), _adsTitle(), _adsButton(), _buildRestoreButton(), ], ), ); } else { stack.add(Center( child: Text(_queryProductError!), )); } if (_purchasePending) { stack.add( Stack( children: const <Widget>[ Opacity( opacity: 0.3, child: ModalBarrier(dismissible: false, color: Colors.grey), ), Center( child: CircularProgressIndicator(), ), ], ), ); } return MaterialApp( home: DefaultTabController( length: 3, child: Scaffold( appBar: AppBar( bottom: const TabBar( tabs: [ Tab(icon: Icon(Icons.shopping_basket_outlined), text: 'Донације'), Tab(icon: Icon(Icons.info_outline), text: 'Инфо'), Tab(icon: Icon(Icons.directions_bike)), ], ), centerTitle: true, title: const Text('Донације'), leading: IconButton( onPressed: () { main(); }, icon: const Icon(Icons.keyboard_return_sharp), ), ), body: TabBarView( children: [ Stack(children: stack), ListView(children: info), ListView(children: addStuff), ], ), ), ), ); }
额外说明
- 每个Tab的内容必须是单个Widget,所以如果你的列表包含多个Widget,需要用
ListView、Column或Stack等容器包裹。 DefaultTabController的length必须和TabBar的tabs数量、TabBarView的children数量一致(这里都是3,符合要求)。
内容的提问来源于stack exchange,提问作者Terrence Skill
相关产品推荐
相关产品推荐

