【Flutter -- 基础组件】Flutter 导航栏

Flutter 导航栏实现指南

1. TabBar

Flutter 中用于快速实现顶部导航栏的组件库。

  • TabBar

    Tab 页的 Title 控件,切换 Tab 页的入口,一般放到 AppBar 控件下使用,内部有**Title*属性。其子元素按水平横向排列布局,如果需要纵向排列,请使用 Column 或 ListView 控件包装一下。子元素为 Tab 类型的数组。

  • TabBarView

    Tab 页的内容容器,其内放置 Tab 页的主体内容。子元素可以是多个各种类型的控件。

  • TabController

    这是Tab页的控制器,用于定义Tab标签和内容页的坐标,还可配置标签页的切换动画效果等。

1.1 代码实现

dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Welcome to Flutter',
        home: Scaffold(
            body: Center(
              child: AppBarStatefulWidget(),
            )
        )
    );
  }
}

class AppBarStatefulWidget extends StatefulWidget {
  const AppBarStatefulWidget({Key? key}) : super(key: key);

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

class _AppBarStatefulWidget extends State<AppBarStatefulWidget> with SingleTickerProviderStateMixin {
  final List<Tab> _tabs = <Tab>[
    new Tab(text: '关注'),
    new Tab(text: '推荐'),
    new Tab(text: '视频'),
    new Tab(text: '游戏'),
    new Tab(text: '音乐'),
    new Tab(text: '体育'),
    new Tab(text: '生活'),
    new Tab(text: '图片'),
  ];

  var _tabController;

  @override
  void initState() {
    _tabController = TabController(vsync: this, length: _tabs.length);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: TabBarView(
        controller: _tabController,
        children: _tabs.map((Tab tab) {
          return new Center(child: Text(tab.text.toString()));
        }).toList(),
      ),
      appBar: AppBar(
        title: Text("TabBarView 的基本使用"),
        centerTitle: true,
        bottom: TabBar(
          isScrollable: true,
          labelColor: Colors.redAccent,
          indicatorColor: Colors.redAccent,
          labelStyle: new TextStyle(fontSize: 15.0),
          unselectedLabelColor: Colors.white,
          unselectedLabelStyle: new TextStyle(fontSize: 15.0),
          controller: _tabController,
          indicatorSize: TabBarIndicatorSize.label,
          tabs: _tabs,
        ),
      ),
    );
  }
}

1.2 效果图

小贴士:在开发iOS应用时,使用AppUploader可以方便地将你的Flutter应用打包上传到App Store,它提供了简洁的界面和完整的证书管理功能,大大简化了发布流程。

2. BottomNavigationBar

BottomNavigationBar是底部导航栏控件,显示在页面底部的设计控件,用于在视图间切换。底部导航栏可以包含多个标签、图标或者两者搭配的形式,提供了顶级视图之间的快速导航。

2.1 构建底部标签

dart 复制代码
//底部数据
final Map bottomMap ={
  "首页":Icon(Icons.home),
  "朋友圈":Icon(Icons.camera),
  "信息":Icon(Icons.message),
  "其他":Icon(Icons.devices_other),
};

2.2 创建导航栏

dart 复制代码
//用无状态控件显示
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.red),
      home: MyHomePageWidget(),
    );
  }
}

class MyHomePageWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState(){
     return new MyHomePage();
  }
}

class MyHomePage extends State<MyHomePageWidget> {
  final Map bottomMap ={
    "首页":Icon(Icons.home),
    "朋友圈":Icon(Icons.camera),
    "信息":Icon(Icons.message),
    "其他":Icon(Icons.devices_other),
  };

  int _index = 0;
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        items: (){
          var items = <BottomNavigationBarItem>[];
          bottomMap.forEach((k,v){
            items.add(BottomNavigationBarItem(
              title:Text(k),
              icon : v,
              backgroundColor:Colors.red,
            ));
          });
          return items;
        }(),
        currentIndex: _index,
        onTap:(position){
          setState(() {
            _index = position;
          });
        }
      ),
    );
  }
}

2.3 效果图

对于Flutter开发者来说,完成应用开发后,使用AppUploader这样的工具可以快速将应用发布到App Store。它支持自动打包、证书管理、一键上传等功能,特别适合独立开发者和小团队使用,能节省大量时间在应用发布环节。

相关推荐
qq_1249870753几秒前
基于微信小程序的宠物交易平台的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
禹曦a3 分钟前
Java实战:Spring Boot 构建电商订单管理系统RESTful API
java·开发语言·spring boot·后端·restful
superman超哥3 分钟前
精确大小迭代器(ExactSizeIterator):Rust性能优化的隐藏利器
开发语言·后端·rust·编程语言·rust性能优化·精确大小迭代器
guchen6614 分钟前
WPF拖拽功能问题分析与解决方案
后端
Smoothzjc25 分钟前
别再只把AI当聊天机器人了!揭秘大模型进化的终极形态,看完颠覆你的认知!
后端·langchain·ai编程
superman超哥36 分钟前
惰性求值(Lazy Evaluation)机制:Rust 中的优雅与高效
开发语言·后端·rust·编程语言·lazy evaluation·rust惰性求值
9号达人36 分钟前
AI最大的改变可能不是写代码而是搜索
java·人工智能·后端
VX:Fegn089542 分钟前
计算机毕业设计|基于springboot + vue智慧养老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
拔剑纵狂歌42 分钟前
helm-cli安装资源时序报错问题问题
后端·docker·云原生·容器·golang·kubernetes·腾讯云