flutter仿支付宝余额宝年化收益折线图

在这里插入图片描述

绘制:
1.在pubspec.yaml中引入:fl_chart: 0.55.2
2.绘制:

import 'package:jade/utils/JadeColors.dart';
import 'package:util/easy_loading_util.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';class MyLineChart extends StatefulWidget {const MyLineChart({Key key}) : super(key: key);State<MyLineChart> createState() => _MyLineChartState();
}class _MyLineChartState extends State<MyLineChart> with TickerProviderStateMixin{List<String> _tabs = ['近7日','近1月','近3月'];TabController _tabController;List<Color> gradientColors = [Colors.yellow,Colors.yellow,];//进入后默认显示指示竖线和轨迹球的点FlSpot _defaultShowFlSpot = FlSpot(8, 4);//进入页面时默认显示的点上的竖线显隐开关bool _showSpotLine = true;List<String> get weekDays => const ['10.21', '10.22', '10.23', '10.24', '10.25', '10.26', '10.27'];void initState() {// TODO: implement initStatesuper.initState();_tabController = TabController(length: _tabs.length,vsync: this);}void dispose() {// TODO: implement dispose_tabController.dispose();super.dispose();}Widget build(BuildContext context) {return Container(child: Column(children: <Widget>[_tabBarView(),_lineChartWidget()],),);}//选项卡_tabBarView(){return Container(width: double.infinity,height: 120.w,margin: EdgeInsets.only(bottom: 20.w),decoration: BoxDecoration(color: JadeColors.lightGrey,borderRadius: BorderRadius.circular(5)),child: Column(children: [Container(height: 70.w,child: TabBar(isScrollable: false,labelPadding: EdgeInsets.symmetric(horizontal: 0),indicator: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(5),border: Border.all(width: 2,color: JadeColors.lightGrey)),labelColor: Color(0xff333333),labelStyle: TextStyle(fontSize: 30.sp,fontWeight: FontWeight.w600,),unselectedLabelColor: JadeColors.grey,unselectedLabelStyle: TextStyle(fontSize: 30.sp,fontWeight: FontWeight.w300),indicatorSize: TabBarIndicatorSize.tab,controller: _tabController,tabs: _tabs.map((value) => Container(width: double.infinity,height: double.infinity,padding: EdgeInsets.symmetric(horizontal: 20.w),alignment: Alignment.center,decoration: BoxDecoration(borderRadius: BorderRadius.only(topLeft: value == _tabs.first? Radius.circular(5): Radius.circular(0),bottomLeft: value == _tabs.first? Radius.circular(5): Radius.circular(0),topRight: value == _tabs.last? Radius.circular(5): Radius.circular(0),bottomRight: value == _tabs.last? Radius.circular(5): Radius.circular(0),),border: Border.all(width: 1.w,color: JadeColors.grey_4)),child: Text(value))).toList(),onTap: (index) {esLoadingToast('点击${_tabs[index]}');},)),Expanded(child: Container(margin: EdgeInsets.only(left: 40.w,right: 40.w),child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [Text('2023-10-30',style: TextStyle(color: JadeColors.grey_2,fontSize: 22.sp,fontWeight: FontWeight.bold),),Text.rich(TextSpan(children: [TextSpan(text: '核销数:',style: TextStyle(color: JadeColors.grey_3,fontSize: 22.sp)),TextSpan(text: '5',style: TextStyle(color: JadeColors.orange,fontSize: 22.sp))]))],),))],),);}//折线图表_lineChartWidget(){return AspectRatio(aspectRatio: 1.70,child: Padding(padding: EdgeInsets.only(right: 40.w,),child: LineChart(mainData())),);}LineChartData mainData() {return LineChartData(//网格gridData: FlGridData(show: true,drawVerticalLine: false,horizontalInterval: 1,verticalInterval: 1,getDrawingHorizontalLine: (value) {return  FlLine(color: JadeColors.lightGrey,strokeWidth: 1,);},getDrawingVerticalLine: (value) {return  FlLine(color: Colors.red,strokeWidth: 1,);},),titlesData: FlTitlesData(show: true,rightTitles:  AxisTitles(sideTitles: SideTitles(showTitles: false),),topTitles:  AxisTitles(sideTitles: SideTitles(showTitles: false),),bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: true,reservedSize: 30,interval: 2,getTitlesWidget: bottomTitleWidgets,),),leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true,interval: 1,getTitlesWidget: leftTitleWidgets,reservedSize: 30,),),),borderData: FlBorderData(show: true,//  border: Border.symmetric(horizontal: BorderSide(color: JadeColors.lightGrey, width: 1)),border: Border.fromBorderSide( BorderSide(color: JadeColors.lightGrey, width: 1)),),minX: 0,maxX: 12,minY: 0,maxY: 6,lineBarsData: [LineChartBarData(spots: const [FlSpot(0, 0),FlSpot(2.6, 4),FlSpot(4.9, 5),FlSpot(6.8, 3.1),FlSpot(8, 4),FlSpot(9.5, 3),FlSpot(12, 6),],isCurved: false,gradient: LinearGradient(colors: gradientColors,),barWidth: 2,dotData:  FlDotData(show: _showSpotLine,getDotPainter: (spot, percent, barData, index) {//当点是默认要显示的点时if(spot == _defaultShowFlSpot){return FlDotCirclePainter(strokeWidth: 1,strokeColor: const Color(0xffF27800),radius: 2,color: Colors.white,);}return FlDotCirclePainter(strokeWidth: 0,strokeColor: Colors.yellow,radius: 1,color: Colors.yellow,);}),belowBarData: BarAreaData(show: true,gradient: LinearGradient(colors: [Colors.yellow,Colors.white].map((color) => color.withOpacity(0.3)).toList(),begin: Alignment.topCenter, end: Alignment.bottomCenter),spotsLine: BarAreaSpotsLine(show: _showSpotLine,flLineStyle: FlLine(color: const Color(0xffF27800),strokeWidth: 1,),checkToShowSpotLine: (spot) {if (spot == _defaultShowFlSpot) {return true;}return false;},),),aboveBarData: BarAreaData(show: _showSpotLine,gradient: LinearGradient(colors: [Colors.white,Colors.white].map((color) => color.withOpacity(0.3)).toList(),begin: Alignment.topCenter, end: Alignment.bottomCenter),spotsLine: BarAreaSpotsLine(show: true,flLineStyle: FlLine(color: const Color(0xffF27800),strokeWidth: 1,),checkToShowSpotLine: (spot) {if (spot == _defaultShowFlSpot) {return true;}return false;},),),),],lineTouchData: LineTouchData(enabled: true,getTouchLineEnd: (data, index) => double.infinity,getTouchedSpotIndicator: (LineChartBarData barData, List<int> spotIndexes) {return spotIndexes.map((spotIndex) {return TouchedSpotIndicatorData(//接触点竖线FlLine(color: const Color(0xffF27800), strokeWidth: 1),FlDotData(//设置接触点 轨迹球画笔getDotPainter: (spot, percent, barData, index) =>FlDotCirclePainter(strokeWidth: 1,strokeColor: const Color(0xffF27800),radius: 2,color: Colors.white,),),);}).toList();},touchTooltipData: LineTouchTooltipData(tooltipBgColor:Colors.black26),touchCallback: (FlTouchEvent event,LineTouchResponse response){if(event!= null){bool isInteractions = event.isInterestedForInteractions; //手指是否和图表交互(手指和图标交互时隐藏默认显示的点的指示线和轨迹球,手指离开时则隐藏)setState(() {_showSpotLine = !isInteractions;});}if(response != null){TouchLineBarSpot touchLineBarSpot = response?.lineBarSpots?.first;int spotIndex = touchLineBarSpot?.spotIndex;LineChartBarData lineChartBarData = touchLineBarSpot?.bar;if(lineChartBarData != null && spotIndex != null){FlSpot flSpot = lineChartBarData.spots[spotIndex];// print('spotIndex= ${touchLineBarSpot?.spotIndex}'); //接触的是折线的第几个圆点// print('barIndex= ${touchLineBarSpot?.barIndex}'); //接触的是第几条折线// print('flSpot.x= ${flSpot?.x}');print('flSpot.y= ${flSpot?.y}');// print('spotIndex= ${touchLineBarSpot?.props}');}}}));}Widget bottomTitleWidgets(double value, TitleMeta meta) {TextStyle style = TextStyle(fontWeight: FontWeight.w600,fontSize: 22.sp,);Widget text;switch (value.toInt()) {case 0:text = Text('10.25', style: style);break;case 2:text = Text(' 10.26 ', style: style);break;case 4:text = Text(' 10.27 ', style: style);break;case 6:text = Text(' 10.28 ', style: style);break;case 8:text = Text(' 10.29 ', style: style);break;case 10:text = Text(' 10.30 ', style: style);break;case 12:text = Text(' 10.31 ', style: style);break;default:text = Text('', style: style);break;}return SideTitleWidget(axisSide: meta.axisSide,child: text,);}Widget leftTitleWidgets(double value, TitleMeta meta) {TextStyle style = TextStyle(fontWeight: FontWeight.w600,fontSize: 22.sp,);String text;switch (value.toInt()) {case 0:text = '0';break;case 1:text = '2';break;case 2:text = '4';break;case 3:text = '6';break;case 4:text = '8';break;case 5:text = '10';break;default:return Container();}return Text(text, style: style, textAlign: TextAlign.center);}
}

