Flutter开发遇The named parameter 'body' isn't defined错误求助
错误原因排查
核心报错原因
你出现该报错的根本原因是参数归属错误:
body是Scaffold组件的专属命名参数,而你将body: TabBarView(...)直接写在了DefaultTabController的构造参数中,DefaultTabController本身没有body参数,所以触发了参数未定义的报错。
其他嵌套逻辑错误
你的代码还存在组件嵌套结构错误:
DefaultTabController的子树需要同时包含TabBar和TabBarView才能正常工作,你目前只把AppBar(内含TabBar)作为DefaultTabController的child,TabBarView不在同一个控制器的子树范围内,就算解决参数错误也无法正常切换Tab。- 你设置了
DefaultTabController的length: 6,但目前TabBar中只有1个Tab、TabBarView只有1个页面,三者数量不匹配,后续运行时也会触发报错。 - 你将整套Tab组件放在
ListView.builder的item中,相当于每个列表项都会渲染一套独立的Tab导航,如果你没有特殊业务需求,这个逻辑也是不合理的。
修正后的代码示例
以下是调整结构后的可运行核心代码,你可以根据自己的业务需求调整:
Widget build(context) { return Scaffold( body: Container( padding: const EdgeInsets.all(10.0), child: FutureBuilder<Categories>( future: _futureCategory, builder: (BuildContext context, AsyncSnapshot<Categories> snapshot) { if (snapshot.hasData) { final category = snapshot.data?.data; // 注意:如果不需要每个列表项都带Tab,要把DefaultTabController移到ListView外面 return ListView.builder( itemCount: category!.length, itemBuilder: (BuildContext context, id) { return DefaultTabController( length: 1, // 要和Tab、TabBarView的数量保持一致 // 正确结构:DefaultTabController的child是Scaffold,再分别放appBar和body child: Scaffold( appBar: AppBar( centerTitle: true, leading: const Icon(Icons.person_outline), bottom: const PreferredSize( child: TabBar( isScrollable: true, tabs: [ Tab(child: Text('Tab')), ], ), preferredSize: Size.fromHeight(30.0) ), actions: const <Widget>[ Padding( padding: EdgeInsets.only(right: 16.0), child: Icon(Icons.add_alert), ) ], ), // body属于Scaffold的参数,放在这里就不会报错了 body: TabBarView( children: const <Widget>[ Center(child: Text('Tab 1')), ], ), ), ); } ); } // 记得补全FutureBuilder的其他状态返回,比如加载中、出错的情况 return const Center(child: CircularProgressIndicator()); }, ), ), ); }
额外注意事项
- 如果你整套页面只需要一套Tab导航,就把
DefaultTabController移到ListView.builder的外层,避免每个列表项重复渲染Tab组件。 - 补全
FutureBuilder的加载、错误状态的返回逻辑,避免快照无数据时的空报错。
内容的提问来源于stack exchange,提问作者gegentierversuche
相关产品推荐
相关产品推荐

