Flutter仿写微信导航栏快速实现页面导航

简介: Flutter仿写微信导航栏快速实现页面导航

前言

前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。

要实现类似微信底部的导航栏可以使用TabBar或者BottomNavigationBar来实现。下面分别介绍。


使用TabBar实现

TabBar介绍

在Flutter中,TabBar是一个用于创建选项卡式导航的常用组件。它通常与TabBarView一起使用,用于在不同的选项卡之间切换内容。


TabBar的重要属性

下面是TabBar的一些重要属性和功能:


tabs: tabs属性是一个必需的属性,用于指定选项卡的列表。您可以使用Tab小部件创建每个选项卡,并将它们放入tabs列表中。


controller: controller属性用于指定TabController,它负责管理选项卡和视图之间的联动。您可以通过创建一个TabController实例,并将其作为controller属性的值来实现联动。


isScrollable: isScrollable属性用于控制选项卡是否可滚动。当选项卡超出屏幕宽度时,如果设置为true,则可以通过水平滚动查看所有选项卡。


indicatorColor: indicatorColor属性用于设置选项卡下方的指示器的颜色。指示器是一个表示当前选中选项卡的横条。


labelColor 和 unselectedLabelColor: labelColor属性用于设置选中选项卡标签的颜色,而unselectedLabelColor属性用于设置未选中选项卡标签的颜色。


labelStyle 和 unselectedLabelStyle: labelStyle属性用于设置选中选项卡标签的文本样式,而unselectedLabelStyle属性用于设置未选中选项卡标签的文本样式。


onTap: onTap属性是一个回调函数,当用户点击选项卡时会触发该函数。您可以在该回调函数中执行特定的操作,例如更新视图或处理其他逻辑。


说明

一般通过使用TabBar和TabBarView的组合,您可以轻松创建具有选项卡切换功能的界面。TabBar提供了可定制的选项卡导航栏,而TabBarView用于展示与选项卡对应的内容。这使得在Flutter应用程序中实现选项卡式导航变得简单而灵活。


TabBarView介绍

TabBarView是一个用于显示与TabBar选项卡相对应的内容的组件。它与TabBar一起使用,以实现选项卡切换时内容的同步更新。


TabBarView的重要属性

下面是TabBarView的一些重要属性和功能:


children: children属性是一个必需的属性,用于指定与每个选项卡对应的子组件列表。您可以将不同的小部件放入children列表中,以显示不同的内容。


controller: controller属性用于指定TabController,它负责管理选项卡和视图之间的联动。确保将TabController实例作为TabBarView和TabBar的controller属性值保持一致。


physics: physics属性用于指定滚动行为。默认情况下,TabBarView的滚动行为与父级Scrollable组件一致。您可以根据需要设置不同的滚动行为,如NeverScrollableScrollPhysics禁用滚动或BouncingScrollPhysics添加弹性效果。


dragStartBehavior: dragStartBehavior属性控制滚动开始行为。默认情况下,它会根据环境决定是跟随垂直方向还是水平方向进行滚动。您可以通过设置为DragStartBehavior.start或DragStartBehavior.down来强制启动垂直滚动。


physics和dragStartBehavior属性的应用示例:

Copy code
TabBarView(
  controller: _tabController,
  physics: NeverScrollableScrollPhysics(), // 禁用滚动
  dragStartBehavior: DragStartBehavior.down, // 垂直滚动
  children: [
    // 子组件列表
    ...
  ],
)

onPageChanged: onPageChanged属性是一个回调函数,当用户滑动或切换选项卡时,将触发该函数。您可以在此回调函数中执行任何与选项卡切换相关的操作。

TabBar总结

通过将TabBarView与TabBar和TabController结合使用,您可以实现选项卡之间内容的同步切换。当用户切换选项卡时,TabController将相应地更新TabBarView中显示的内容,使用户能够轻松浏览不同的内容。TabBarView为创建选项卡式导航提供了便捷的方式,并且可以根据实际需求进行进一步的定制和样式设置。


TabBar实现底部导航的例子

源码下载


 import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyTabPage(),
    );
  }
}
class MyTabPage extends StatefulWidget {
  @override
  _MyTabPageState createState() => _MyTabPageState();
}
class _MyTabPageState extends State<MyTabPage> with SingleTickerProviderStateMixin {
  late TabController _tabController;
  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this); // 3是选项卡数量
  }
  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('微信'),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          // 第一个选项卡的内容
          Container(
            child: Center(
              child: Text('聊天'),
            ),
          ),
          // 第二个选项卡的内容
          Container(
            child: Center(
              child: Text('群组'),
            ),
          ),
          // 第三个选项卡的内容
          Container(
            child: Center(
              child: Text('个人'),
            ),
          ),
        ],
      ),
      bottomNavigationBar: TabBar(
        controller: _tabController,
        tabs: [
          Tab(icon: Icon(Icons.chat), text: '聊天'),
          Tab(icon: Icon(Icons.group), text: '群组'),
          Tab(icon: Icon(Icons.person), text: '个人'),
        ],
        indicatorColor: Colors.blue, // 选中状态下的指示器颜色
        labelColor: Colors.blue, // 选中状态下的文本颜色
        unselectedLabelColor: Colors.grey, // 未选中状态下的文本颜色
      ),
    );
  }
}

效果图如下:

0593e253be8eb592081563b2cb80f7fc.png


备注:


记得用TabController将TabBarView与TabBar结合起来,这样才能实现联动,TabBar选择时TabBarView才会刷新,TabBarView滑动切换时TabBar的焦点才会跟着变。

BottomNavigationBar实现

BottomNavigationBar介绍

BottomNavigationBar是Flutter提供的用于底部导航栏的小部件,它可以在应用程序的底部显示一组导航选项。下面是对BottomNavigationBar的详细介绍。

构造函数:


BottomNavigationBar({
  Key? key,
  required List<BottomNavigationBarItem> items, // 导航选项列表
  int currentIndex = 0, // 当前选中的索引
  Color? backgroundColor, // 背景颜色
  Color? unselectedItemColor, // 未选中项的颜色
  Color? selectedItemColor, // 选中项的颜色
  double? elevation, // 阴影高度
  BottomNavigationBarType type = BottomNavigationBarType.fixed, // 样式类型
  ValueChanged<int>? onTap, // 点击事件回调
  MouseCursor? mouseCursor, // 鼠标指针
  bool enableFeedback = true, // 是否启用触觉反馈
})

属性:


items:一个包含BottomNavigationBarItem对象的列表,表示导航栏的选项。每个BottomNavigationBarItem包含一个图标和一个可选的文本标签。
currentIndex:当前选中的选项的索引。
backgroundColor:导航栏的背景颜色。
unselectedItemColor:未选中项的颜色。
selectedItemColor:选中项的颜色。
elevation:导航栏的阴影高度。
type:导航栏的样式类型。可以是BottomNavigationBarType.fixed(固定样式,所有选项占用相等的空间)或BottomNavigationBarType.shifting(移动样式,选中的选项会突出显示)。
onTap:点击导航项时的回调函数,它接受一个int类型的参数,表示选中的选项的索引。
mouseCursor:鼠标指针的样式。
enableFeedback:是否启用触觉反馈。


BottomNavigationBar实现底部导航栏的例子

import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyTabPage(),
    );
  }
}
class MyTabPage extends StatefulWidget {
  @override
  _MyTabPageState createState() => _MyTabPageState();
}
class _MyTabPageState extends State<MyTabPage> with SingleTickerProviderStateMixin {
  int _currentIndex = 0;
  late TabController _tabController;
  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this); // 3是选项卡数量
    _tabController.addListener(_handleTabChange); // 添加监听器
  }
  @override
  void dispose() {
    _tabController.removeListener(_handleTabChange); // 移除监听器
    _tabController.dispose();
    super.dispose();
  }
  void _handleTabChange() {
    setState(() {
      _currentIndex = _tabController.index; // 更新焦点索引
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('微信'),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          // 第一个选项卡的内容
          Container(
            child: Center(
              child: Text('聊天'),
            ),
          ),
          // 第二个选项卡的内容
          Container(
            child: Center(
              child: Text('群组'),
            ),
          ),
          // 第三个选项卡的内容
          Container(
            child: Center(
              child: Text('个人'),
            ),
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (int index) {
          setState(() {
            _currentIndex = index;
            _tabController.animateTo(index); // 切换TabBarView
          });
        },
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.chat),
            label: '聊天',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.group),
            label: '群组',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            label: '个人',
          ),
        ],
      ),
    );
  }
}

效果如下:

b4bc32b79f180815b84afd84d6ecd1cd.png

我们使用了BottomNavigationBar小部件代替了TabBar。BottomNavigationBar可以放在屏幕底部,并且具有内置的标签和图标。我们将currentIndex绑定到当前选中的标签的索引,以便在用户更改标签时更新底部导航栏。我们还使用onTap回调,以便在用户点击标签时切换TabBarView中的标签页。


请注意,在此示例中,我们仍然使用了TabBarView来显示选项卡内容。我们通过将TabController传递给TabBarView来将其与BottomNavigationBar同步。这样,当用户更改底部导航栏的标签时,TabBarView也会切换到相应的标签页。我们添加了一个_handleTabChange方法来处理选项卡的变化。在initState方法中,我们将此方法添加为TabController的监听器。当TabController的索引发生变化时,_handleTabChange方法会被调用,然后我们更新底部导航栏的焦点索引_currentIndex,从而实现底部导航栏焦点随着TabBarView的滑动而更新。


在_handleTabChange方法中,我们使用了setState来触发重新构建界面,以便更新底部导航栏焦点。

这些都是必要的,不然TabBarView和BottomNavigationBar不会联动。


总结

BottomNavigationBar和TabBar实现底部导航栏哪个更好?

BottomNavigationBar和TabBar都可以用作底部导航栏,选择使用哪个取决于您的具体需求和设计偏好。以下是它们的一些特点和使用场景:


BottomNavigationBar

BottomNavigationBar是专门为底部导航栏设计的小部件,提供了内置的标签和图标,并支持固定数量的选项。

它通常用于在应用的底部提供导航功能,例如常见的底部标签栏。

BottomNavigationBar在设计上更符合平台的底部导航栏样式,可以提供更统一的用户体验。

它适合用于具有固定数量的导航选项,例如底部标签页的数量已知且固定。


TabBar

TabBar是一个通用的选项卡导航小部件,可以放置在顶部或底部,并且可以包含可滚动或固定数量的选项。

它可以用于创建自定义的导航样式,并支持更灵活的选项卡布局和交互。

TabBar适合用于具有可变数量的导航选项,例如多个选项卡页的数量可以根据用户权限或动态数据而变化。


根据实际情况选择

在实际应用中,选择使用哪个小部件更方便、更好或更常用是因人而异的。如果您的应用需要固定数量的底部导航选项,并且您希望使用内置的样式和动画,那么BottomNavigationBar可能更适合。如果您需要更多的自定义选项,例如可滚动的选项卡或与其他自定义导航组件的集成,那么TabBar可能更适合。


最佳选择取决于您的项目需求、设计风格和用户体验目标。建议根据具体情况评估这两个小部件,并选择最适合您项目的底部导航栏实现。


相关文章
|
1月前
|
UED
Flutter&鸿蒙next 中的 Drawer 导航栏
在 Flutter 中,Drawer 是一个常用的侧边栏导航组件,通过点击菜单按钮或滑动屏幕显示。它用于展示导航项、用户信息和应用设置等。本文通过一个简单的示例代码,介绍了如何使用 Drawer 实现多页面导航,包括 Drawer 的基本结构、ListView 和 ListTile 的使用,以及页面内容的切换。希望对理解和使用 Flutter 的 Drawer 组件有所帮助。
100 1
|
3月前
|
JSON 小程序 前端开发
微信小程序的目录结构及页面结构的说明
本文详细介绍了微信小程序的目录结构、页面组成部分以及项目的全局配置文件,阐述了小程序的宿主环境和运行机制,包括小程序启动和页面渲染的过程。
微信小程序的目录结构及页面结构的说明
|
4月前
|
小程序
微信小程序多种跳转页面方式
微信小程序多种跳转页面方式
|
3月前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
2月前
|
Dart 开发者
flutter:页面整合 (十)
本文档介绍了如何在 Flutter 应用中使用底部导航栏(`BottomNavigationBar`)和侧边栏(`Drawer`),包括简单的使用方法、属性配置、与按钮结合使用、使用图片作为图标、以及如何实现顶部导航。示例代码展示了如何创建包含多个页面的导航栏,并通过 `TabController` 控制器实现页面切换。同时,文档还提供了如何自定义导航栏样式和添加浮动操作按钮(`FloatingActionButton`)的方法。最后,整合了底部导航栏、侧边栏和顶部导航栏的完整示例代码,帮助开发者快速构建具有导航功能的 Flutter 应用界面。
|
3月前
|
小程序 前端开发 生物认证
微信小程序如何将一个按钮放到页面的最底下?
微信小程序如何将一个按钮放到页面的最底下?
400 5
|
3月前
|
JSON 小程序 JavaScript
微信小程序页面事件,下拉刷新事件和上拉触底事件
这篇文章介绍了微信小程序中如何实现下拉刷新和上拉触底事件,包括开启下拉刷新、配置下拉刷新样式、监听下拉刷新事件,以及监听上拉触底事件和配置上拉触底的距离。
|
4月前
|
小程序 开发者
万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】
这篇文章分享了四个不同应用场景下的微信小程序个人主页的源代码和页面效果展示,包括商城系统、外卖系统、医疗挂号和电影购票系统的个人主页。提供了完整的页面布局和样式代码,允许开发者直接复制粘贴并根据自己的项目需求进行简单的改造使用。
万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】
|
5月前
|
小程序 安全 搜索推荐
【微信小程序开发实战项目】——个人中心页面的制作
本文介绍了如何设计和实现一个网上花店的微信小程序,包括个人中心、我的订单和我的地址等功能模块。个人中心让用户能够查看订单历史、管理地址和与客服互动。代码示例展示了`own.wxml`、`own.wxss`和`own.js`文件,用于构建个人中心界面,包括用户信息、订单链接、收藏、地址、客服和版本信息。我的订单部分展示了订单详情,包括商品图片、名称、销量、价格和订单状态,用户可以查看和管理订单。我的地址功能允许用户输入和编辑收货信息,包括联系人、性别、电话、城市和详细地址。每个功能模块都附有相应的WXML和WXSS代码,以及简洁的样式设计。
274 0
【微信小程序开发实战项目】——个人中心页面的制作
|
5月前
|
前端开发
支付系统--微信支付21--搭建前端环境,payment-demo-front这个项目文件夹是前端显示文件,payment-demo是后端项目,支付页面常见三个页面:购买课程,我的订单,下载账单
支付系统--微信支付21--搭建前端环境,payment-demo-front这个项目文件夹是前端显示文件,payment-demo是后端项目,支付页面常见三个页面:购买课程,我的订单,下载账单