切换的选项卡没有绘制。对应的数据和坐标点之间的换算没做,要根据后台给的数据操作,现在这个只是单纯的绘制。

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

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

相关文章

微服务实战系列之Sentinel

前言 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 近年来&#xff0c;微服务已赫然崛起于IT界&#xff0c;越来越多的程序员不得不向之靠拢。也正因为各行各业都愿为…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…

【Python基础篇】运算符

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的运算符二 算术运算符1 Python所有算术运算符的说明2 Python算术运算符的所有操作…

Mysql MMM

MMM概述 MMM(Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。 MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理MySQL Master-Master&#xff08;双主&#xff09;复制&…

YOLOv8改进 | DAttention (DAT)注意力机制实现极限涨点

论文地址&#xff1a; DAT论文地址 官方地址&#xff1a;官方代码的地址 代码地址&#xff1a;文末有修改了官方代码BUG的代码块复制粘贴即可 一、本文介绍 本文给大家带来的是YOLOv8改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022…

uniapp 手动调用form表单submit事件

背景&#xff1a; UI把提交的按钮弄成了图片&#xff0c;之前的button不能用了。 <button form-type"submit">搜索</button> 实现&#xff1a; html&#xff1a; 通过 this.$refs.fd 获取到form的vue对象。手动调用里面的_onSubmit()方法。 methods:…

MySQL内部组件与日志详解

MySQL的内部组件结构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&am…

Spring面试题:(八)Spring事务

Spring事务概述 Spring事务基于数据库&#xff0c;基于数据库的事务封装了统一的接口。 编程式事务和声明式事务。 声明式事务分为Xml声明式或者注解声明式 实现事务相关的三个类 事务管理器 事务定义 事务状态 XML声明式事务的使用方法 导入坐标配置目标类配置切面 导入…

【LeetCode刷题-双指针】--259.较小的三数之和

259.较小的三数之和 方法&#xff1a;排序双指针 class Solution {public int threeSumSmaller(int[] nums, int target) {Arrays.sort(nums);int k 0;for(int i 0;i<nums.length;i){int start i 1,end nums.length - 1;while(start < end){int sum nums[start] …

FPGA UDP RGMII 千兆以太网(4)ARP ICMP UDP

1 以太网帧 1.1 1以太网帧格式 下图为以太网的帧格式: 前导码(Preamble):8 字节,连续 7 个 8’h55 加 1 个 8’hd5,表示一个帧的开始,用于双方 设备数据的同步。 目的 MAC 地址:6 字节,存放目的设备的物理地址,即 MAC 地址 源 MAC 地址:6 字节,存放发送端设备的…

受电诱骗快充取电芯片XSP08:PD+QC+华为+三星多种协议9V12V15V20V

目前市面上很多家的快充充电器&#xff0c;都有自己的私有快充协议&#xff0c;如PD协议、QC协议、华为快充协议、三星快充协议、OPPO快充协议等待&#xff0c;为了让它们都能输出快充电压&#xff0c;就需要在受电端也增加快充协议取电芯片XSP08&#xff0c;它可以和充电器通讯…

Java学习 10.Java-类和对象

一、面向对象的初步认知 1.1 什么是面向对象 面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情&#xff0c;用面向对象的思想来设计程序&#xff0c;更符合人们对事物的认知&#xff0c;对于大型程序的设计、拓展以及维护都非常友好 1.2 面向对…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有&#xff0c;&#xff08;虽然字符串也是一种特殊的数组&#xff09; 但是&#xff0c;类似于这样的数组&#xff1a; int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}&#xff1b; 我们很难一眼…

决策树,sql考题,30个经典sql题目

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

Maven:通过相对路径向jar中添加依赖项

问&#xff1a;我有一个专有的jar&#xff0c;我想把它作为一个依赖项添加到我的pom中。 但我不想把它添加到存储库中。原因是我希望常用的maven命令(如mvn compile等)能够开箱即用。(无需要求开发人员自己将其添加到某个存储库中)。 我希望jar在源代码控制中的第三方库中&…

五分钟,Docker安装kafka 3.5,kafka-map图形化管理工具

首先确保已经安装docker&#xff0c;如果是windows安装docker&#xff0c;可参考 wsl2安装docker 1、安装zk docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:218…

【Proteus仿真】【51单片机】公交车报站系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。 主要功能&#xff1a; 系统运行后&…

比特币上的人工智能

以感知机为例 人工智能&#xff0c;尤其是机器学习形式的人工智能&#xff0c;最近取得了巨大的进步&#xff0c;应用范围从人脸识别到自动驾驶汽车。我们建议将 AI 与比特币区块链结合起来&#xff0c;以获得许多其他方式无法实现的显着优势&#xff1a; 公开透明&#xff1a…

高校教师资格证备考

高等教育制度 关于人的全面发展和个体发展的关系&#xff0c;说法正确的是&#xff08;ABC&#xff09;。 A.个体发展是在全面发展基础上的选择性发展 B.全面发展是个体发展的前提和基础 C.个体发展又是全面发展的动力 D.个体发展是全面发展的前提和基础

从0开始学习数据结构 C语言实现 1.前篇及二分查找算法

一、前篇 1、什么是数据结构&#xff1f; 数据结构是带有结构特性的数据元素的集合&#xff0c;它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系 2、时间复杂度与空间复杂度 大O符号是用于描述函数渐进行为的数学符号 常用函数的增长表 阶乘O(n!) > 指数…