flutter底部导航栏中间按钮凸起,导航栏中间部分凹陷效果

关键代码:

Scaffold中设置floatingActionButtonLocation: FloatingActionButtonLocation.centerDockedextendBody: true

BottomAppBar中设置shape: const CircularNotchedRectangle()

dart 复制代码
Scaffold(
              extendBody: true,//body是否延伸脚手架底部,在底部导航栏的边缘添加了凹口时,确保能看到body内容
              body: _body(),
              floatingActionButton: FloatingActionButton(
                backgroundColor: Colors.transparent,
                onPressed: () {
                  isLogin().then((value) {
                    if (value == true) {
                      Utils().postDialog(context);
                    } else {
                      NavigatorUtil.push(LoginPage());
                    }
                  });
                },
                child: Image.asset(PathConfig.iconPublishGreen,width: 112.w,height: 112.w),
              ),
              floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
              bottomNavigationBar: _bottomNavigationAppBar(),
            );


//中间凸出的底部导航栏(和floatingActionButton配合使用)
  _bottomNavigationAppBar(){
    return SizedBox(
      height: 110.w,
      child: BottomAppBar(
        color: Colors.white,
        shape: const CircularNotchedRectangle(),//添加一个凹口的形状
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            // 首页底部图标
            Expanded(child: GestureDetector(
                child: _currentIndex == 0
                    ? Image.asset(PathConfig.iconLogoRound,width: 64.w,height: 64.w)
                    : Container(
                  color: Colors.transparent,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Container(
                        width: 40.w,
                        height: 40.w,
                        margin: EdgeInsets.only(bottom: 4.w),
                        child: Image(
                          image: AssetImage(PathConfig.iconUnselectAtui),
                        ),
                      ),
                      Text(S.of(context).atui,
                          style: TextStyle(
                              fontSize: 20.sp,
                              color: _currentIndex == 0 ? Color(0xffe63850) : Color(0xffD2D5D4)))
                    ],
                  ),
                ),
                onTap: (){
                  _changePage(0);
                }
            )),
            // 商城底部图标
            Expanded(child: GestureDetector(
                child: Container(
                  color: Colors.transparent,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Container(
                        width: 40.w,
                        height: 40.w,
                        margin: EdgeInsets.only(bottom: 4.w),
                        child: Image(
                          image: AssetImage(
                              _currentIndex == 1 ? PathConfig.iconSelectedMarket : PathConfig.iconUnselectMarket),
                        ),
                      ),
                      Text(S.of(context).market,
                          style: TextStyle(
                              fontSize: 20.sp, color: _currentIndex == 1 ? JadeColors.green_2 : Color(0xffD2D5D4)))
                    ],
                  ),
                ),
                onTap: (){
                  _changePage(1);
                }
            )),
            // 发布图标
            Expanded(child: GestureDetector(
                child: Column(
                  children: <Widget>[
                    Container(
                      width: 40.w,
                      height: 40.w,
                    ),
                    /*Text(
                      S.of(context).publish,
                      style: TextStyle(
                          fontSize: 13,
                          color: JadeColors.green_2),
                    )*/
                  ],
                ),
                onTap: (){
                  //_changePage(2);
                }
            )),
            // 消息底部图标
            Expanded(child: GestureDetector(
              child: Container(
                color: Colors.transparent,
                // alignment: Alignment.center,
                child: Stack(
                  alignment: Alignment.center,
                  children: <Widget>[
                    Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Container(
                          width: 40.w,
                          height: 40.w,
                          margin: EdgeInsets.only(bottom: 4.w),
                          child: Image(
                            image: AssetImage(_currentIndex == 3 ? PathConfig.iconSelectedMessage : PathConfig.iconUnselectMessage),
                          ),
                        ),
                        Text(
                          S.of(context).xiaoxi,
                          style: TextStyle(
                              fontSize: 20.sp,
                              color: _currentIndex == 3 ? JadeColors.green_2 : Color(0xffD2D5D4)),
                        )
                      ],
                    ),
                    Positioned(
                        right: 40.w,
                        top: 6.w,
                        child: _messageCountView())
                  ],
                ),
              ),
              onTap: (){
                _changePage(3);
              },
            )),
            // 我的底部图标
            Expanded(child: GestureDetector(
              child: Container(
                  color: Colors.transparent,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Container(
                        width: 40.w,
                        height: 40.w,
                        margin: EdgeInsets.only(bottom: 4.w),
                        child: Image(
                          image: AssetImage(_currentIndex == 4 ? PathConfig.iconSelectedMine : PathConfig.iconUnselectMine),
                        ),
                      ),
                      Text(
                        S.of(context).wode,
                        style: TextStyle(
                            fontSize: 20.sp,
                            color: _currentIndex == 4 ? JadeColors.green_2 : Color(0xffD2D5D4)),
                      )
                    ],
                  )
              ),
              onTap: (){
                _changePage(4);
              },
            ))
          ],
        ),
      ),
    );

  }
相关推荐
Android系统攻城狮32 分钟前
Android tinyalsa深度解析之pcm_params_get_periods_min调用流程与实战(一百七十三)
android·pcm·tinyalsa·音频进阶手册
Xempastissimo1 小时前
Android常见界面控件
android
法欧特斯卡雷特1 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·后端·开源
左手厨刀右手茼蒿2 小时前
Flutter 三方库 firebase_admin 跨云边管线企业级鸿蒙管控底座适配风云:无障碍贯穿服务器授权防火墙打通底层生态授权域并构建海量设备推送集结-适配鸿蒙 HarmonyOS ohos
服务器·flutter·harmonyos
钛态2 小时前
Flutter for OpenHarmony:shelf_web_socket 快速构建 WebSocket 服务端,实现端到端实时通信(WebSocket 服务器) 深度解析与鸿蒙适配指南
服务器·前端·websocket·flutter·华为·性能优化·harmonyos
亚历克斯神3 小时前
Flutter 三方库 at_server_status 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、实时的 @protocol 去中心化身份服务器状态感知与鉴权监控引擎
flutter·华为·harmonyos
词元Max3 小时前
1.5 Harness 架构深度解析:Claude Code 为什么强?
android·架构
yy55273 小时前
Mysql 主从复制与读写分离
android·数据库·mysql
zhenxin01223 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
做萤石二次开发的哈哈4 小时前
萤石云硬件接入如何完成云对讲套件低代码集成?
android·低代码·rxjava