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

Flutter开发中如何实现底部导航栏不在所有页面显示

解决方案

你只需要新增一个控制底部导航栏显隐的可观察变量,再根据当前路由状态判断显隐即可,修改代码如下:

步骤1:修改home_controller.dart

新增hideBottomNav可观察变量,在生成路由时根据路由名称更新该变量状态:

import 'package:fauna/app/modules/invite_code/invite_code_binding.dart';
import 'package:fauna/app/modules/invite_code/invite_code_view.dart';
import 'package:fauna/app/modules/pet_details/pet_details_binding.dart';
import 'package:fauna/app/modules/pet_details/pet_details_view.dart';
import 'package:fauna/app/modules/vet_profile/vet_profile_binding.dart';
import 'package:fauna/app/modules/vet_profile/vet_profile_view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class HomeController extends GetxController {
  late BuildContext context;

  static HomeController get to => Get.find();
  var currentIndex = 0.obs;
  final pages = <String>['/pet-details', '/vet-profile'];
  var count = 0.obs;
  // 新增:控制底部导航显隐的可观察变量
  var hideBottomNav = false.obs;

  void changePage(int index) {
    currentIndex.value = index;
    Get.toNamed(pages[index], id: 1);
  }

  Route? onGenerateRoute(RouteSettings settings) {
    if (settings.name == '/invite-code') {
      // 邀请码页隐藏底部导航
      hideBottomNav.value = true;
      return GetPageRoute(
        settings: settings,
        page: () => InviteCodeView(),
        binding: InviteCodeBinding(),
      );
    }

    if (settings.name == '/pet-details') {
      // 业务页显示底部导航
      hideBottomNav.value = false;
      return GetPageRoute(
        settings: settings,
        page: () => PetDetailsView(),
        binding: PetDetailsBinding(),
      );
    }

    if (settings.name == '/vet-profile') {
      // 业务页显示底部导航
      hideBottomNav.value = false;
      return GetPageRoute(
        settings: settings,
        page: () => VetProfileView(),
        binding: VetProfileBinding(),
      );
    }
    return null;
  }
}

步骤2:修改home_view.dart

根据hideBottomNav的状态判断是否渲染底部导航栏:

import 'package:fauna/app/styles/colors.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';

import 'home_view_model.dart';

class HomeView extends GetView<HomeController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Navigator(
        key: Get.nestedKey(1),
        initialRoute: '/invite-code',
        onGenerateRoute: controller.onGenerateRoute,
      ),
      // 修改:根据状态判断是否显示底部导航
      bottomNavigationBar: Obx(() => controller.hideBottomNav.value 
          ? const SizedBox.shrink() 
          : BottomNavigationBar(
            items: const <BottomNavigationBarItem>[
              BottomNavigationBarItem(
                icon: Icon(
                  FontAwesomeIcons.baby,
                  color: vaccineValid,
                  size: 15,
                ),
                label: 'Pet details',
              ),
              BottomNavigationBarItem(
                icon: Icon(
                  FontAwesomeIcons.airbnb,
                  color: vaccineValid,
                  size: 15,
                ),
                label: 'Vet profile',
              ),
            ],
            currentIndex: controller.currentIndex.value,
            selectedItemColor: Colors.green,
            onTap: controller.changePage,
          )),
    );
  }
}

注:新版Flutter中BottomNavigationBarItem的title参数已废弃,推荐替换为label参数,上述代码已同步修正。
如果你的业务逻辑允许用户从业务页返回邀请码页,需要额外在路由POP的生命周期回调里同步更新hideBottomNav的状态,常规业务中邀请码验证后不允许回退的场景下,上述代码即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:18:03