You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:21:01