• 初学Flutter:实现底部导航切换


    效果展示

    flutter bottomNavBar

    主要实现代码

    入口文件:main.dart

    1. import 'package:flutter/material.dart';
    2. import 'package:flutter_demo/components/bottomNavBar.dart';
    3. import 'package:flutter_demo/views/cart.dart';
    4. import 'package:flutter_demo/views/cata.dart';
    5. import 'package:flutter_demo/views/person.dart';
    6. import 'package:flutter_demo/views/home.dart';
    7. main() {
    8. runApp(const MyApp());
    9. }
    10. class MyApp extends StatelessWidget {
    11. const MyApp({super.key});
    12. @override
    13. Widget build(BuildContext context) {
    14. return MaterialApp(
    15. // title: 'UzumakiHan',
    16. theme: ThemeData(
    17. // Define the default brightness and colors.
    18. brightness: Brightness.light,
    19. primaryColor: Colors.lightBlue[800],
    20. ),
    21. home: const MyHome());
    22. }
    23. }
    24. class MyHome extends StatefulWidget {
    25. const MyHome({super.key});
    26. @override
    27. // ignore: library_private_types_in_public_api
    28. _MyHomeState createState() => _MyHomeState();
    29. }
    30. class _MyHomeState extends State<MyHome> {
    31. List tabBodies = [
    32. const IndexHome(),
    33. const Cata(),
    34. const Cart(),
    35. const Person()
    36. ];
    37. int currentIndex = 0;
    38. List bottomTabs = [
    39. const BottomNavigationBarItem(icon: Icon(Icons.home), label: '首页'),
    40. const BottomNavigationBarItem(icon: Icon(Icons.search), label: '分类'),
    41. const BottomNavigationBarItem(
    42. icon: Icon(Icons.shopping_cart), label: '购物车'),
    43. const BottomNavigationBarItem(
    44. icon: Icon(Icons.manage_accounts), label: '个人中心'),
    45. ];
    46. List<String> pageTitle = ['首页', '分类', '购物车', '个人中心'];
    47. @override
    48. Widget build(BuildContext context) {
    49. return Scaffold(
    50. appBar: AppBar(
    51. title: Text(pageTitle[currentIndex]),
    52. centerTitle: true,
    53. ),
    54. body: tabBodies[currentIndex],
    55. bottomNavigationBar: BottomNavBar(
    56. bottomTabs: bottomTabs,
    57. currentIndex: currentIndex,
    58. changeCurrentIndex: (index) {
    59. setState(() {
    60. currentIndex = index;
    61. });
    62. },
    63. ));
    64. }
    65. }

    底部导航组件 bottomNavBar.dart

    1. // ignore_for_file: library_private_types_in_public_api
    2. import 'package:flutter/material.dart';
    3. class BottomNavBar extends StatefulWidget {
    4. const BottomNavBar(
    5. {super.key,
    6. required this.bottomTabs,
    7. required this.currentIndex,
    8. required this.changeCurrentIndex});
    9. final List bottomTabs;
    10. final int currentIndex;
    11. final Function changeCurrentIndex;
    12. @override
    13. _BootomNavBarState createState() => _BootomNavBarState();
    14. }
    15. class _BootomNavBarState extends State<BottomNavBar> {
    16. int currentIndex = 0;
    17. @override
    18. Widget build(BuildContext context) {
    19. return BottomNavigationBar(
    20. type: BottomNavigationBarType.fixed,
    21. currentIndex: widget.currentIndex,
    22. items: widget.bottomTabs,
    23. onTap: (index) {
    24. widget.changeCurrentIndex(index);
    25. });
    26. }
    27. }

    下面是四个导航对应的页面

    首页:home.dart

    1. // ignore_for_file: library_private_types_in_public_api
    2. import 'package:flutter/material.dart';
    3. class IndexHome extends StatefulWidget {
    4. const IndexHome({super.key});
    5. @override
    6. _IndexHomeState createState() => _IndexHomeState();
    7. }
    8. class _IndexHomeState extends State<IndexHome> {
    9. @override
    10. Widget build(BuildContext context) {
    11. // TODO: implement build
    12. return const Center(
    13. child: Text(
    14. '首页',
    15. style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
    16. ));
    17. }
    18. }

    分类:cata.dart

    1. // ignore_for_file: library_private_types_in_public_api
    2. import 'package:flutter/material.dart';
    3. class Cata extends StatefulWidget {
    4. const Cata({super.key});
    5. @override
    6. _CataState createState() => _CataState();
    7. }
    8. class _CataState extends State<Cata> {
    9. @override
    10. Widget build(BuildContext context) {
    11. return const Center(
    12. child: Text("分类",
    13. style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold)),
    14. );
    15. }
    16. }

    购物车:cart.dart

    1. // ignore_for_file: library_private_types_in_public_api
    2. import 'package:flutter/material.dart';
    3. class Cart extends StatefulWidget {
    4. const Cart({super.key});
    5. @override
    6. _CartState createState() => _CartState();
    7. }
    8. class _CartState extends State<Cart> {
    9. @override
    10. Widget build(BuildContext context) {
    11. return const Center(
    12. child: Text("购物车",
    13. style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold)),
    14. );
    15. }
    16. }

    个人中心:person.dart

    1. // ignore_for_file: library_private_types_in_public_api
    2. import 'package:flutter/material.dart';
    3. class IndexHome extends StatefulWidget {
    4. const IndexHome({super.key});
    5. @override
    6. _IndexHomeState createState() => _IndexHomeState();
    7. }
    8. class _IndexHomeState extends State<IndexHome> {
    9. @override
    10. Widget build(BuildContext context) {
    11. // TODO: implement build
    12. return const Center(
    13. child: Text(
    14. '首页',
    15. style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
    16. ));
    17. }
    18. }

  • 相关阅读:
    《数据结构、算法与应用C++语言描述》-栈的应用-列车车厢重排问题
    分布式管理
    人工智能轨道交通行业周刊-第14期(2022.9.12-9.18)
    389. 找不同(简单不一定知道)
    Java 线程池之ThreadPoolExecutor学习总结
    数学基础(四)极大似然估计、误差的高斯分布与最小二乘估计的等价性
    vrrp协议与keepalived浅析
    How to install a specific version of a package in R
    9.5~10.5 GHz频段室内离体信道的测量与建模
    比较分析线程池中execute与submit方法的差异
  • 原文地址:https://blog.csdn.net/Hhjian524/article/details/134215373