前言
在 Android、iOS 以及 HarmonyOS 等平台上,底部标签栏是用户与应用核心功能交互的主要入口。它提供了一种清晰、直观的导航方式,让用户可以轻松地在不同功能模块之间切换。
本文将展示如何从一个只有独立页面的初始项目开始,逐步重构代码,最终实现一个包含'首页'和'我的'两个核心模块的 TabBar 导航结构。
目标
目标是将一个通过路由进行离散页面跳转的应用,改造成一个拥有固定底部导航栏的现代化应用。
改造前:
- 应用有一个初始页面。
- 所有页面(如登录、个人中心)通过
Navigator.pushNamed等方法进行跳转,彼此独立。 - 没有一个统一的主导航结构。
改造后:
- 应用底部有一个常驻的 TabBar,包含'首页'和'我的'两个标签。
- 点击不同的标签,可以切换中间的主体内容区域,而 TabBar 本身保持不变。
- 页面切换流畅,且状态能够被妥善管理。
第一步:分析初始代码
main.dart (初始状态)
import 'package:flutter/material.dart';
import 'pages/home.dart';
import 'pages/login.dart';
import 'pages/profile.dart';
import 'pages/couplet.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(/* ... Theme data ... */),
initialRoute: '/',
routes: {
'/': (context) => const HomePage(),
'/login': (context) => const LoginPage(),
'/profile': (context) => const ProfilePage(),
'/couplet': (context) => const CoupletPage(),
},
);
}
}
分析:
这段代码使用 MaterialApp 的 routes 属性定义了一组命名路由。应用的根路由 '/' 直接指向 HomePage。这种方式非常适合那些需要从一个页面跳转到另一个全屏页面的场景(例如,从首页跳转到登录页)。
第二步:核心概念 - Scaffold 和 StatefulWidget
要实现 TabBar,需要引入两个 Flutter 的核心概念:
ScaffoldWidget: 可以把它想象成一个'脚手架',它为构建符合 Material Design 规范的页面提供了一整套标准结构。它包含了appBar(顶部应用栏)、body(主内容区)、floatingActionButton(浮动操作按钮)以及这次的主角——bottomNavigationBar(底部导航栏)等预设插槽。StatefulWidget(有状态组件): TabBar 需要'记住'当前哪个标签页被选中。当用户点击一个新标签时,界面需要更新以显示对应的内容。这种需要根据用户交互或内部数据变化而改变自身外观的 Widget,就是有状态组件。将使用它来保存和更新当前选中的 Tab 索引。
第三步:构建 TabBar 的容器 - tabs.dart
最佳实践是将管理 TabBar 导航的逻辑封装在一个独立的 Widget 中。这有助于保持代码的整洁和可维护性。
在 lib/pages/ 目录下创建一个新文件 ,并添加以下代码:


