经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Flutter » 查看文章
Flutter实现底部导航栏创建详解
来源:jb51  时间:2022/1/17 18:38:45  对本文有异议

ConvexBottomBar是一个底部导航栏组件,用于展现凸起的TAB效果,支持多种内置样式与动画交互。你可以在https://appbar.codemagic.app/上找到在线样例。

添加依赖项

在你的项目中去 pubspec。添加依赖项: 添加https://pub.dev/packages/convex_bottom_bar的最新版本。

运行下列代码,添加依赖

  1. flutter pub add convex_bottom_bar
  1. environment:
  2. sdk: '>=2.12.0 <3.0.0'
  3. dependencies:
  4. flutter:
  5. sdk: flutter
  6. cupertino_icons: ^1.0.2
  7. convex_bottom_bar: ^3.0.0

我们使用convax_bottom_bar 来创建一个非常nice的底部导航栏。

如何使用

通常, 「ConvexAppBar」 可以通过设置它的 bottomNavigationBar 来与脚手架一起工作。ConvexAppBar具有两个构造函数,ConvexAppBar()将使用默认样式来简化选项卡的创建。

  1. import 'package:convex_bottom_bar/convex_bottom_bar.dart';
  2.  
  3. Scaffold(
  4. bottomNavigationBar: ConvexAppBar(
  5. items: [
  6. TabItem(icon: Icons.home, title: 'Home'),
  7. TabItem(icon: Icons.map, title: 'Discovery'),
  8. TabItem(icon: Icons.add, title: 'Add'),
  9. TabItem(icon: Icons.message, title: 'Message'),
  10. TabItem(icon: Icons.people, title: 'Profile'),
  11. ],
  12. initialActiveIndex: 2,//optional, default as 0
  13. onTap: (int i) => print('click index=$i'),
  14. )
  15. );

功能

  • 提供多种内部样式
  • 能够更改AppBar的主题
  • 提供Builder API以自定义新样式
  • 在AppBar上添加徽章
  • 支持优雅的过渡动画
  • 提供Hook API来重载一些内部样式
  • RTL布局支持

关于支持的样式,可以从这儿查看

https://pub.flutter-io.cn/packages/convex_bottom_bar

属性

下面是 「*Convex_Bottom_Bar*」 的一些属性:

  • 「fixed」 (副标题图标停留在中心)
  • 「fixedCircle」 (相同,但在固定图标的所有边上都有一个白色的圆圈)
  • 「react」 (上标图标取代点击另一个图标)
  • 「reactCircle」 (与上标图标中的白色圆圈相同)
  • 「textIn」 (选定的离子出现相应的标题)
  • 「titled」 (未选择的图标是显示其标题的单个图标)
  • 「flip」 (点击图标显示一个 flip 动画)
  • 「custom」 (使用 ConvexBottomAppBar 构建器自定义预定义的参数)
  • 「height」 (grabbing the appbar)
  • 「top」 (grabbing the superscripted icon)
  • 「curveSize」 (拉伸上标图标的曲线)
  • 「color」 (设置图标的颜色)
  • 「backgroundColor」 (设置 appbar 背景颜色)
  • 「gradient」 (使用渐变小部件设置 appbar 背景颜色)
  • 「activeColor」 (设置圆形颜色)

主题

AppBar默认使用内置样式,您可能需要为其设置主题。 以下是一些支持的属性:

AttributesDescription
backgroundColorAppBar 背景
gradient渐变属性,可以覆盖backgroundColor
heightAppBar 高度
coloricon/text 的颜色值
activeColoricon/text 的选中态颜色值
curveSize凸形大小
top凸形到AppBar上边缘的距离
style支持的样式: fixed, fixedCircle, react, reactCircle, ...
chipBuilder角标构造器builder, ConvexAppBar.badge会使用默认样式

预览图

代码

Convex_Bottom_Bar 演示中,首先,我们在这个类中创建一个名为 MyHomePage ()的有状态类,我们创建一个值为 0 的变量 selectedpage 类型的 integer pass。定义一个名为 pageList的列表,在这个列表中我们传递要添加到 bootom 导航栏中的所有页面。

  1. int selectedpage = 0;
  2. final _pageList= [Home(), Message(), Persion(), Detail()];

在 BuildContext ()中,我们定义 Scaffold。

  1. appBar: AppBar(
  2. centerTitle: true,
  3. title: Text('Convex Bottom Bar'),
  4. ),

首先在正文中传递 _pageno,其值为 selectedPage。使用 scaffold 属性,我们使用 bottomNavigationBar。在这里,我们创建 ConvexAppBar ()并传递 Items、 initialActiveIndex 和 onTap。在条目中,我们通过所有的屏幕,我们希望在我们的应用程序中显示。在 initialActiveIndexwe 中,我们传递已经定义的变量 selectedpage,在 onTap 中,我们传递 index 并在 setState 中定义 setState () ,我们传递 selectedpage 相当于 index。

  1. bottomNavigationBar: ConvexAppBar(
  2. items: [
  3. TabItem(icon: Icons._home_, title: 'Home'),
  4. TabItem(icon: Icons._favorite_, title: 'Favorite'),
  5. TabItem(icon: Icons._shopping_cart_, title: 'Cart'),
  6. TabItem(icon: Icons._person_, title: 'Profile'),
  7. ],
  8. initialActiveIndex: selectedpage,
  9. onTap: (int index){
  10. setState(() {
  11. selectedpage = index;
  12. });
  13. },
  14. ),

