前端开发进阶篇——Flutter实战之导航

举报
小团子999 发表于 2020/07/05 18:01:21 2020/07/05
【摘要】 Flutter实现简单的导航栏

1. 入口文件编写

        我们先写一个主入口文件,包含了APP通用结构,最主要的是要引入自定义的BottomNavigationWidget组件。

        import 'package:flutter/material.dart';
        import 'bottomNavigationWidget.dart';
        
        void main(List<String> args) {
          runApp(new MyApp());
        }
        
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              title: 'flutter bttom',
              theme: ThemeData.light(),
              home: BottomNavigationWidget(),
            );
          }
        }

2.bottomNavigationWidget.dart文件编写


            StatefulWidget具有可变状态(state)的窗口组件(widget)。使用这个要根据变化状态,调整State值。在lib目录下,新建一个bottomNavigationWidget.dart文件。

         @override
          Widget build(BuildContext context) {
            return Scaffold(
              bottomNavigationBar: BottomNavigationBar(items: [
                BottomNavigationBarItem(icon: Icon(
                  Icons.home,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Home',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
                BottomNavigationBarItem(icon: Icon(
                  Icons.phone,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Phone',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
                BottomNavigationBarItem(icon: Icon(
                  Icons.email,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Email',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
              ],
              type: BottomNavigationBarType.fixed
              )
            );
          }

            现在只是一个静态的页面,下面的导航点击还没有效果。运行效果如下图:

            图片.png

3. 子页面编写

        子页面我们就采用只放入一个AppBar和一个Center,然后用Text Widget表明即可。先来写一个HomeScreen组件,新建一个page目录,然后在目录下面新建

HomePage.dart、page/PhonePage.dart、page/EmailPage.dart三个文件。

            图片.png

        import 'package:flutter/material.dart';
        
        class HomePage extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar:AppBar(
                title: Text('Home'),
              ),
              body: Center(
                child:Text('Home'),
              ),
            );
          }
        }

        我们要重新initState()方法,把刚才做好的页面进行初始化到一个Widget数组中。有了数组就可以根据数组的索引来切换不同的页面了。

        @override        
          void initState() {
            super.initState();
            pageList
              ..add(HomePage())
              ..add(EmailPage())
              ..add(PhonePage());
          }

        ..add()是Dart语言的..语法,返回调用者本身。

        BottomNavigationBar组件里提供了一个相应事件onTap,这个事件自带一个索引值index,通过索引值我们就可以和我们list里的索引值相对应了。

         onTap: (int index){
                setState(() {
                   _currentIndex = index;
                });
              },

        完整代码如下:

        import 'package:flutter/material.dart';
        import 'page/HomePage.dart';
        import 'page/PhonePage.dart';
        import 'page/EmailPage.dart';
        
        class BottomNavigationWidget extends StatefulWidget {
          @override
          _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();
        }
        
        class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {
          final _bottomNavigationColor = Colors.lightBlue;
          List<Widget> pageList = List();
          int _currentIndex = 0;
        
          @override
          void initState() {
            super.initState();
            pageList
              ..add(HomePage())
              ..add(EmailPage())
              ..add(PhonePage());
          }
        
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              body: pageList[_currentIndex],
              bottomNavigationBar: BottomNavigationBar(items: [
                BottomNavigationBarItem(icon: Icon(
                  Icons.home,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Home',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
                BottomNavigationBarItem(icon: Icon(
                  Icons.phone,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Phone',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
                BottomNavigationBarItem(icon: Icon(
                  Icons.email,
                  color:_bottomNavigationColor,
                ),
                title: Text(
                  'Email',
                  style: TextStyle(color: _bottomNavigationColor),
                )
                ),
              ],
              currentIndex: _currentIndex,
              onTap: (int index){
                setState(() {
                   _currentIndex = index;
                });
              },
              type: BottomNavigationBarType.fixed
              )
            );
          }
        }

        运行结果如下:

               图片.png            图片.png           图片.png  

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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