flutter手写一个底部导航栏

news2024/11/17 1:53:06

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

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

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

在这里插入图片描述
控件代码如下:

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],
    );
  }

定制化可以根据自己的实际需求自行更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack&#xff0c;这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么&#xff1f;难道不是默默丢弃才对吗&#xff1f; 对 oow 报文回复 ack&#xff0c;岂不是把正确的 ack 号回过去了吗&#xff0c;这样攻击者盲打一番…

设计模式篇---建造者模式

文章目录 概念结构实例总结 概念 建造者模式的定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 这么看起来有点难以理解&#xff0c;翻译一下就是 用户无需关注创建复杂对象的过程&#xff0c;只需要指定创建的对象即…

一文带你了解云HIS

一、简介 基于云计算技术的B/S架构的HIS系统&#xff0c;为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准管理信息系统的功能。系统利用健康云计算平台的技术优势&#xff0c;建立统一的健康档案存储平台&am…

spark调试中常见的错误集锦

示例一、没有引入jar错误 错误描述&#xff1a; 以spark在pyspark环境解析xml为例 spark核心包不支持解析xml&#xff0c;所以需要引入引用依赖包配置为: config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") 在spark-submit部署提交…

ctfshow_反序化漏洞

web254 首先进行一个代码审计 <?php error_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwordxxxxxx;public $isVipfalse;public function checkVip(){return $this->isVip;}public function logi…

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程&#xff0c;解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响&#xff0c;每N分频&#xff0c;TIE RJ(1&#x1d70e;)不变(之前已推导)&#xff0c;而Period RJ(1&#x1d70e;)增加√N倍。

RecyclerView 实现WheelView和省市区多级联动

作者&#xff1a;丨小夕 前言 滚轮经常在选择中用到&#xff0c;主要包括类型选择、省市区联动选择、年月日联动选择等。 项目中的WheelView一般都是ScrollViewLinearLayout组合完成的。 但是自定义起来比较复杂&#xff0c;也有一些优秀的第三方库DateSelecter 通过Adapter…

直线导轨的技术应用

直线导轨是机械领域中使用广泛的一种构件&#xff0c;主要用于机器的移动和定位。它具有高精度、高刚性和耐磨损等优点&#xff0c;被广泛应用于工业制造、医疗设备、半导体设备等领域。现在&#xff0c;我们来详细了解一下直线导轨的技术应用。 1、移动装置&#xff0c;直线导…

二、Spring Cloud Eureka 简介、快速入门

注册发现中心 Eureka 来源于古希腊词汇&#xff0c;意为“发现了”。在软件领域&#xff0c; Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件&#xff0c;和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0…

基于灰狼优化算法的最小二乘支持向量机及其MATLAB实现

常用的预测方法有回归分析法、神经网络法、支持向量机(SVM, Support Vector Machine)等。回归分析法是建立影响因素与目标量之间的回归方程&#xff0c;建模过程简单&#xff0c;但预测精度较低。神经网络法适合分析大量非线性数据样本&#xff0c;挖掘其潜在规律&#xff0c;具…

流量玩家必看,微信问一问轻松获取200+引流秘籍

最近&#xff0c;微信推出了全新的“问一问”功能&#xff0c;为流量玩家带来了巨大的流量红利。这一新的流量入口势必成为流量玩家们追逐的热门目标。 “问一问”可以被视为一个问答型平台&#xff0c;可以简单理解为“微信版的知乎”。熟悉在知乎上进行问答引流的人都知道&am…

VVIC搜款网API接口:获取商品详情数据API

VVIC电商平台汇集了数千家优质品牌和供应商&#xff0c;包括服装、家居用品、电子产品、美妆产品、食品和饮料等各种商品。消费者可以在VVIC上找到各类品牌和产品&#xff0c;满足他们的购物需求。VVIC还提供了多种付款方式和物流配送服务&#xff0c;确保消费者的购物过程顺利…

BI-SQL丨WITH NOLOCK

WITH(NOLOCK) 企业在搭建数仓的时候&#xff0c;对于数仓的负载性能和运行速度都是纳入考量标准的。特别是并发性较高的情况下&#xff0c;如何规避因用户使用量较多而导致死锁卡死的问题呢&#xff1f;其实&#xff0c;这些可以通过WITH(NOLOCK)来解决。 WITH(NOLOCK)顾名思…

Mysql进阶(三)之索引篇

文章目录 前言索引介绍1.什么是索引&#xff1f;2.优缺点3.什么时候需要 / 不需要索引&#xff1f;4.语法 索引底层结构1.Hash表2.BTree 索引分类1.按字段特性2.按物理存储3.按字段个数 索引优化1.SQL性能分析2.索引失效3.常见索引优化方法 前言 以面试题驱动索引的学习&#…

go-zero的配置及gorm、自定义返回等的引入以及扩展

工程维度&#xff08;摘自官网&#xff09; . ├── consumer ├── go.mod ├── internal │ └── model ├── job ├── pkg ├── restful ├── script └── service consumer&#xff1a; 队列消费服务internal&#xff1a; 工程内部可访问的公共模块job&a…

MMYOLO框架标注、训练、测试全流程(补充篇)

前言 MMYOLO框架是一个基于PyTorch和MMDetection的YOLO系列算法开源工具箱。MMYOLO定位为YOLO系列热门开源库以及工业应用核心库&#xff0c;MMYOLO框架Github项目地址支持的任务&#xff1a;目标检测、旋转目标检测支持的算法&#xff1a;YOLOv5、YOLOX、RTMDet、RTMDet-Rota…

使用 okhttp3库发送 get、post(json参数传递,form表单提交) java代码实现

OkHttp是一个开源的HTTP客户端&#xff0c;由Square公司开发。OkHttp3是OkHttp库的最新版本。它提供了一个简单而强大的API来处理网络通信。以下是OkHttp3库的一些主要特点&#xff1a; 与Android平台完全兼容&#xff1a;OkHttp3可以与标准的Java库一起使用&#xff0c;也可以…

【前端】导航栏html(ul+li)/css/js(jq)

引入jq <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> css代码 <style>ul {list-style: none;margin: 0;padding: 0;}li {cursor: pointer;}.color-white {color: #FFFFFF !important;background-color: rgb…

git 报错 fatal: Authentication failed的解决

git提交代码的时候&#xff0c;报错 remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for informa…

三个好基友Cookie、Session和Token

原创声明&#xff0c;转载请注明文章链接来源、作者信息 >三个好基友Cookie、Session和Token hello&#xff0c;我是索奇~ 精心写了一篇Cookie、Session和Token的 vivid 文章&#xff0c;并分享给大家 我们可以把Cookie、Token和Session看作是三个好基友&#xff0c;它们…