【Flutter】【widget】BottomNavigationBar和BottomAppBar


在这里插入图片描述

前言

BottomNavigationBar 底部导航栏


一、BottomNavigationBar是什么?

底部导航栏,如同微信,最下面的导航栏

二、使用步骤

1.简单使用

代码如下(示例):

      bottomNavigationBar: BottomNavigationBar(
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        backgroundColor: Colors.white,
        elevation: 10,
        currentIndex: _currentIndex, //选中的index配合stack 使用
        items: const [
//这边可以设置,点击之后的icon 颜色等
          BottomNavigationBarItem(
              activeIcon: Icon(Icons.phone_in_talk, color: Colors.red),
              icon: Icon(Icons.phone_in_talk, color: Colors.black),
              label: '通讯录'),
          BottomNavigationBarItem(
              activeIcon: Icon(Icons.find_in_page, color: Colors.red),
              icon: Icon(Icons.find_in_page, color: Colors.black),
              label: '发现'),
          BottomNavigationBarItem(
              activeIcon: Icon(Icons.people, color: Colors.red),
              icon: Icon(Icons.people, color: Colors.black),
              label: '我'),
        ],
      ),

也可以统一设置风格,颜色和选中颜色等

      bottomNavigationBar: BottomNavigationBar(
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        backgroundColor: Colors.white,
        elevation: 10,
        currentIndex: _currentIndex, //选中的index配合stack 使用
        selectedItemColor: Colors.red, //选中的文本的颜色

        //可以自己单独对应icon 进行设置,可以在这边统一的设置
        selectedIconTheme: IconThemeData(color: Colors.greenAccent),
        unselectedIconTheme: IconThemeData(color: Colors.black),

注意:BottomNavigationBarItem的数量要大于等于2,不然会报错

在这里插入图片描述

完整的代码如下:

    type: BottomNavigationBarType.fixed,//shifting:选中才显示文本,fixed文本一直显示,两种不同的模式
class SecondPage extends StatefulWidget {
  const SecondPage({Key? key}) : super(key: key);

  
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  int _currentIndex = 0;
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('second page'),
      ),
      body: IndexedStack(
        index: _currentIndex,
        children: [
          Center(
            child: Container(
              child: Text('1'),
            ),
          ),
          Center(
            child: Container(
              child: Text('2'),
            ),
          ),
          Center(
            child: Container(
              child: Text('3'),
            ),
          ),
          Center(
            child: Container(
              child: Text('4'),
            ),
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,//shifting:选中才显示文本,fixed文本一直显示
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        backgroundColor: Colors.white,
        elevation: 10,
        currentIndex: _currentIndex, //选中的index配合stack 使用
        selectedItemColor: Colors.red, //选中的文本的颜色

        //可以自己单独对应icon 进行设置,可以在这边统一的设置
        selectedIconTheme: const IconThemeData(color: Colors.green),
        unselectedIconTheme: const IconThemeData(color: Colors.black),
        items: const [
          BottomNavigationBarItem(
              icon: Icon(
                Icons.task_alt_sharp,
                // color: Colors.black,
              ),
              label: '微信'),
          BottomNavigationBarItem(
              icon: Icon(Icons.phone_in_talk), label: '通讯录'),
          BottomNavigationBarItem(icon: Icon(Icons.find_in_page), label: '发现'),
          BottomNavigationBarItem(icon: Icon(Icons.people), label: '我'),
        ],
      ),
    );
  }
}

在这里插入图片描述

2.BottomAppBar

可以在BottomNavigationBar的按钮顶部留出一个控件给 floatbutton![

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: BottomAppBar(
        elevation: 20,
        notchMargin: 10, //float button的外边距
        shape: const CircularNotchedRectangle(), //形状,嵌入的感觉
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            IconButton(onPressed: () {}, icon: const Icon(Icons.abc)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.place)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.dangerous)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.one_k)),
          ],
        ),
      ),
      appBar: AppBar(
        title: Text(widget.title),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

效果如图:

在这里插入图片描述

flotabutton 的位置,有很多的选择,你可以具体的参考:

在这里插入图片描述

flotabutton 的形状

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: BottomAppBar(
        elevation: 20,
        notchMargin: 10, //float button的外边距
        // CircularNotchedRectangle() //形状,嵌入的感觉,凹槽的形状
        shape: const AutomaticNotchedShape(
            RoundedRectangleBorder(),
            BeveledRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(15)))),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            IconButton(onPressed: () {}, icon: const Icon(Icons.abc)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.place)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.dangerous)),
            IconButton(onPressed: () {}, icon: const Icon(Icons.one_k)),
          ],
        ),
      ),
      appBar: AppBar(
        title: Text(widget.title),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      floatingActionButton: FloatingActionButton(
        shape: const BeveledRectangleBorder(
            borderRadius:
                BorderRadius.all(Radius.circular(15))), //float button 的形状,八边形
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

在这里插入图片描述


总结

欢迎关注,留言,咨询,交流!
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值