• Flutter 导航


    Drawer 导航

    Scaffold
      drawer(左侧抽屉菜单)
      endDrawer(右侧抽屉菜单)

    UserAccountsDrawerHeader
      抽屉菜单头部组件

    AboutListTile
      关于弹窗
    import 'package:flutter/material.dart';
    
    class Home extends StatelessWidget {
      const Home({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Drawer 抽屉'),
          ),
          body: const HomePage(),
          // 左侧抽屉菜单
          drawer: const DrawerList(),
          // 右侧抽屉菜单
          endDrawer: const DrawerList(),
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      const HomePage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          padding: const EdgeInsets.all(10),
          child: const Text('首页'),
        );
      }
    }
    
    class DrawerList extends StatelessWidget {
      const DrawerList({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        // 创建抽屉组件
        return Drawer(
          child: ListView(
            children: [
              // 抽屉菜单头部组件
              const UserAccountsDrawerHeader(
                // 当前账户名称
                accountName: Text('史蒂夫 罗杰斯'),
                // 当前账户邮箱
                accountEmail: Text('rogers@cap.com'),
                // 当前账户头像
                currentAccountPicture: CircleAvatar(
                  backgroundImage: AssetImage('assets/image4.jpg'),
                ),
                // 背景
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: AssetImage('assets/image3.jpg'),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              const ListTile(
                leading: Icon(Icons.settings),
                title: Text('设置'),
                trailing: Icon(Icons.arrow_forward_ios),
              ),
              const Divider(
                thickness: 2,
              ),
              const ListTile(
                leading: Icon(Icons.account_balance),
                title: Text('余额'),
                trailing: Icon(Icons.arrow_forward_ios),
              ),
              const Divider(
                thickness: 2,
              ),
              const ListTile(
                leading: Icon(Icons.person),
                title: Text('我的'),
                trailing: Icon(Icons.arrow_forward_ios),
              ),
              const Divider(
                thickness: 2,
              ),
              ListTile(
                leading: const Icon(Icons.person),
                title: const Text('返回'),
                trailing: const Icon(Icons.arrow_forward_ios),
                onTap: () => Navigator.pop(context),
              ),
              // 关于弹窗
              const AboutListTile(
                child: Text('关于'),
                applicationName: '应用名称',
                applicationVersion: '1.0.1',
                applicationLegalese: '法律条款',
                aboutBoxChildren: [
                  Text('条例一:xxxx'),
                  Text('条例二:xxxx'),
                ],
                applicationIcon: FlutterLogo(),
                icon: CircleAvatar(
                  child: Text('图片'),
                ),
              ),
            ],
          ),
        );
      }
    }

    BottomNavigationBar 导航

    items:List<BottomNavigationBarItem>
      包含导航(BottomNavigationBarItem)的列表

    currentIndex:int,默认值 0
      当前选中的导航索引

    type:BottomNavigationBarType
      导航类型(BottomNavigationBarType),取值 fixed (各导航等分宽度),shifting(点击时导航背景色会有动画效果)

    onTap()
      导航的点击事件(一般会更新导航索引)
    import 'package:flutter/material.dart';
    
    class Home extends StatefulWidget {
      const Home({Key? key}) : super(key: key);
    
      @override
      State<Home> createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
      // 底部导航菜单列表
      final List<BottomNavigationBarItem> bottomNavItems = const [
        BottomNavigationBarItem(
          icon: Icon(Icons.home),
          backgroundColor: Colors.blue,
          label: '首页',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.message),
          backgroundColor: Colors.green,
          label: '消息',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.shopping_cart),
          backgroundColor: Colors.amber,
          label: '购物车',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.person),
          backgroundColor: Colors.red,
          label: '我的',
        ),
      ];
      // 页面
      final List<Center> pages = const [
        Center(
          child: Text('Home', style: TextStyle(fontSize: 50)),
        ),
        Center(
          child: Text('Message', style: TextStyle(fontSize: 50)),
        ),
        Center(
          child: Text('Cart', style: TextStyle(fontSize: 50)),
        ),
        Center(
          child: Text('Profile', style: TextStyle(fontSize: 50)),
        ),
      ];
      // 选中的导航下标
      int currentIndex = 0;
      // 切换导航
      void _changePage(int index) {
        if (index != currentIndex) {
          setState(() {
            currentIndex = index;
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('底部导航'),
          ),
          // 底部导航
          bottomNavigationBar: BottomNavigationBar(
            items: bottomNavItems,
            currentIndex: currentIndex,
            // 导航类型:效果如下图所示
            type: BottomNavigationBarType.fixed,
            // type: BottomNavigationBarType.shifting,
            onTap: (index) {
              _changePage(index);
            },
          ),
          body: pages[currentIndex],
        );
      }
    }
     
    type: BottomNavigationBarType.fixed 效果:
    type: BottomNavigationBarType.shifting 效果:
    Tab 导航

    DefaultTabController:整个 Tab 导航的容器
      length:声明导航数量
      child:指定子组件

    TabBar:导航菜单
      tabs:导航菜单数组

    TabBarView:导航页面
      children:多个导航页面内容
    import 'package:flutter/material.dart';
    
    class Home extends StatelessWidget {
      const Home({Key? key}) : super(key: key);
    
      // 菜单数组
      final List<Widget> _tabs = const [
        Tab(text: '首页', icon: Icon(Icons.home)),
        Tab(text: '添加', icon: Icon(Icons.add)),
        Tab(text: '搜索', icon: Icon(Icons.search)),
      ];
    
      // 页面数组
      final List<Widget> _tabViews = const [
        Icon(Icons.home, size: 120, color: Colors.red),
        Icon(Icons.add, size: 120, color: Colors.green),
        Icon(Icons.search, size: 120, color: Colors.amber),
      ];
    
      @override
      Widget build(BuildContext context) {
        // Tab导航的容器
        return DefaultTabController(
          // 导航的总个数
          length: _tabs.length,
          child: Scaffold(
            appBar: AppBar(
              title: const Text('Tab 导航'),
              // 展示在 appbar 底部的导航
              bottom: TabBar(
                tabs: _tabs,
                // 点击时的水波纹效果
                overlayColor: MaterialStateProperty.all(
                  Colors.red,
                ),
                // 导航高亮的颜色
                labelColor: Colors.yellow,
                // 未选中导航的颜色
                unselectedLabelColor: Colors.grey,
                // 导航高亮的线条
                indicatorColor: Colors.pink,
                // 线条的长度 tab:跟导航同宽,label:跟文本同宽
                indicatorSize: TabBarIndicatorSize.tab,
                // 线条的高度
                indicatorWeight: 10,
              ),
            ),
            body: TabBarView(children: _tabViews),
            // 底部导航
            bottomNavigationBar: TabBar(
              tabs: _tabs,
              // 导航高亮的文本颜色
              labelColor: Colors.blue,
              // 未选中导航的文本颜色
              unselectedLabelColor: Colors.grey,
            ),
          ),
        );
      }
    }

     
     
     
     
  • 相关阅读:
    我有好多东西要学
    不科学计数法
    遍历生成dataframe
    搭建个人博客,Docsify+Github webhook+JGit解决方案
    从1开始实现一个中间件
    python通过youget下载B站系列视频
    JS 中深拷贝的几种实现方法
    addEventListener() 方法,事件监听
    css背景透明文字不透明
    如何理解dispatch( 'tagsView/delAllViews',null,{root:true} )里面的root:true
  • 原文地址:https://www.cnblogs.com/rogerwu/p/16325818.html
Copyright © 2020-2023  润新知