Flutter BottomNavigation 底部导航详解 及问题记录

举报
拿我格子衫来 发表于 2022/03/17 23:46:32 2022/03/17
【摘要】 Flutter  BottomNavigation 底部导航详解   主要是使用了 Scaffold下的 bottomNavigationBar 整个属性,在这个属性下,可以添加底部图标的背景色,选中颜色,以及是否粘贴到底部,和导航的个数   在app的主页面,home指向底部导航栏的组件 h...

Flutter  BottomNavigation 底部导航详解

 

主要是使用了

Scaffold下的
bottomNavigationBar 整个属性,在这个属性下,可以添加底部图标的背景色,选中颜色,以及是否粘贴到底部,和导航的个数

 

在app的主页面,home指向底部导航栏的组件

home: BottomNavigation(),
 

底部导航栏的组件集成 StatefulWidget 在内部创建一个带有状态的组件


  
  1. // 底部导航
  2. class BottomNavigation extends StatefulWidget {
  3. @override
  4. _BottomNavigationState createState() => _BottomNavigationState();
  5. }

状态组件内有一些颜色的变量和选中导航索引的变量


  
  1. int _currentIndex = 0;
  2. static const int mainNum = 0xFFFA8C16;

这里多数一句 Flutter 提供了两套预设的主题UI 这些UI有很多的常量可以直接引入使用

如颜色, 按钮,图标


  
  1. Colors.white // 白色颜色
  2. Icons.home // home 图标
  3. FloatingActionButton // 漂浮的按钮

效果图

 

在colors.dart中查看预设颜色值

在icons.dart中查看预设图标

 

 

 

源码

三个文件 main.dart


  
  1. import 'package:flutter/material.dart';
  2. import './view/home.dart';
  3. import './view/message.dart';
  4. void main() => runApp(MyApp());
  5. class MyApp extends StatelessWidget {
  6. // This widget is the root of your application.
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: 'Flutter Demo',
  11. theme: ThemeData(
  12. primarySwatch: Colors.blue,
  13. ),
  14. home: BottomNavigation(),
  15. );
  16. }
  17. }
  18. // 底部导航
  19. class BottomNavigation extends StatefulWidget {
  20. @override
  21. _BottomNavigationState createState() => _BottomNavigationState();
  22. }
  23. class _BottomNavigationState extends State<BottomNavigation> {
  24. int _currentIndex = 0;
  25. static const int mainNum = 0xFFFA8C16;
  26. List<Widget> list = List();
  27. @override
  28. void initState() {
  29. list..add(Home())..add(Message());
  30. super.initState();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. return Scaffold(
  35. body: list[_currentIndex],
  36. bottomNavigationBar: BottomNavigationBar(
  37. selectedItemColor: Colors.white,
  38. backgroundColor: Color(mainNum),
  39. type: BottomNavigationBarType.fixed,
  40. items: [
  41. BottomNavigationBarItem(icon:Icon(Icons.home),title: Text('首页')),
  42. BottomNavigationBarItem(icon:Icon(Icons.message),title: Text('消息'))
  43. ],
  44. currentIndex: _currentIndex,
  45. onTap: (int index) {
  46. setState(() {
  47. _currentIndex = index;
  48. });
  49. },
  50. ),
  51. );
  52. }
  53. }

 

home.dart


  
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class Home extends StatefulWidget {
  4. Home();
  5. @override
  6. State<StatefulWidget> createState() => _Home();
  7. }
  8. class _Home extends State<Home> {
  9. int _counter = 0;
  10. void _incrementCounter() {
  11. setState(() {_counter++;});
  12. }
  13. @override
  14. Widget build(BuildContext context) {
  15. return Scaffold(
  16. appBar: AppBar(),
  17. body: Center(
  18. child: Column(
  19. mainAxisAlignment: MainAxisAlignment.center,
  20. children: <Widget>[
  21. Text('It is my home page :')
  22. ],
  23. ),
  24. ),
  25. floatingActionButton: FloatingActionButton(
  26. onPressed: _incrementCounter,
  27. tooltip: 'Increment',
  28. child: Icon(Icons.add),
  29. ),
  30. );
  31. }
  32. }

 

message.dart


  
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class Message extends StatefulWidget {
  4. Message();
  5. @override
  6. State<StatefulWidget> createState() => _Message();
  7. }
  8. class _Message extends State<Message> {
  9. int _counter = 5;
  10. void _incrementCounter() {
  11. setState(() {_counter++;});
  12. }
  13. @override
  14. Widget build(BuildContext context) {
  15. return Scaffold(
  16. appBar: AppBar(),
  17. body: Center(
  18. child: Column(
  19. mainAxisAlignment: MainAxisAlignment.center,
  20. children: <Widget>[
  21. Text('It is my message page')
  22. ],
  23. ),
  24. )
  25. );
  26. }
  27. }

 

事件处理

按钮的点击事件 onPressed: _incrementCounter,

处理方法


  
  1. void _incrementCounter() {
  2. setState(() {_counter++;});
  3. }

使用void关键字修饰, 使用setState 来修改内部变量

 

问题1:

假如页面停留在首页, 此时来了一个消息,需要在消息的导航栏上加上徽标,该如何处理?

 

问题2:

假如现在要做换肤的功能,那要如何做?

 

问题3:

目前dart辨析的时候,有很多括号, 格式不够优美,有没有第三方,成熟的组件以供使用

 

问题4:

如何在页面切换时 ,使用动画,自己写?框架有预设吗?

 

问题5:

如何设置支持导航栏,左滑,优化切换?

 

 

效果图

 

 

 

文章来源: fizzz.blog.csdn.net,作者:拿我格子衫来,版权归原作者所有,如需转载,请联系作者。

原文链接:fizzz.blog.csdn.net/article/details/104073164

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。