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

引入TDEE数据后Flutter应用底部导航栏不显示问题

问题分析与解决方案

问题1:CustomBottomNavBar构造函数参数写法错误

你的CustomBottomNavBar构造函数中,参数使用widget.onTabSelected和widget.selectedIndex是语法错误,正确写法应该用this.来绑定类成员变量,这种错误会导致组件无法正常构建,直接造成底部导航栏不显示。

问题2:HomeScreen中tdee未初始化就使用

late double tdee声明后未初始化就传给HomeContent,同时_screens列表在State初始化阶段就创建,此时tdee还未赋值,会触发运行时异常,导致整个页面渲染失败,导航栏自然无法显示。


修正后的代码

1. CustomBottomNavBar.dart 修正

class CustomBottomNavBar extends StatefulWidget {
  final int selectedIndex; // 跟踪当前选中的索引
  final Function(int) onTabSelected; // 通知父组件的回调

  const CustomBottomNavBar({
    Key? key,
    required this.onTabSelected,
    required this.selectedIndex,
  }) : super(key: key);

  @override
  _CustomBottomNavBarState createState() => _CustomBottomNavBarState();
}

class _CustomBottomNavBarState extends State<CustomBottomNavBar> {
  @override
  Widget build(BuildContext context) {
    return BottomNavigationBar(
      backgroundColor: const Color.fromRGBO(57, 57, 57, 1), // 背景色
      selectedItemColor: Colors.white, // 选中图标颜色
      unselectedItemColor: Colors.grey, // 未选中图标颜色
      currentIndex: widget.selectedIndex, // 跟踪选中索引
      onTap: widget.onTabSelected, // 点击tab时的回调
      type: BottomNavigationBarType.fixed, // 保持标签可见
      items: const [
        BottomNavigationBarItem(
          icon: Icon(Icons.home),
          label: "首页",
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.sports),
          label: "分类",
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.bar_chart),
          label: "报告",
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.person),
          label: "我的",
        ),
      ],
    );
  }
}

2. HomeScreen.dart 修正

import 'package:flutter/material.dart';
import 'package:getfit/screens/ProfileScreen.dart';
import 'package:getfit/screens/ReportScreen.dart';
import 'package:getfit/widgets/CustomBottomNavBar.dart';
import 'CategoryScreen.dart';
import 'package:pedometer/pedometer.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
      theme: ThemeData(fontFamily: 'AgencyFB'), // 全局字体样式
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _selectedIndex = 0; // 跟踪底部tab选中索引
  late double tdee; // 每日总能量消耗变量
  late List<Widget> _screens;

  // 获取存储的TDEE数据
  Future<double> _storedTDEE() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getDouble('tdee') ?? 0;
  }

  // 更新选中索引的状态
  void _onTabSelected(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  void initState() {
    super.initState();
    // 初始化tdee并更新页面列表
    _initTDEE();
  }

  Future<void> _initTDEE() async {
    tdee = await _storedTDEE();
    setState(() {
      _screens = [
        HomeContent(tdee: tdee),
        const CategoryScreen(),
        const ReportScreen(),
        const ProfileScreen(),
      ];
    });
  }

  @override
  Widget build(BuildContext context) {
    // 数据未初始化时显示加载状态
    if (_screens.isEmpty) {
      return const Scaffold(
        body: Center(child: CircularProgressIndicator()),
      );
    }

    return Scaffold(
      bottomNavigationBar: CustomBottomNavBar(
        selectedIndex: _selectedIndex,
        onTabSelected: _onTabSelected,
      ),
      body: IndexedStack(
        index: _selectedIndex,
        children: _screens,
      ), // 显示选中的页面
    );
  }
}

内容的提问来源于stack exchange,提问作者Rinchen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:53:17