main.dart

  1. import 'package:convex_bottom_bar/convex_bottom_bar.dart';
  2. import 'package:flutter/material.dart';
  3. import 'detail.dart';
  4. import 'home.dart';
  5. import 'message.dart';
  6. import 'persion.dart';
  7.  
  8. void main() {
  9. runApp(MyApp());
  10. }
  11.  
  12. class MyApp extends StatelessWidget {
  13. // This widget is the root of your application.
  14. @override
  15. Widget build(BuildContext context) {
  16. return MaterialApp(
  17. debugShowCheckedModeBanner: false,
  18. theme: ThemeData(
  19. primarySwatch: Colors.teal,
  20. ),
  21. home: MyHomePage(),
  22. );
  23. }
  24. }
  25.  
  26. class MyHomePage extends StatefulWidget {
  27. @override
  28. _MyHomePageState createState() => _MyHomePageState();
  29. }
  30.  
  31. class _MyHomePageState extends State<MyHomePage> {
  32. int selectedpage = 0;
  33. final _pageNo = [Home(), Message(), Persion(), Detail()];
  34.  
  35. @override
  36. Widget build(BuildContext context) {
  37. return Scaffold(
  38. appBar: AppBar(
  39. centerTitle: true,
  40. title: Text('Convex Bottom Bar'),
  41. ),
  42. body: _pageNo[selectedpage],
  43. bottomNavigationBar: ConvexAppBar(
  44. color: Colors.white,
  45. activeColor: Colors.red,
  46. backgroundColor: Colors.orange,
  47. items: [
  48. TabItem(icon: Icons.person, title: '新'),
  49. TabItem(icon: Icons.favorite, title: '年'),
  50. TabItem(icon: Icons.brush, title: '快'),
  51. TabItem(icon: Icons.car_rental, title: '乐'),
  52. ],
  53. initialActiveIndex: selectedpage,
  54. onTap: (int index) {
  55. setState(() {
  56. selectedpage = index;
  57. });
  58. },
  59. ),
  60. );
  61. }
  62. }

如果我们创建不同的页面, Home(), Favorite(), CartPage(), ProfilePage(). 在 Home 类中,我们定义一个带有背景颜色的文本。

Home 页

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3.  
  4. class Home extends StatefulWidget {
  5. const Home({Key? key}) : super(key: key);
  6.  
  7. @override
  8. _HomeState createState() => _HomeState();
  9. }
  10.  
  11. class _HomeState extends State<Home> {
  12. @override
  13. Widget build(BuildContext context) {
  14. return Scaffold(
  15. appBar: AppBar(
  16. centerTitle: true,
  17. title: Text('欢迎来到这儿'),
  18. ),
  19. body: Center(
  20. child: Text(
  21. '早起的年轻人',
  22. style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold),
  23. ),
  24. ),
  25. );
  26. }
  27. }

Message页:

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3.  
  4. class Message extends StatefulWidget {
  5. const Message({Key? key}) : super(key: key);
  6.  
  7. @override
  8. _MessageState createState() => _MessageState();
  9. }
  10.  
  11. class _MessageState extends State<Message> {
  12. @override
  13. Widget build(BuildContext context) {
  14. return Scaffold(
  15. appBar: AppBar(
  16. centerTitle: true,
  17. title: Text('这是当前页的AppBar'),
  18. ),
  19. body: Center(
  20. child: Text(
  21. '因为硬核,所以坚果!',
  22. style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold),
  23. ),
  24. ),
  25. );
  26. }
  27. }

Persion页

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3.  
  4. class Persion extends StatefulWidget {
  5. const Persion({Key? key}) : super(key: key);
  6.  
  7. @override
  8. _PersionState createState() => _PersionState();
  9. }
  10.  
  11. class _PersionState extends State<Persion> {
  12. @override
  13. Widget build(BuildContext context) {
  14. return Scaffold( appBar: AppBar(
  15. centerTitle: true,
  16. title: Text('公众号'),
  17. ),
  18. body: Center(
  19. child: Text(
  20. '大前端之旅',
  21. style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold),
  22. ),
  23. ),
  24. );
  25. }
  26. }

Detail页面

  1. // ignore: file_names
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4.  
  5. class Detail extends StatefulWidget {
  6. const Detail({Key? key}) : super(key: key);
  7.  
  8. @override
  9. _DetailState createState() => _DetailState();
  10. }
  11.  
  12. class _DetailState extends State<Detail> {
  13. String image =
  14. "https://luckly007.oss-cn-beijing.aliyuncs.com/image/image-20220114111115931.png";
  15. @override
  16. Widget build(BuildContext context) {
  17. return Scaffold(
  18. appBar: AppBar(
  19. centerTitle: true,
  20. title: Text('扫码关注'),
  21. ),
  22. body: Center(
  23. child: new Image(image: new NetworkImage(image)),
  24. ),
  25. );
  26. }
  27. }

当我们运行应用程序,我们应该得到屏幕的输出像下面的报错信息。

这是一个

Flutter web问题:Failed to load network image

我的解决办法

flutter build web --release --web-renderer html

flutter run --web-renderer html

flutter run -d chrome --web-renderer html

参考资料

https://pub.flutter-io.cn/packages/convex_bottom_bar

https://github.com/hacktons/convex_bottom_bar

以上就是Flutter实现底部导航栏创建详解的详细内容,更多关于Flutter底部导航栏创建的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号