flutter手写一个底部导航栏

这篇具有很好参考价值的文章主要介绍了flutter手写一个底部导航栏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用了一下flutter提供的导航栏,NavigationBar,不过感觉使用起来不是很方便。
譬如说:

  1. 不能直接使用图片资源,需要中间加几层转换把图片转化成icon
  2. 文本大小及颜色不太好控制
  3. 状态栏的上边来一个横线也没有相应的样式,等等。

因此想来想去还是自己写一个吧。
效果如下:

flutter手写一个底部导航栏,flutter,flutter
控件代码如下:

import 'package:flutter/material.dart';
import 'dart:developer' as developer;

class XXNaviIcon {
  XXNaviIcon(
      {required this.normalImage,
      required this.selectedImage,
      required this.title});

  final String selectedImage;
  final String normalImage;
  final String title;
}

class XXNaviBar extends StatefulWidget {
  const XXNaviBar({super.key, required this.icons, this.onDestinationSelected})
      : currentIndex = 0;

  final List<XXNaviIcon> icons;
  final ValueChanged<int>? onDestinationSelected;
  final int currentIndex;

  
  State<XXNaviBar> createState() => _XXNaviBarState();
}

class _XXNaviBarState extends State<XXNaviBar> {
  int currentIndex = 0;

  
  Widget build(BuildContext context) {
    return SafeArea(
        child: SizedBox(
      height: 48,
      child: Container(
        decoration: const BoxDecoration(
            border:
                Border(top: BorderSide(width: 0.5, color: Color(0xffbbbbbb)))),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            for (int i = 0; i < widget.icons.length; i++)
              Expanded(
                  child: GestureDetector(
                onTap: () => {
                  developer.log("tap $i"),
                  setState(() {
                    currentIndex = i;
                  }),
                  if (widget.onDestinationSelected != null)
                    {widget.onDestinationSelected!(i)}
                },
                child: Container(
                  color: Colors.white,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Image.asset(
                        currentIndex == i
                            ? widget.icons[i].selectedImage
                            : widget.icons[i].normalImage,
                        height: 24,
                      ),
                      Text(
                        widget.icons[i].title,
                        style: const TextStyle(
                            fontSize: 10, fontWeight: FontWeight.bold),
                      ),
                    ],
                  ),
                ),
              ))
          ],
        ),
      ),
    ));
  }
}

使用方式如下:


  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      bottomNavigationBar: XXNaviBar(
        onDestinationSelected: (value) => {
          developer.log("click tab $value"),
          if (currentPageIndex != value)
            {
              setState(() {
                currentPageIndex = value;
              })
            }
        },
        icons: [
          XXNaviIcon(
            normalImage: "assets/images/tabbar/home.png",
            selectedImage: "assets/images/tabbar/home-selected.png",
            title: "首页",
          ),
          XXNaviIcon(
            normalImage: "assets/images/tabbar/data.png",
            selectedImage: "assets/images/tabbar/data-selected.png",
            title: "数据",
          ),
          XXNaviIcon(
            normalImage: "assets/images/tabbar/mine.png",
            selectedImage: "assets/images/tabbar/mine-selected.png",
            title: "我的",
          ),
        ],
      ),
      body: <Widget>[
        Container(
          color: Colors.white,
          alignment: Alignment.center,
          child: const Text('Page 1'),
        ),
        Container(
          color: Colors.white,
          alignment: Alignment.center,
          child: const Text('Page 2'),
        ),
        Container(
          color: Colors.white,
          alignment: Alignment.center,
          child: const Text('Page 3'),
        ),
      ][currentPageIndex],
    );
  }

定制化可以根据自己的实际需求自行更改。文章来源地址https://www.toymoban.com/news/detail-525749.html

到了这里,关于flutter手写一个底部导航栏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter笔记:手写并发布一个人机滑动验证码插件

    Flutter笔记 手写一个人机滑块验证码 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/133529459 写 Flutter 项目时,遇到需要滑块验证码功能。滑块验证码属于人机验证码的一种,看起来像是在一个图片

    2024年02月07日
    浏览(35)
  • uniapp隐藏底部导航栏(非自定义底部导航栏)

    uniapp官方网址:uni设置TabBar

    2024年02月12日
    浏览(35)
  • VSCode 底部蓝色导航栏介绍以及导航不见了解决

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用

    2024年02月11日
    浏览(59)
  • uniapp 设置底部导航栏

    uniapp 设置原生 tabBar 底部导航栏。 一、创建页面,一定要在 pages.json 文件中注册。  二、在 pages.json 文件中,设置 tabBar 配置项。 效果: 注 :在 list 中最少配置 2 个页面,最多 5 个页面,另外不能使用网络图片。 一、在任意页面中,调用 uni.setTabBadge 方法,设置指定页面的

    2024年02月01日
    浏览(34)
  • android中实现底部导航栏

            底部导航栏在app应用中是十分常见了,大部分的安卓应用中也都实现了底部导航栏的功能,这里我就以我以前做的一个简单小说阅读软件为例,为大家演示一下底部导航栏的使用,需要的朋友直接复制代码过去改写就行了。         这里包含了一些进行操作实际

    2024年02月19日
    浏览(44)
  • 安卓:BottomNavigationBar——底部导航栏控件

    目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 (一)、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项  5. 设置徽章  6. 样式和颜色定制 7. 动画效果  8. 隐藏底部导航栏。  9、设置模式 10.初始化 bottomNavigation  (二)、

    2024年02月08日
    浏览(37)
  • Android底部导航栏之BottomNavigationView

    1,首先需要添加依赖: implementation \\\'com.google.android.material:material:1.1.0\\\' 2,布局文件中引入: 3,常用属性: app:itemTextColor 文字的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconTint 图标的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconSize 图标大小,

    2024年02月08日
    浏览(72)
  • Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去找其他人的博文 1.创建对应的menu菜单文件 2.xml布局引用menu菜单 3.启动Activity预览效果 可以使用 setOnItemSelectedListener 方法监

    2024年02月12日
    浏览(51)
  • Android---DslTabLayout实现底部导航栏

    1. 在 Android 项目中引用 JitPack 库  AGP 8.+ 根目录的 settings.gradle  AGP 8.+ 根目录如果是  settings.gradle.kts 文件  AGP 8.- 根目录的 build.gradle 2. 添加依赖  在APP目录中的 build.gradle 3. 布局 activity_main.xml 4. 底部 tab_item.xml 布局 5. 每个底部 tab 对应的 fragment a. DiscoveryFragment b. fragment_dis

    2024年02月20日
    浏览(42)
  • 微信小程序自定义底部导航栏

    微信小程序自定义底部导航栏,原生实现,不包含其他任何第三方组件,比较干净,开箱即用 效果预览: 可自定义底部导航栏列表样式 可自定义每个菜单的默认、激活后的图标和文字样式 可自定义是否添加中间的大图标菜单,当然也可自定义大图标的默认与激活样式 可自

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包