From 83bc481abd5dbff7c409dd55f3b958c0156dcb9c Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 13 Jan 2022 13:48:10 +0800 Subject: [PATCH 01/20] migrate DoughuntChart to null safety --- .../brn_doughnut_chart.dart | 37 +++++++++---------- .../brn_doughnut_chart_legend.dart | 15 ++++---- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart.dart b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart.dart index 73259e70..30ea9fb9 100644 --- a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart.dart +++ b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'dart:math'; import 'package:flutter/material.dart'; @@ -29,25 +27,25 @@ class BrnDoughnutDataItem { double radius = 0; BrnDoughnutDataItem({ - this.value, - this.title, + required this.value, + required this.title, this.color = Colors.blueAccent, }); } /// 选中扇形区域后执行的回调 typedef BrnDoughnutSelectCallback = void Function( - BrnDoughnutDataItem selectedItem); + BrnDoughnutDataItem? selectedItem); class BrnDoughnut extends CustomPainter { ///圆心位置 - Offset circleCenter; + late Offset circleCenter; /// 选中的区域 - final BrnDoughnutDataItem selectedItem; + final BrnDoughnutDataItem? selectedItem; /// 选中区域回调 - final BrnDoughnutSelectCallback brnDoughnutSelectCallback; + final BrnDoughnutSelectCallback? brnDoughnutSelectCallback; /// 字体大小 final double fontSize; @@ -75,7 +73,7 @@ class BrnDoughnut extends CustomPainter { BrnDoughnut( {this.ringWidth = 50, - this.data, + required this.data, this.fontSize = 12, this.fontColor = Colors.white, this.selectedItem, @@ -83,10 +81,10 @@ class BrnDoughnut extends CustomPainter { this.brnDoughnutSelectCallback}) { double lastEndRadius = 0; double totalValue = 0; - this.data?.forEach((BrnDoughnutDataItem item) { + this.data.forEach((BrnDoughnutDataItem item) { totalValue += item.value; }); - this.data?.forEach((BrnDoughnutDataItem item) { + this.data.forEach((BrnDoughnutDataItem item) { item.percentage = item.value / totalValue; item.startRadius = lastEndRadius; item.radius = 2 * pi * item.percentage; @@ -110,7 +108,7 @@ class BrnDoughnut extends CustomPainter { Offset center = drawArea.center; circleCenter = center; - this.data?.forEach((BrnDoughnutDataItem item) { + this.data.forEach((BrnDoughnutDataItem item) { // 画扇形 Paint _paint = Paint() ..color = item.color @@ -126,9 +124,8 @@ class BrnDoughnut extends CustomPainter { canvas.drawArc(rect, item.startRadius, item.radius, true, _paint); // 画文本 - if (item.title != null && - (this.showTitleWhenSelected == false || - item.startRadius == selectedItem?.startRadius)) { + if (this.showTitleWhenSelected == false || + item.startRadius == selectedItem?.startRadius) { // 画引线 Offset indicarorLPoint = calcOffsetWith(item.middleRadius, indicatorLCircleRadius); @@ -230,7 +227,7 @@ class BrnDoughnut extends CustomPainter { } @override - bool hitTest(Offset position) { + bool? hitTest(Offset position) { int length = data.length; for (int i = 0; i < length; i++) { BrnDoughnutDataItem item = data[i]; @@ -238,7 +235,7 @@ class BrnDoughnut extends CustomPainter { if (item.startRadius < radain && radain < (item.startRadius + item.radius)) { if (null != brnDoughnutSelectCallback) - brnDoughnutSelectCallback( + brnDoughnutSelectCallback!( item.startRadius == selectedItem?.startRadius ? null : item); break; } @@ -270,10 +267,10 @@ class BrnDoughnutChart extends StatelessWidget { final double height; /// 选中的项目 - final BrnDoughnutDataItem selectedItem; + final BrnDoughnutDataItem? selectedItem; /// 选中项目时候的回掉 - final BrnDoughnutSelectCallback selectCallback; + final BrnDoughnutSelectCallback? selectCallback; /// 选中时展示文字大小,默认12 final double fontSize; @@ -298,7 +295,7 @@ class BrnDoughnutChart extends StatelessWidget { this.height = 0, this.padding = EdgeInsets.zero, this.ringWidth = 50, - this.data, + required this.data, this.fontSize = 12, this.fontColor = Colors.white, this.selectedItem, diff --git a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart index a669c690..e81384cd 100644 --- a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart +++ b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:bruno/src/components/charts/brn_doughunt_chart/brn_doughnut_chart.dart'; import 'package:flutter/material.dart'; @@ -26,21 +24,22 @@ class DoughnutChartLegend extends StatelessWidget { final List data; DoughnutChartLegend( - {this.legendStyle = BrnDoughnutChartLegendStyle.wrap, this.data}); + {this.legendStyle = BrnDoughnutChartLegendStyle.wrap, + required this.data}); @override Widget build(BuildContext context) { if (BrnDoughnutChartLegendStyle.list == this.legendStyle) { - List items = List(); - this.data?.forEach((BrnDoughnutDataItem item) { + List items = []; + this.data.forEach((BrnDoughnutDataItem item) { items.add(this.genItem(item)); }); return Column( children: items, ); } else if (BrnDoughnutChartLegendStyle.wrap == this.legendStyle) { - List items = List(); - this.data?.forEach((BrnDoughnutDataItem item) { + List items = []; + this.data.forEach((BrnDoughnutDataItem item) { items.add(this.genItem(item)); }); @@ -70,7 +69,7 @@ class DoughnutChartLegend extends StatelessWidget { width: 6, ), Text( - item.title ?? '', + item.title, style: TextStyle(color: Colors.black), ), ], From 8ed93f3567be217387c01c081308c79024a0fc1c Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 14 Jan 2022 14:11:22 +0800 Subject: [PATCH 02/20] migrate progress bar chart to null safety --- .../brn_bar_chart_data.dart | 24 ++- .../brn_progress_bar_chart.dart | 57 +++---- .../brn_progress_bar_chart_painter.dart | 151 +++++++++--------- 3 files changed, 104 insertions(+), 128 deletions(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_bar_chart_data.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_bar_chart_data.dart index 84cdd6b9..5cd4d015 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_bar_chart_data.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_bar_chart_data.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:flutter/material.dart'; import 'dart:ui' as ui; @@ -9,7 +7,7 @@ class BrnBarChartScaleStyle { /// y轴获取的值,只读 double get titleValue { - if (title == null || title.isEmpty) { + if (title.isEmpty) { return 0; } else { return double.parse(title); @@ -17,23 +15,23 @@ class BrnBarChartScaleStyle { } /// 刻度标志样式 - TextStyle titleStyle; + TextStyle? titleStyle; /// 与最大数值的比率,用来计算绘制刻度的位置使用。 - double positionRetioy; + double? positionRetioy; /// 下面标注文案独属y轴使用,目前还没有x轴扩展需求,x轴设置下面参数无效,后期有需要再扩展 /// 两个刻度之间的标注文案(向前绘制即x轴在该刻度左侧绘制,y轴在该刻度下面绘制),不需要的话不设置 - String centerSubTitle; + String? centerSubTitle; /// 标注文案样式,centerSubTitle有内容时有效 - TextStyle centerSubTextStyle; + TextStyle? centerSubTextStyle; /// 标注文案位置是否是在左侧,false表示在右侧,centerSubTitle有内容时有效 bool isLeft; BrnBarChartScaleStyle( - {this.title, + {required this.title, this.titleStyle, this.centerSubTitle, this.centerSubTextStyle, @@ -60,10 +58,10 @@ class BrnBarDataBean { /// 每条线的定义 class BrnBarBean { /// 名称 - String name; + String? name; ///x轴的字体样式 - TextStyle xTitleStyle; + TextStyle? xTitleStyle; ///是否显示x轴的文字,用来处理多个线条绘制的时候,同一x轴坐标不需要绘制多次,则只需要将多条线中一个标记绘制即可 bool isDrawX; @@ -78,19 +76,19 @@ class BrnBarBean { bool isCurve; ///点集合 - List points; + List? points; ///曲线或折线的颜色 Color lineColor; ///填充色 - List colors; + List? colors; ///占位图是否需要打断线条绘制,如果打断的话这个点的y值将没有意义,只有x轴有效,如果不打断的话,y轴值有效 bool placehoderImageBreak; ///用户当前进行位置的小图标(比如一个小锁),默认没有只显示y轴的值,如果有内容则显示这个小图标, - ui.Image placehoderImage; + ui.Image? placehoderImage; BrnBarBean( {this.name, this.xTitleStyle, diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart index 78de6165..798c3f26 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:bruno/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart'; import 'package:flutter/material.dart'; @@ -30,7 +28,7 @@ class BrnProgressBarChart extends StatefulWidget { final double singleBarWidth; /// 柱状图的最大值,柱状图的宽/高会依此值计算,默认 0 - final double barMaxValue; + final double? barMaxValue; /// 柱状图方向,默认 BarChartStyle.vertical final BarChartStyle barChartStyle; @@ -42,22 +40,22 @@ class BrnProgressBarChart extends StatefulWidget { final Color selectedHintTextBackgroundColor; /// 是否可点击回调 - final OnBarItemClickInterceptor onBarItemClickInterceptor; + final OnBarItemClickInterceptor? onBarItemClickInterceptor; /// 选中柱状图时候的回调 - final BrnProgressBarChartSelectCallback barChartSelectCallback; + final BrnProgressBarChartSelectCallback? barChartSelectCallback; /// 图表高度,竖直柱状图有效,默认300 final double height; BrnProgressBarChart( - {Key key, + {Key? key, this.minWidth = 0, this.padding = const EdgeInsets.all(20), this.barChartStyle = BarChartStyle.vertical, - this.xAxis, - this.yAxis, - this.barBundleList, + required this.xAxis, + required this.yAxis, + required this.barBundleList, this.barGroupSpace = 30, this.singleBarWidth = 30, this.barMaxValue, @@ -68,18 +66,10 @@ class BrnProgressBarChart extends StatefulWidget { this.height = 300}) : super(key: key) { if (BarChartStyle.horizontal == barChartStyle) { - assert(yAxis.axisItemList != null, '水平柱形图必须要有 Y 轴'); - assert(barBundleList != null && barBundleList.length != 0, '缺少柱形图数据'); - assert( - barBundleList[0].barList != null && - barBundleList[0].barList.length == yAxis.axisItemList.length, + assert(barBundleList[0].barList.length == yAxis.axisItemList.length, '水平柱状图个数与Y轴坐标数目要相等'); } else if (BarChartStyle.vertical == barChartStyle) { - assert(xAxis.axisItemList != null, '竖直柱形图必须要有 X 轴'); - assert(barBundleList != null && barBundleList.length != 0, '缺少柱形图数据'); - assert( - barBundleList[0].barList != null && - barBundleList[0].barList.length == xAxis.axisItemList.length, + assert(barBundleList[0].barList.length == xAxis.axisItemList.length, '竖直柱状图个数与X轴坐标数目要相等'); } assert(0 != this.barMaxValue, '柱状图最大值不能为0'); @@ -92,12 +82,9 @@ class BrnProgressBarChart extends StatefulWidget { } class BrnProgressBarChartState extends State { - BrnProgressBarItem _selectedBarItem; + BrnProgressBarItem? _selectedBarItem; Size chartSize() { - if (null == widget.barBundleList) { - return Size.zero; - } int barBundleCount = widget.barBundleList.length; int numberOfBars = widget.barBundleList[0].barList.length; if (BarChartStyle.horizontal == widget.barChartStyle) { @@ -106,8 +93,7 @@ class BrnProgressBarChartState extends State { numberOfBars; ///有 x 轴 需要加上 x 轴占用的高度 - if (null != widget.xAxis?.axisItemList && - 0 < widget.xAxis.axisItemList.length) { + if (widget.xAxis.axisItemList.isNotEmpty) { height += 22; } double width = MediaQuery.of(context).size.width; @@ -118,12 +104,11 @@ class BrnProgressBarChartState extends State { numberOfBars; /// 有 y 轴需要加上 y 轴占用的宽度 - if (null != widget.yAxis?.axisItemList && - 0 < widget.yAxis.axisItemList.length) { + if (widget.yAxis.axisItemList.isNotEmpty) { width += BrnProgressBarChartPainter.maxYAxisWidth(widget.yAxis); } - return Size(widget.minWidth > width ? widget.minWidth : width, - widget.height ?? 300); + return Size( + widget.minWidth > width ? widget.minWidth : width, widget.height); } else { return Size.zero; } @@ -136,10 +121,6 @@ class BrnProgressBarChartState extends State { } void clearSelectedBarItem(BrnProgressBarChart oldWidget) { - if (null == widget.barBundleList || null == widget.barBundleList) { - _selectedBarItem = null; - return; - } if (widget.barBundleList.length == oldWidget.barBundleList.length) { int bundleCount = widget.barBundleList.length; for (int bundleIndex = 0; bundleIndex < bundleCount; bundleIndex++) { @@ -172,8 +153,8 @@ class BrnProgressBarChartState extends State { @override Widget build(BuildContext context) { Size chartSize = this.chartSize(); - if (null == widget.barBundleList || chartSize == Size.zero) { - return Container(); + if (chartSize == Size.zero) { + return const SizedBox.shrink(); } if (BarChartStyle.vertical == widget.barChartStyle) { double yAxisWidth = @@ -218,9 +199,9 @@ class BrnProgressBarChartState extends State { selectedHintTextBackgroundColor: widget.selectedHintTextBackgroundColor, brnProgressBarChartSelectCallback: - (BrnProgressBarItem item) { + (BrnProgressBarItem? item) { if (null != widget.barChartSelectCallback) - widget.barChartSelectCallback(item); + widget.barChartSelectCallback!(item); setState(() { _selectedBarItem = item; }); @@ -248,7 +229,7 @@ class BrnProgressBarChartState extends State { ), ); } else { - return Container(); + return const SizedBox.shrink(); } } } diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart index 2b39827f..2ac29588 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:flutter/material.dart'; import 'package:path_drawing/path_drawing.dart'; @@ -12,7 +10,7 @@ typedef BarItemEnumeratorCallback = void Function( /// 点击柱状数据的回调 typedef BrnProgressBarChartSelectCallback = void Function( - BrnProgressBarItem barItem); + BrnProgressBarItem? barItem); /// 点击柱状数据的拦截器 typedef bool OnBarItemClickInterceptor( @@ -48,14 +46,13 @@ class AxisItem { final String showText; /// 文本大小 - Size textSize; - AxisItem({this.showText}); + late Size textSize; + AxisItem({required this.showText}); } /// ChartAxis 图表的坐标轴样式 /// 可对坐标轴的刻度样式、线条样式、偏移量等数据进行设置 class ChartAxis { - @required final List axisItemList; /// 是否有刻度 @@ -65,7 +62,7 @@ class ChartAxis { final AxisStyle axisStyle; /// 两个刻度间距 - double space; + double? space; double maxTextHeight = 0; double maxTextWidth = 0; @@ -74,8 +71,8 @@ class ChartAxis { TextStyle textStyle = TextStyle(color: Color(0x999999), fontSize: 12); ChartAxis({ - this.axisItemList = const [], - this.hasMark, + required this.axisItemList, + this.hasMark = true, this.axisStyle = AxisStyle.AxisStyleSolid, }); } @@ -87,30 +84,30 @@ const _showBarValueTextStyle = /// 可对数据的数值、展示文本、选中状态的文字以及柱形的样式进行设置 class BrnProgressBarItem { /// 柱状数据的描述文本 - final String text; + final String? text; /// 柱状数据的值 final double value; /// 柱状数据的参考值,展示在当前柱状图的后面 - final double hintValue; + final double? hintValue; ///选中时气泡文字 - final String selectedHintText; + final String? selectedHintText; /// 展示柱形的值 - final String showBarValueText; + final String? showBarValueText; /// 展示柱形值文本样式 final TextStyle showBarValueTextStyle; - double percentage; - double hintPercentage; - Rect barRect; - Rect barHintRect; - Offset barGroupAxisCenter; + late double percentage; + double? hintPercentage; + Rect? barRect; + Rect? barHintRect; + late Offset barGroupAxisCenter; BrnProgressBarItem( {this.text, - @required this.value, + required this.value, this.hintValue, this.selectedHintText, this.showBarValueText, @@ -127,7 +124,7 @@ class BrnProgressBarBundle { final List colors; final List hintColors; BrnProgressBarBundle( - {this.barList, + {required this.barList, this.colors = _defaultColor, this.hintColors = _defaultHintColor}); } @@ -136,7 +133,7 @@ class BrnProgressBarBundle { /// 根据参数对 x y 坐标轴以及柱状图进行绘制 class BrnProgressBarChartPainter extends CustomPainter { /// 柱状图的样式 - final BarChartStyle barChartStyle; + final BarChartStyle? barChartStyle; /// x轴 final ChartAxis xAxis; @@ -148,27 +145,27 @@ class BrnProgressBarChartPainter extends CustomPainter { final List barBundleList; /// 条形间距 - final double barGroupSpace; + final double? barGroupSpace; /// 单个柱形宽度 - final double singleBarWidth; + final double? singleBarWidth; /// 柱状图的最大值,柱状图的宽/高会依此值计算 - final double barMaxValue; + final double? barMaxValue; final bool drawX; final bool drawY; final bool drawBar; /// 是否可点击回调 - final OnBarItemClickInterceptor onBarItemClickInterceptor; + final OnBarItemClickInterceptor? onBarItemClickInterceptor; /// 选中柱状图时条形文案颜色 final Color selectedHintTextColor; /// 选中柱状图时条形文案背景颜色 final Color selectedHintTextBackgroundColor; - final BrnProgressBarItem selectedBarItem; - final BrnProgressBarChartSelectCallback brnProgressBarChartSelectCallback; + final BrnProgressBarItem? selectedBarItem; + final BrnProgressBarChartSelectCallback? brnProgressBarChartSelectCallback; Color unselectedColor = Color(0xffDAEDFE); @@ -182,7 +179,7 @@ class BrnProgressBarChartPainter extends CustomPainter { Rect yAxisRect = Rect.zero; /// 最大数据 - double maxValue = 0; + double? maxValue = 0; final double _yTextAxisSpace = 10; final double _yTextMaxWidth = 50; @@ -190,9 +187,9 @@ class BrnProgressBarChartPainter extends CustomPainter { BrnProgressBarChartPainter( {this.barChartStyle, - this.xAxis, - this.yAxis, - this.barBundleList, + required this.xAxis, + required this.yAxis, + required this.barBundleList, this.barGroupSpace, this.singleBarWidth, this.barMaxValue, @@ -218,7 +215,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } static double maxYAxisWidth(ChartAxis yAxis) { - Size getTextAreaSize(String text, TextStyle textStyle) { + Size getTextAreaSize(String? text, TextStyle textStyle) { TextPainter textPainter = TextPainter( text: TextSpan(text: text, style: textStyle), textDirection: TextDirection.ltr, @@ -284,7 +281,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } else { this.barBundleList.forEach((BrnProgressBarBundle barbundle) { barbundle.barList.forEach((BrnProgressBarItem barItem) { - if (barItem.value > this.maxValue) this.maxValue = barItem.value; + if (barItem.value > this.maxValue!) this.maxValue = barItem.value; }); }); } @@ -294,30 +291,30 @@ class BrnProgressBarChartPainter extends CustomPainter { int barBundleCount = this.barBundleList.length; this.barItemEnumerator((int barBundleIndex, BrnProgressBarBundle barBundle, int barGroupIndex, BrnProgressBarItem barItem) { - barItem.percentage = barItem.value / this.maxValue; + barItem.percentage = barItem.value / this.maxValue!; if (null != barItem.hintValue) { - barItem.hintPercentage = barItem.hintValue / this.maxValue; + barItem.hintPercentage = barItem.hintValue! / this.maxValue!; } if (BarChartStyle.horizontal == this.barChartStyle) { //水平方向的柱状图 Offset leftTop = Offset( this.yAxisRect.right, - (barBundleCount * this.singleBarWidth + this.barGroupSpace) * + (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * barGroupIndex + this.yAxis.leadingSpace); double width = this.contentRect.width * barItem.percentage; - double height = this.singleBarWidth; + double height = this.singleBarWidth!; Rect barRect = Rect.fromLTWH(leftTop.dx, leftTop.dy, width, height); barItem.barRect = barRect; // 条形组的坐标轴中间Offset,此处目前仅考虑有一组条形值的情况 - barItem.barGroupAxisCenter = barItem.barRect.centerLeft; + barItem.barGroupAxisCenter = barItem.barRect!.centerLeft; // BarHintRect if (null != barItem.hintPercentage) { - double hintWidth = this.contentRect.width * barItem.hintPercentage; + double hintWidth = this.contentRect.width * barItem.hintPercentage!; Rect barHintRect = Rect.fromLTWH(leftTop.dx, leftTop.dy, hintWidth, height); barItem.barHintRect = barHintRect; @@ -327,11 +324,11 @@ class BrnProgressBarChartPainter extends CustomPainter { Offset leftBottom = Offset( this.yAxisRect.width + this.xAxis.leadingSpace + - barBundleIndex * this.singleBarWidth + - (barBundleCount * this.singleBarWidth + this.barGroupSpace) * + barBundleIndex * this.singleBarWidth! + + (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * barGroupIndex, this.xAxisRect.top); - double width = this.singleBarWidth; + double width = this.singleBarWidth!; double height = this.contentRect.height * barItem.percentage; Rect barRect = Rect.fromLTWH(leftBottom.dx, leftBottom.dy - height, width, height); @@ -341,14 +338,14 @@ class BrnProgressBarChartPainter extends CustomPainter { barItem.barGroupAxisCenter = Offset( this.yAxisRect.width + this.xAxis.leadingSpace + - (barBundleCount * this.singleBarWidth + this.barGroupSpace) * + (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * barGroupIndex + - (barBundleCount * this.singleBarWidth) / 2, + (barBundleCount * this.singleBarWidth!) / 2, this.xAxisRect.top); // BarHintRect if (null != barItem.hintPercentage) { - double hintHeight = this.contentRect.height * barItem.hintPercentage; + double hintHeight = this.contentRect.height * barItem.hintPercentage!; Rect barHintRect = Rect.fromLTWH( leftBottom.dx, leftBottom.dy - hintHeight, width, hintHeight); barItem.barHintRect = barHintRect; @@ -377,7 +374,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } void _drawXAxisIn(Canvas canvas, Rect xAxisRect) { - if (0 == this.xAxis?.axisItemList?.length) return; + if (0 == this.xAxis.axisItemList.length) return; if (AxisStyle.AxisStyleSolid == this.xAxis.axisStyle) { Offset xLineStart = xAxisRect.topLeft; Offset xLineEnd = xAxisRect.topRight; @@ -414,7 +411,7 @@ class BrnProgressBarChartPainter extends CustomPainter { AxisItem axisItem = this.xAxis.axisItemList[xAxisItemIndex]; TextPainter textPainter = TextPainter( text: TextSpan( - text: axisItem.showText ?? '', + text: axisItem.showText, style: TextStyle(fontSize: 12, color: Color(0xff999999))), textDirection: TextDirection.ltr) ..layout(maxWidth: double.infinity, minWidth: 0); @@ -440,7 +437,7 @@ class BrnProgressBarChartPainter extends CustomPainter { AxisItem axisItem = this.xAxis.axisItemList[barGroupIndex]; TextPainter textPainter = TextPainter( text: TextSpan( - text: axisItem.showText ?? '', + text: axisItem.showText, style: TextStyle(fontSize: 12, color: Color(0xff999999))), textDirection: TextDirection.ltr) ..layout(maxWidth: double.infinity, minWidth: 0); @@ -457,7 +454,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } void _drawYAxisIn(Canvas canvas, Rect yAxisRect) { - if (0 == this.yAxis?.axisItemList?.length) return; + if (0 == this.yAxis.axisItemList.length) return; if (AxisStyle.AxisStyleSolid == this.yAxis.axisStyle) { Offset yLineStart = yAxisRect.bottomRight; Offset yLineEnd = yAxisRect.topRight; @@ -488,7 +485,7 @@ class BrnProgressBarChartPainter extends CustomPainter { height: textSize.height); TextPainter( text: TextSpan( - text: axisItem.showText ?? '', + text: axisItem.showText, style: TextStyle(fontSize: 12, color: Color(0xff999999))), textDirection: TextDirection.ltr) ..layout(maxWidth: double.infinity, minWidth: 0) @@ -516,7 +513,7 @@ class BrnProgressBarChartPainter extends CustomPainter { height: textSize.height); TextPainter( text: TextSpan( - text: axisItem.showText ?? '', + text: axisItem.showText, style: TextStyle(fontSize: 12, color: Color(0xff999999))), textDirection: TextDirection.ltr) ..layout(maxWidth: double.infinity, minWidth: 0) @@ -558,7 +555,7 @@ class BrnProgressBarChartPainter extends CustomPainter { end: Alignment.topCenter, tileMode: TileMode.clamp, colors: barBundle.hintColors) - .createShader(barItem.barHintRect); + .createShader(barItem.barHintRect!); Paint hintBarPaint = Paint() ..shader = hintShader @@ -567,22 +564,22 @@ class BrnProgressBarChartPainter extends CustomPainter { ..strokeWidth = 1.5 ..style = PaintingStyle.fill; - canvas.drawRect(barItem.barHintRect, hintBarPaint); + canvas.drawRect(barItem.barHintRect!, hintBarPaint); } - RRect barRRect = RRect.fromRectAndCorners(barItem.barRect, + RRect barRRect = RRect.fromRectAndCorners(barItem.barRect!, topRight: Radius.circular(4), topLeft: Radius.circular(4)); if (this.selectedBarItem != null) { // 有选中的柱形,选中柱形保持原样,未选中的置灰 Shader shader; - if (this.selectedBarItem.barRect == barItem.barRect) { + if (this.selectedBarItem!.barRect == barItem.barRect) { // 选中的柱形 shader = LinearGradient( begin: Alignment.bottomCenter, end: Alignment.topCenter, tileMode: TileMode.clamp, colors: barBundle.colors) - .createShader(barItem.barRect); + .createShader(barItem.barRect!); } else { // 未选中需要置灰的柱形 shader = LinearGradient( @@ -590,7 +587,7 @@ class BrnProgressBarChartPainter extends CustomPainter { end: Alignment.topCenter, tileMode: TileMode.clamp, colors: [this.unselectedColor, this.unselectedColor]) - .createShader(barItem.barRect); + .createShader(barItem.barRect!); } Paint barPaint = Paint() ..shader = shader @@ -599,10 +596,10 @@ class BrnProgressBarChartPainter extends CustomPainter { ..strokeWidth = 1.5 ..style = PaintingStyle.fill; canvas.drawRRect(barRRect, barPaint); - if (this.selectedBarItem.barRect == barItem.barRect) { + if (this.selectedBarItem!.barRect == barItem.barRect) { // 选中柱形的虚线以及 HintText - this._drawDashLineOn(canvas, barItem.barRect.bottomCenter, - Offset(barItem.barRect.bottomCenter.dx, 0), Color(0xff222222)); + this._drawDashLineOn(canvas, barItem.barRect!.bottomCenter, + Offset(barItem.barRect!.bottomCenter.dx, 0), Color(0xff222222)); } } else { Shader shader = LinearGradient( @@ -610,7 +607,7 @@ class BrnProgressBarChartPainter extends CustomPainter { end: Alignment.topCenter, tileMode: TileMode.clamp, colors: barBundle.colors) - .createShader(barItem.barRect); + .createShader(barItem.barRect!); Paint barPaint = Paint() ..shader = shader ..isAntiAlias = true @@ -634,8 +631,8 @@ class BrnProgressBarChartPainter extends CustomPainter { ..layout(maxWidth: double.infinity, minWidth: 0); double textWidth = textPainter.size.width; double textHeight = textPainter.size.height; - Offset textOffset = Offset(barItem.barRect.center.dx - textWidth / 2, - barItem.barRect.top - textHeight - 2); + Offset textOffset = Offset(barItem.barRect!.center.dx - textWidth / 2, + barItem.barRect!.top - textHeight - 2); textPainter.paint(canvas, textOffset); } }); @@ -645,8 +642,8 @@ class BrnProgressBarChartPainter extends CustomPainter { // 画选中文字 Start TextPainter selectedBarTextPainter = TextPainter( text: TextSpan( - text: selectedBarItem.selectedHintText ?? - (selectedBarItem.text ?? ''), + text: selectedBarItem!.selectedHintText ?? + (selectedBarItem!.text ?? ''), style: TextStyle(fontSize: 12, color: this.selectedHintTextColor)), textDirection: TextDirection.ltr) @@ -655,16 +652,16 @@ class BrnProgressBarChartPainter extends CustomPainter { double textHeight = selectedBarTextPainter.size.height; Offset selectedBarTextBgCenterOffset; - if (selectedBarItem.barRect.bottomCenter.dx + 10 + textWidth + 10 * 2 > + if (selectedBarItem!.barRect!.bottomCenter.dx + 10 + textWidth + 10 * 2 > this.contentRect.right) { // 需要显示在左侧 selectedBarTextBgCenterOffset = Offset( - selectedBarItem.barRect.bottomCenter.dx - 10 - 10 - textWidth / 2, + selectedBarItem!.barRect!.bottomCenter.dx - 10 - 10 - textWidth / 2, 16.0 + 16.0); } else { // 需要显示在右侧 selectedBarTextBgCenterOffset = Offset( - selectedBarItem.barRect.bottomCenter.dx + 10 + 10 + textWidth / 2, + selectedBarItem!.barRect!.bottomCenter.dx + 10 + 10 + textWidth / 2, 16.0 + 16.0); } @@ -704,7 +701,7 @@ class BrnProgressBarChartPainter extends CustomPainter { end: Alignment.centerRight, tileMode: TileMode.clamp, colors: barBundle.hintColors) - .createShader(barItem.barHintRect); + .createShader(barItem.barHintRect!); Paint hintBarPaint = Paint() ..shader = hintShader ..isAntiAlias = true @@ -712,11 +709,11 @@ class BrnProgressBarChartPainter extends CustomPainter { ..strokeWidth = 1.5 ..style = PaintingStyle.fill; - canvas.drawRect(barItem.barHintRect, hintBarPaint); + canvas.drawRect(barItem.barHintRect!, hintBarPaint); } // 绘制柱状图形 - RRect barRRect = RRect.fromRectAndCorners(barItem.barRect, + RRect barRRect = RRect.fromRectAndCorners(barItem.barRect!, topRight: Radius.circular(4), bottomRight: Radius.circular(4)); Shader shader = LinearGradient( @@ -724,7 +721,7 @@ class BrnProgressBarChartPainter extends CustomPainter { end: Alignment.centerRight, tileMode: TileMode.clamp, colors: barBundle.colors) - .createShader(barItem.barRect); + .createShader(barItem.barRect!); Paint barPaint = Paint() ..shader = shader ..isAntiAlias = true @@ -752,7 +749,7 @@ class BrnProgressBarChartPainter extends CustomPainter { }); } - Size getTextAreaSize(String text, TextStyle textStyle) { + Size getTextAreaSize(String? text, TextStyle textStyle) { TextPainter textPainter = TextPainter( text: TextSpan(text: text, style: textStyle), textDirection: TextDirection.ltr, @@ -766,7 +763,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } @override - bool hitTest(Offset position) { + bool? hitTest(Offset position) { if (this.brnProgressBarChartSelectCallback != null && BarChartStyle.vertical == this.barChartStyle) { this.barItemEnumerator((int barBundleIndex, @@ -774,12 +771,12 @@ class BrnProgressBarChartPainter extends CustomPainter { int barGroupIndex, BrnProgressBarItem barItem) { if (this.brnProgressBarChartSelectCallback != null && - barItem.barRect.contains(position)) { + barItem.barRect!.contains(position)) { if (this.onBarItemClickInterceptor == null || true == - this.onBarItemClickInterceptor( + this.onBarItemClickInterceptor!( barBundleIndex, barBundle, barGroupIndex, barItem)) { - this.brnProgressBarChartSelectCallback( + this.brnProgressBarChartSelectCallback!( barItem.barRect == this.selectedBarItem?.barRect ? null : barItem); From 153f49db883896be784d50d3667ad4395cc6e270 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 14 Jan 2022 18:13:54 +0800 Subject: [PATCH 03/20] update progress bar chart document --- .../charts/brn_progress_bar_chart/brn_progress_bar_chart.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart index 798c3f26..7645ba04 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart @@ -42,7 +42,7 @@ class BrnProgressBarChart extends StatefulWidget { /// 是否可点击回调 final OnBarItemClickInterceptor? onBarItemClickInterceptor; - /// 选中柱状图时候的回调 + /// 选中柱状图时候的回调(暂仅支持垂直柱状图) final BrnProgressBarChartSelectCallback? barChartSelectCallback; /// 图表高度,竖直柱状图有效,默认300 From aadae167e2be2487623d5655d520d9ade45cc492 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Sat, 15 Jan 2022 09:55:56 +0800 Subject: [PATCH 04/20] migrate progress chart to null safety --- .../brn_progress_chart/brn_progress_chart.dart | 16 ++++++++-------- .../brn_progress_chart_painter.dart | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/src/components/charts/brn_progress_chart/brn_progress_chart.dart b/lib/src/components/charts/brn_progress_chart/brn_progress_chart.dart index fb7e0b16..30a27266 100644 --- a/lib/src/components/charts/brn_progress_chart/brn_progress_chart.dart +++ b/lib/src/components/charts/brn_progress_chart/brn_progress_chart.dart @@ -1,4 +1,4 @@ -// @dart=2.9 + import 'package:bruno/src/components/charts/brn_progress_chart/brn_progress_chart_painter.dart'; import 'package:flutter/material.dart'; @@ -25,7 +25,7 @@ class BrnProgressChart extends StatefulWidget { final TextStyle textStyle; /// 自定义进度条上面的Widget,默认显示为文本 - final BrnProgressIndicatorBuilder brnProgressIndicatorBuilder; + final BrnProgressIndicatorBuilder? brnProgressIndicatorBuilder; /// 背景色,默认 Colors.lightBlueAccent final Color backgroundColor; @@ -37,7 +37,7 @@ class BrnProgressChart extends StatefulWidget { final bool showAnimation; const BrnProgressChart( - {Key key, + {Key? key, this.width = 0, this.height = 0, this.value = 0.2, @@ -58,8 +58,8 @@ class BrnProgressChart extends StatefulWidget { class BrnProgressChartState extends State with SingleTickerProviderStateMixin { - Animation _animation; - AnimationController _animationController; + late Animation _animation; + AnimationController? _animationController; double _value = 0; @override @@ -69,13 +69,13 @@ class BrnProgressChartState extends State _animationController = AnimationController( vsync: this, duration: Duration(milliseconds: 250)); Tween tween = Tween(begin: 0, end: widget.value); - _animation = tween.animate(_animationController); + _animation = tween.animate(_animationController!) as Animation; _animation.addListener(() { setState(() { _value = _animation.value; }); }); - _animationController.forward(); + _animationController!.forward(); } else { _value = widget.value; } @@ -108,7 +108,7 @@ class BrnProgressChartState extends State padding: EdgeInsets.only(left: widget.indicatorLeftPadding), alignment: Alignment.centerLeft, child: null != widget.brnProgressIndicatorBuilder - ? widget.brnProgressIndicatorBuilder(context, _value) + ? widget.brnProgressIndicatorBuilder!(context, _value) : _indicatorWidgetBuilder(context, _value), ) ], diff --git a/lib/src/components/charts/brn_progress_chart/brn_progress_chart_painter.dart b/lib/src/components/charts/brn_progress_chart/brn_progress_chart_painter.dart index babd3f1e..396e6981 100644 --- a/lib/src/components/charts/brn_progress_chart/brn_progress_chart_painter.dart +++ b/lib/src/components/charts/brn_progress_chart/brn_progress_chart_painter.dart @@ -1,4 +1,4 @@ -// @dart=2.9 + import 'package:flutter/material.dart'; From dc49a9a9c3b3a337d2c857e59bd2b87c10f46a27 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Sat, 15 Jan 2022 12:46:49 +0800 Subject: [PATCH 05/20] migrate radar chart to null safety --- lib/src/components/charts/radar_chart.dart | 289 ++++++++++----------- 1 file changed, 140 insertions(+), 149 deletions(-) diff --git a/lib/src/components/charts/radar_chart.dart b/lib/src/components/charts/radar_chart.dart index 21888cbd..6e90ebca 100644 --- a/lib/src/components/charts/radar_chart.dart +++ b/lib/src/components/charts/radar_chart.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'dart:math'; import 'package:flutter/material.dart'; @@ -46,7 +44,7 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { final double rotateAngle; ///每个标注文案的偏移量,必须和 [sidesCount] 保持一致。 - final List offset; + final List? offset; ///The default preset chart styles ordered in priority of usage. static const List defaultRadarChartStyles = [ @@ -89,9 +87,9 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { ]; BrnRadarChart({ - Key key, - @required this.provider, - @required MarkerBuilder builder, + Key? key, + required this.provider, + required MarkerBuilder builder, this.radius = 50, this.levelCount = 3, this.maxValue = 10, @@ -103,14 +101,12 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { this.crossedAxisLine = false, this.animateProgress = 1.0, this.rotateAngle = 0, - }) : assert(sidesCount != null), - assert(minValue < maxValue), + }) : assert(minValue < maxValue), assert(sidesCount >= 3), - assert(provider != null && builder != null), super( key: key, children: () { - List children = List(); + List children = []; for (int i = 0; i < sidesCount; i++) { children.add(builder(i)); } @@ -121,7 +117,7 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { ///The [data] length should be less than the [defaultRadarChartStyles]'s length ///or you should use the default constructor. BrnRadarChart.defaultStyle({ - Key key, + Key? key, this.radius = 50, this.levelCount = 3, this.maxValue = 10, @@ -131,11 +127,9 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { this.rotateAngle = 0, this.crossedAxisLine = false, this.offset, - @required List tagNames, - @required List> data, - }) : assert(sidesCount != null && sidesCount >= 3), - assert(tagNames != null), - assert(data != null), + required List tagNames, + required List> data, + }) : assert(sidesCount >= 3), assert(tagNames.length == sidesCount), assert(minValue < maxValue), assert(data.length <= defaultRadarChartStyles.length), @@ -145,7 +139,7 @@ class BrnRadarChart extends MultiChildRenderObjectWidget { super( key: key, children: () { - List children = List(); + List children = []; for (int i = 0; i < sidesCount; i++) { children.add(Container( constraints: BoxConstraints( @@ -213,30 +207,30 @@ class RenderRadarChart extends RenderBox Offset _overflowOffset = Offset.zero; Offset _centerOffset = Offset.zero; - double _radius; - double _markerMargin; - int _sideCount; - double _maxValue; - int _levelCount; - Color _axisLineColor; - bool _crossedAxiLine; - double _rotateAngle; - List _offset; + double? _radius; + double? _markerMargin; + int? _sideCount; + double? _maxValue; + int? _levelCount; + Color? _axisLineColor; + bool? _crossedAxiLine; + double? _rotateAngle; + List? _offset; - BrnRadarChartDataProvider _dataProvider; + BrnRadarChartDataProvider? _dataProvider; RenderRadarChart({ - double radius, - double markerMargin, - int sideCount, - double maxValue, - double rotateAngle, - List offset, - BrnRadarChartDataProvider provider, - int levelCount, - Color axisLineColor, - bool crossedAxisLine, - double animateProgress, + double? radius, + double? markerMargin, + int? sideCount, + double? maxValue, + double? rotateAngle, + List? offset, + BrnRadarChartDataProvider? provider, + int? levelCount, + Color? axisLineColor, + bool? crossedAxisLine, + double? animateProgress, }) : _radius = radius, _markerMargin = markerMargin, _maxValue = maxValue, @@ -253,91 +247,91 @@ class RenderRadarChart extends RenderBox _animateProgress = animateProgress, _sideCount = sideCount; - double _animateProgress; + double? _animateProgress; - double get animateProgress => _animateProgress; + double? get animateProgress => _animateProgress; - set animateProgress(double value) { + set animateProgress(double? value) { if (value == _animateProgress) return; _animateProgress = value; markNeedsPaint(); } - double get radius => _radius; + double? get radius => _radius; - set radius(double value) { + set radius(double? value) { if (value == _radius) return; _radius = value; markNeedsLayout(); } - double get markerMargin => _markerMargin; + double? get markerMargin => _markerMargin; - set markerMargin(double value) { + set markerMargin(double? value) { if (value == _markerMargin) return; _markerMargin = value; markNeedsLayout(); } - int get sideCount => _sideCount; + int? get sideCount => _sideCount; - set sideCount(int value) { + set sideCount(int? value) { if (value == _sideCount) return; _sideCount = value; markNeedsLayout(); } - double get maxValue => _maxValue; + double? get maxValue => _maxValue; - set maxValue(double value) { + set maxValue(double? value) { if (value == _maxValue) return; _maxValue = value; markNeedsPaint(); } - int get levelCount => _levelCount; + int? get levelCount => _levelCount; - set levelCount(int value) { + set levelCount(int? value) { if (value == _levelCount) return; _levelCount = value; markNeedsPaint(); } - BrnRadarChartDataProvider get dataProvider => _dataProvider; + BrnRadarChartDataProvider? get dataProvider => _dataProvider; - set dataProvider(BrnRadarChartDataProvider value) { + set dataProvider(BrnRadarChartDataProvider? value) { if (value == _dataProvider) return; _dataProvider = value; markNeedsPaint(); } - Color get axisLineColor => _axisLineColor; + Color? get axisLineColor => _axisLineColor; - set axisLineColor(Color value) { + set axisLineColor(Color? value) { if (value == _axisLineColor) return; _axisLineColor = value; markNeedsPaint(); } - double get rotateAngle => _rotateAngle; + double? get rotateAngle => _rotateAngle; - set rotateAngle(double value) { + set rotateAngle(double? value) { if (value == _rotateAngle) return; _rotateAngle = value; markNeedsLayout(); } - List get offset => _offset; + List? get offset => _offset; - set offset(List value) { + set offset(List? value) { if (value == _offset) return; _offset = value; markNeedsLayout(); } - bool get crossedAxisLine => _crossedAxiLine; + bool? get crossedAxisLine => _crossedAxiLine; - set crossedAxisLine(bool value) { + set crossedAxisLine(bool? value) { if (value == _crossedAxiLine) return; _crossedAxiLine = value; markNeedsPaint(); @@ -353,29 +347,30 @@ class RenderRadarChart extends RenderBox double mainChildSizeGetter(RenderBox child)) { double x; double maxX = 0, minX = 0; - RenderBox child = firstChild; + RenderBox? child = firstChild; //多边形的中心为原点 int i = 0; while (child != null) { - final BrnRadarChartParentData childParentData = child.parentData; - double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); - x = _radius * sin(angle); + final BrnRadarChartParentData childParentData = + child.parentData as BrnRadarChartParentData; + double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); + x = _radius! * sin(angle); if (x >= 0) { if (angle == 0 || angle == pi) { x = x + mainChildSizeGetter(child) / 2; } else if (angle == pi / 2) { - x = x + _markerMargin + mainChildSizeGetter(child); + x = x + _markerMargin! + mainChildSizeGetter(child); } else { - x = x + mainChildSizeGetter(child) + _markerMargin * sin(angle); + x = x + mainChildSizeGetter(child) + _markerMargin! * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = x - _markerMargin - mainChildSizeGetter(child); + x = x - _markerMargin! - mainChildSizeGetter(child); } else { - x = x - mainChildSizeGetter(child) + _markerMargin * sin(angle); + x = x - mainChildSizeGetter(child) + _markerMargin! * sin(angle); } } - x = x + _offset[i].dx; + x = x + _offset![i].dx; minX = min(x, minX); maxX = max(x, maxX); child = childParentData.nextSibling; @@ -387,32 +382,33 @@ class RenderRadarChart extends RenderBox double mainChildSizeGetter(RenderBox child)) { double y; double maxY = 0, minY = 0; - RenderBox child = firstChild; + RenderBox? child = firstChild; //多边形的中心为原点 int i = 0; while (child != null) { - final BrnRadarChartParentData childParentData = child.parentData; - double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); - y = _radius * cos(angle); + final BrnRadarChartParentData childParentData = + child.parentData as BrnRadarChartParentData; + double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); + y = _radius! * cos(angle); if (y >= 0) { if (angle == 0) { - y = y + mainChildSizeGetter(child) + _markerMargin; + y = y + mainChildSizeGetter(child) + _markerMargin!; } else if (angle == pi / 2) { y = y + mainChildSizeGetter(child) / 2; } else { - y = y + mainChildSizeGetter(child) + _markerMargin * cos(angle); + y = y + mainChildSizeGetter(child) + _markerMargin! * cos(angle); } } else { if (angle == pi) { - y = y - mainChildSizeGetter(child) - _markerMargin; + y = y - mainChildSizeGetter(child) - _markerMargin!; } else if (angle == pi * 3 / 2) { y = y - mainChildSizeGetter(child) / 2; } else { - y = y - mainChildSizeGetter(child) + _markerMargin * cos(angle); + y = y - mainChildSizeGetter(child) + _markerMargin! * cos(angle); } } - y = y + _offset[i].dy; + y = y + _offset![i].dy; minY = min(y, minY); maxY = max(y, maxY); child = childParentData.nextSibling; @@ -445,7 +441,7 @@ class RenderRadarChart extends RenderBox } @override - double computeDistanceToActualBaseline(TextBaseline baseline) { + double? computeDistanceToActualBaseline(TextBaseline baseline) { return defaultComputeDistanceToHighestActualBaseline(baseline); } @@ -455,52 +451,53 @@ class RenderRadarChart extends RenderBox double x, y; double maxX = 0, minX = 0; double maxY = 0, minY = 0; - RenderBox child = firstChild; + RenderBox? child = firstChild; //多边形的中心为原点 int i = 0; while (child != null) { - final BrnRadarChartParentData childParentData = child.parentData; + final BrnRadarChartParentData childParentData = + child.parentData as BrnRadarChartParentData; BoxConstraints childConstraints = constraints.loosen(); child.layout(childConstraints, parentUsesSize: true); final Size childSize = child.size; - double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); - x = _radius * sin(angle); - y = _radius * cos(angle); + double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); + x = _radius! * sin(angle); + y = _radius! * cos(angle); if (y >= 0) { if (angle == 0) { - y = y + childSize.height + _markerMargin * cos(angle); + y = y + childSize.height + _markerMargin! * cos(angle); } else if (angle == pi / 2) { y = y + childSize.height / 2; } else { - y = y + childSize.height + _markerMargin * cos(angle); + y = y + childSize.height + _markerMargin! * cos(angle); } } else { if (angle == pi) { - y = y - childSize.height + _markerMargin * cos(angle); + y = y - childSize.height + _markerMargin! * cos(angle); } else if (angle == pi * 3 / 2) { y = y - child.size.height / 2; } else { - y = y - childSize.height + _markerMargin * cos(angle); + y = y - childSize.height + _markerMargin! * cos(angle); } } - y = y + _offset[i].dy; + y = y + _offset![i].dy; if (x >= 0) { if (angle == 0 || angle == pi) { x = x + child.size.width / 2; } else if (angle == pi / 2) { - x = x + _markerMargin + childSize.width; + x = x + _markerMargin! + childSize.width; } else { - x = x + childSize.width + _markerMargin * sin(angle); + x = x + childSize.width + _markerMargin! * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = x - _markerMargin - child.size.width; + x = x - _markerMargin! - child.size.width; } else { - x = x - childSize.width + _markerMargin * sin(angle); + x = x - childSize.width + _markerMargin! * sin(angle); } } - x = x + _offset[i].dx; + x = x + _offset![i].dx; minX = min(x, minX); maxX = max(x, maxX); minY = min(y, minY); @@ -525,30 +522,31 @@ class RenderRadarChart extends RenderBox child = firstChild; i = 0; while (child != null) { - double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); - double x = _radius * sin(angle); //在以多边形中心为原点的坐标 - double y = _radius * cos(angle); //在以多边形中心为原点的坐标 - final BrnRadarChartParentData childParentData = child.parentData; + double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); + double x = _radius! * sin(angle); //在以多边形中心为原点的坐标 + double y = _radius! * cos(angle); //在以多边形中心为原点的坐标 + final BrnRadarChartParentData childParentData = + child.parentData as BrnRadarChartParentData; //转换到左上角为原点中的坐标 if (y >= 0) { if (angle == 0) { - y = size.height / 2 - y - child.size.height - _markerMargin; + y = size.height / 2 - y - child.size.height - _markerMargin!; } else if (angle == pi / 2) { y = size.height / 2 - y - child.size.height / 2; } else { y = size.height / 2 - y - child.size.height - - _markerMargin * cos(angle); + _markerMargin! * cos(angle); } } else { if (angle == pi) { - y = size.height / 2 - y + _markerMargin; + y = size.height / 2 - y + _markerMargin!; } else if (angle == pi * 3 / 2) { y = size.height / 2 - y - child.size.height / 2; } else { - y = size.height / 2 - y - _markerMargin * cos(angle); + y = size.height / 2 - y - _markerMargin! * cos(angle); } } @@ -556,28 +554,28 @@ class RenderRadarChart extends RenderBox if (angle == 0 || angle == pi) { x = size.width / 2 + x - child.size.width / 2; } else if (angle == pi / 2) { - x = size.width / 2 + x + _markerMargin; + x = size.width / 2 + x + _markerMargin!; } else { - x = size.width / 2 + x + _markerMargin * sin(angle); + x = size.width / 2 + x + _markerMargin! * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = size.width / 2 + x - _markerMargin - child.size.width; + x = size.width / 2 + x - _markerMargin! - child.size.width; } else { x = size.width / 2 + x - child.size.width + - _markerMargin * sin(angle); + _markerMargin! * sin(angle); } } - childParentData.offset = Offset(x, y) + _offset[i] + _centerOffset; + childParentData.offset = Offset(x, y) + _offset![i] + _centerOffset; child = childParentData.nextSibling; i++; } } @override - bool hitTestChildren(BoxHitTestResult result, {Offset position}) { + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { return defaultHitTestChildren(result, position: position); } @@ -594,9 +592,9 @@ class RenderRadarChart extends RenderBox double translateX = rect.width / 2; double translateY = rect.height / 2; //translate the canvas's top left to widget'center since flutter canvas rotate pivot can only be the top left. - canvas.translate(translateX + _centerOffset?.dx ?? 0, - translateY + _centerOffset?.dy ?? 0); - canvas.rotate(_rotateAngle); + canvas.translate( + translateX + _centerOffset.dx, translateY + _centerOffset.dy); + canvas.rotate(_rotateAngle!); _drawBackground(canvas, rect.size, translateX, translateY); _drawRadar(canvas); canvas.restore(); @@ -616,18 +614,18 @@ class RenderRadarChart extends RenderBox double translateX, double translateY, ) { - _axisPainter..color = _axisLineColor; + _axisPainter..color = _axisLineColor!; _axisPainter..strokeWidth = 0.5; //calculate the side length of polygon. - double centralAngle = 2 * pi / _sideCount; - if (_crossedAxiLine) { - for (int i = 0; i < _sideCount; i++) { + double centralAngle = 2 * pi / _sideCount!; + if (_crossedAxiLine!) { + for (int i = 0; i < _sideCount!; i++) { canvas.save(); - canvas.rotate(2 * pi * i / _sideCount); + canvas.rotate(2 * pi * i / _sideCount!); Path path = Path(); path ..moveTo(0, 0) - ..lineTo(0, -_radius); + ..lineTo(0, -_radius!); canvas.drawPath( dashPath( path, @@ -638,8 +636,8 @@ class RenderRadarChart extends RenderBox } } - for (int i = 1; i <= _levelCount; i++) { - double r = _radius * i / _levelCount; + for (int i = 1; i <= _levelCount!; i++) { + double r = _radius! * i / _levelCount!; double sideLength = 2 * r * sin(centralAngle / 2); double dx = sideLength * sin((pi - centralAngle) / 2); double dy = sideLength * cos((pi - centralAngle) / 2); @@ -649,9 +647,9 @@ class RenderRadarChart extends RenderBox double px2 = px1 + dx; double py2 = py1 + dy; //draw the polygon - for (int i = 0; i < _sideCount; i++) { + for (int i = 0; i < _sideCount!; i++) { canvas.save(); - canvas.rotate(2 * pi * i / _sideCount); + canvas.rotate(2 * pi * i / _sideCount!); Path path = Path(); path ..moveTo(px1, py1) @@ -663,21 +661,16 @@ class RenderRadarChart extends RenderBox } void _drawRadar(Canvas canvas) { - int radarCount = _dataProvider.getRadarCount(); - assert(radarCount != null); + int radarCount = _dataProvider!.getRadarCount(); for (int radarIndex = 0; radarIndex < radarCount; radarIndex++) { - BrnRadarChartStyle radarStyle = _dataProvider.getRadarStyle(radarIndex); - assert(radarStyle != null); + BrnRadarChartStyle radarStyle = _dataProvider!.getRadarStyle(radarIndex); _radarPainter ..isAntiAlias = true - ..color = radarStyle?.strokeColor - ..strokeWidth = radarStyle?.strokeWidth; - List values = _dataProvider.getRadarValues(radarIndex); - if (values == null) { - continue; - } + ..color = radarStyle.strokeColor + ..strokeWidth = radarStyle.strokeWidth; + List values = _dataProvider!.getRadarValues(radarIndex); Path path = Path(); - double percent = values[0] / _maxValue; + double percent = values[0] / _maxValue!; double angle = 0; if (percent > 1) { percent = 1; @@ -685,16 +678,16 @@ class RenderRadarChart extends RenderBox percent = 0; } double x, y; - List dotPosition = List(); - x = _radius * percent * sin(angle) * _animateProgress; - y = -_radius * percent * cos(angle) * _animateProgress; + List dotPosition = []; + x = _radius! * percent * sin(angle) * _animateProgress!; + y = -_radius! * percent * cos(angle) * _animateProgress!; dotPosition.add(Offset(x, y)); path.moveTo(x, y); - for (int i = 1; i < _sideCount; i++) { - angle = 2 * pi * i / _sideCount; - percent = values[i] / _maxValue; - x = _radius * percent * sin(angle) * _animateProgress; - y = -_radius * percent * cos(angle) * _animateProgress; + for (int i = 1; i < _sideCount!; i++) { + angle = 2 * pi * i / _sideCount!; + percent = values[i] / _maxValue!; + x = _radius! * percent * sin(angle) * _animateProgress!; + y = -_radius! * percent * cos(angle) * _animateProgress!; path.lineTo(x, y); dotPosition.add(Offset(x, y)); } @@ -710,10 +703,10 @@ class RenderRadarChart extends RenderBox for (int i = 0; i < dotPosition.length; i++) { _radarPainter.color = Colors.white; canvas.drawCircle( - dotPosition[i], radarStyle.dotRadius + 2 ?? 2, _radarPainter); + dotPosition[i], radarStyle.dotRadius + 2, _radarPainter); _radarPainter.color = radarStyle.dotColor ?? radarStyle.strokeColor; canvas.drawCircle( - dotPosition[i], radarStyle.dotRadius ?? 2, _radarPainter); + dotPosition[i], radarStyle.dotRadius, _radarPainter); } } } @@ -776,14 +769,14 @@ class BrnRadarChartStyle { final bool dotted; ///The color of the dotted vertexes. - final Color dotColor; + final Color? dotColor; ///The radius of the dotted circle. final double dotRadius; const BrnRadarChartStyle({ - @required this.strokeColor, - @required this.areaColor, + required this.strokeColor, + required this.areaColor, this.strokeWidth = 3, this.dotted = false, this.dotColor, @@ -798,9 +791,7 @@ class DefaultRadarProvider extends BrnRadarChartDataProvider { DefaultRadarProvider(this.dataList); @override - int getRadarCount() { - return dataList?.length ?? 0; - } + int getRadarCount() => dataList.length; @override BrnRadarChartStyle getRadarStyle(int radarIndex) { From 1134426970f85227de9944aad5f0ab4a75844552 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Sat, 15 Jan 2022 13:06:58 +0800 Subject: [PATCH 06/20] migrate funnel chart to null safety --- lib/src/components/charts/funnel_chart.dart | 371 ++++++++++---------- 1 file changed, 184 insertions(+), 187 deletions(-) diff --git a/lib/src/components/charts/funnel_chart.dart b/lib/src/components/charts/funnel_chart.dart index 2894aaf4..884f5256 100644 --- a/lib/src/components/charts/funnel_chart.dart +++ b/lib/src/components/charts/funnel_chart.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'dart:math'; import 'dart:ui' as ui; @@ -62,11 +60,11 @@ class BrnFunnelChart extends MultiChildRenderObjectWidget { ]; BrnFunnelChart({ - Key key, - @required this.layerCount, - @required this.markerCount, - @required this.layerPainter, - @required MarkerBuilder builder, + Key? key, + required this.layerCount, + required this.markerCount, + required this.layerPainter, + required MarkerBuilder builder, this.shape = FunnelShape.LeftAndRight, this.maxLayerWidth = 200, this.minLayerWidth = 0, @@ -74,8 +72,7 @@ class BrnFunnelChart extends MultiChildRenderObjectWidget { this.layerMargin = 0, this.childOffset = Offset.zero, this.alignment = MarkerAlignment.right, - }) : assert(layerCount != null), - assert(maxLayerWidth >= minLayerWidth), + }) : assert(maxLayerWidth >= minLayerWidth), assert(layerCount - markerCount == 0 || layerCount - markerCount == 1), assert(() { if (shape == FunnelShape.LeftOrRight && @@ -88,7 +85,7 @@ class BrnFunnelChart extends MultiChildRenderObjectWidget { super( key: key, children: () { - List children = List(); + List children = []; for (int i = 0; i < markerCount; i++) { children.add(builder(i)); } @@ -97,10 +94,10 @@ class BrnFunnelChart extends MultiChildRenderObjectWidget { ///漏斗图默认Bruno风格的命名构造函数,[layerCount]不能大于[defaultLayerColors.length]。 BrnFunnelChart.defaultStyle({ - Key key, - @required this.layerCount, - @required this.markerCount, - @required MarkerBuilder builder, + Key? key, + required this.layerCount, + required this.markerCount, + required MarkerBuilder builder, this.maxLayerWidth = 200, this.minLayerWidth = 0, this.layerHeight = 40, @@ -109,15 +106,13 @@ class BrnFunnelChart extends MultiChildRenderObjectWidget { }) : this.layerPainter = BrnDefaultFunnelLayerPainter(), this.shape = FunnelShape.LeftAndRight, this.alignment = MarkerAlignment.right, - assert(layerCount != null && - layerCount <= defaultLayerColors.length && - layerCount >= 0), + assert(layerCount <= defaultLayerColors.length && layerCount >= 0), assert(maxLayerWidth >= minLayerWidth), assert(layerCount - markerCount == 0 || layerCount - markerCount == 1), super( key: key, children: () { - List children = List(); + List children = []; for (int i = 0; i < markerCount; i++) { children.add(builder(i)); } @@ -161,14 +156,14 @@ abstract class RenderFunnelChart extends RenderBox ContainerRenderObjectMixin, RenderBoxContainerDefaultsMixin { RenderFunnelChart({ - double layerMargin, - double layerHeight, - int layerCount, - double maxLayerWidth, - double minLayerWidth, - Offset childOffset, - MarkerAlignment alignment, - BrnFunnelLayerPainter layerPainter, + double? layerMargin, + double? layerHeight, + int? layerCount, + double? maxLayerWidth, + double? minLayerWidth, + Offset? childOffset, + MarkerAlignment? alignment, + BrnFunnelLayerPainter? layerPainter, }) : _layerMargin = layerMargin, _layerHeight = layerHeight, _layerCount = layerCount, @@ -178,81 +173,81 @@ abstract class RenderFunnelChart extends RenderBox _alignment = alignment, _layerPainter = layerPainter; - MarkerAlignment _alignment; + MarkerAlignment? _alignment; - MarkerAlignment get alignment => _alignment; + MarkerAlignment? get alignment => _alignment; - set alignment(MarkerAlignment value) { + set alignment(MarkerAlignment? value) { if (value == _alignment) return; _alignment = value; markNeedsLayout(); } - BrnFunnelLayerPainter get layerPainter => _layerPainter; + BrnFunnelLayerPainter? get layerPainter => _layerPainter; - BrnFunnelLayerPainter _layerPainter; + BrnFunnelLayerPainter? _layerPainter; - set layerPainter(BrnFunnelLayerPainter value) { + set layerPainter(BrnFunnelLayerPainter? value) { if (value == _layerPainter) return; _layerPainter = value; markNeedsPaint(); } - double get layerMargin => _layerMargin; + double? get layerMargin => _layerMargin; - double _layerMargin; + double? _layerMargin; - set layerMargin(double value) { + set layerMargin(double? value) { if (value == _layerMargin) return; _layerMargin = value; markNeedsLayout(); } - double get layerHeight => _layerHeight; + double? get layerHeight => _layerHeight; - double _layerHeight; + double? _layerHeight; - set layerHeight(double value) { + set layerHeight(double? value) { if (value == _layerHeight) return; _layerHeight = value; markNeedsLayout(); } - int get layerCount => _layerCount; + int? get layerCount => _layerCount; - int _layerCount; + int? _layerCount; - set layerCount(int value) { + set layerCount(int? value) { if (value == _layerCount) return; _layerCount = value; markNeedsLayout(); } - double get maxLayerWidth => _maxLayerWidth; + double? get maxLayerWidth => _maxLayerWidth; - double _maxLayerWidth; + double? _maxLayerWidth; - set maxLayerWidth(double value) { + set maxLayerWidth(double? value) { if (value == _maxLayerWidth) return; _maxLayerWidth = value; markNeedsLayout(); } - double get minLayerWidth => _minLayerWidth; + double? get minLayerWidth => _minLayerWidth; - double _minLayerWidth; + double? _minLayerWidth; - set minLayerWidth(double value) { + set minLayerWidth(double? value) { if (value == _minLayerWidth) return; _minLayerWidth = value; markNeedsLayout(); } - Offset get childOffset => _childOffset; + Offset? get childOffset => _childOffset; - Offset _childOffset; + Offset? _childOffset; - set childOffset(Offset value) { + set childOffset(Offset? value) { if (value == _childOffset) return; _childOffset = value; markNeedsLayout(); @@ -277,20 +272,20 @@ abstract class RenderFunnelChart extends RenderBox } @override - bool hitTestChildren(BoxHitTestResult result, {Offset position}) { + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { return defaultHitTestChildren(result, position: position); } @override double computeMinIntrinsicWidth(double height) { return getIntrinsicDimensionHorizontal( - height, (RenderBox child) => child.getMinIntrinsicWidth(height)); + height, (RenderBox child) => child.getMinIntrinsicWidth(height))!; } @override double computeMaxIntrinsicWidth(double height) { return getIntrinsicDimensionHorizontal( - height, (RenderBox child) => child.getMinIntrinsicWidth(height)); + height, (RenderBox child) => child.getMinIntrinsicWidth(height))!; } @override @@ -306,11 +301,11 @@ abstract class RenderFunnelChart extends RenderBox } @override - double computeDistanceToActualBaseline(TextBaseline baseline) { + double? computeDistanceToActualBaseline(TextBaseline baseline) { return defaultComputeDistanceToHighestActualBaseline(baseline); } - double getIntrinsicDimensionHorizontal( + double? getIntrinsicDimensionHorizontal( double height, double mainChildSizeGetter(RenderBox child)); double getIntrinsicDimensionVertical( @@ -324,17 +319,17 @@ class BrnFunnelRender extends RenderFunnelChart { static const double HALF_PIXEL = 0.5; BrnFunnelRender({ - double layerHeight, - double layerMargin, - int layerCount, - double maxLayerWidth, - double minLayerWidth, - Offset childOffset, - bool gradient, - List layerColors, - MarkerAlignment alignment, - BrnFunnelLayerPainter layerPainter, - FunnelShape shape, + double? layerHeight, + double? layerMargin, + int? layerCount, + double? maxLayerWidth, + double? minLayerWidth, + Offset? childOffset, + bool? gradient, + List? layerColors, + MarkerAlignment? alignment, + BrnFunnelLayerPainter? layerPainter, + FunnelShape? shape, }) : _shape = shape, _paint = Paint()..isAntiAlias = true, super( @@ -348,42 +343,44 @@ class BrnFunnelRender extends RenderFunnelChart { layerPainter: layerPainter, ); - FunnelShape _shape; + FunnelShape? _shape; Paint _paint; bool _hasVisualOverflow = false; - Offset _overflowOffset; - Offset _centerOffset; + late Offset _overflowOffset; + late Offset _centerOffset; @override - double getIntrinsicDimensionHorizontal( + double? getIntrinsicDimensionHorizontal( double height, double mainChildSizeGetter(RenderBox child)) { - double extent = maxLayerWidth; + double? extent = maxLayerWidth; double intrinsicHeight = getIntrinsicDimensionVertical(null, null); - RenderBox child = firstChild; + RenderBox? child = firstChild; if (_alignment == MarkerAlignment.center) { while (child != null) { - final BrnFunnelChartParentData childParentData = child.parentData; - extent = max(extent, mainChildSizeGetter(child)); + final BrnFunnelChartParentData childParentData = + child.parentData as BrnFunnelChartParentData; + extent = max(extent!, mainChildSizeGetter(child)); child = childParentData.nextSibling; } } else { double top, bottom, left; int num = 0; while (child != null) { - top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; - bottom = top + layerMargin + layerHeight; + top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; + bottom = top + layerMargin! + layerHeight!; left = (intrinsicHeight - bottom) * - (maxLayerWidth - minLayerWidth) / + (maxLayerWidth! - minLayerWidth!) / intrinsicHeight + - minLayerWidth + - childOffset.dx; + minLayerWidth! + + childOffset!.dx; if (child == firstChild) { - extent = max(extent, left + mainChildSizeGetter(child)); + extent = max(extent!, left + mainChildSizeGetter(child)); } num++; - BrnFunnelChartParentData childParentData = child.parentData; + BrnFunnelChartParentData childParentData = + child.parentData as BrnFunnelChartParentData; child = childParentData.nextSibling; } } @@ -392,99 +389,100 @@ class BrnFunnelRender extends RenderFunnelChart { @override double getIntrinsicDimensionVertical( - double width, double mainChildSizeGetter(RenderBox child)) { - return layerCount * layerHeight + (layerCount - 1) * layerMargin; + double? width, double mainChildSizeGetter(RenderBox child)?) { + return layerCount! * layerHeight! + (layerCount! - 1) * layerMargin!; } @override void performLayout() { _hasVisualOverflow = false; - double intrinsicWidth = maxLayerWidth; - double intrinsicHeight = layerHeight * layerCount + - (childCount >= layerCount - ? layerMargin * childCount - : layerMargin * (layerCount - 1)); - - RenderBox child = firstChild; - double top, bottom, left, right; + double? intrinsicWidth = maxLayerWidth; + double intrinsicHeight = layerHeight! * layerCount! + + (childCount >= layerCount! + ? layerMargin! * childCount + : layerMargin! * (layerCount! - 1)); + + RenderBox? child = firstChild; + late double top, bottom, left, right; int num = 0; while (child != null) { if (alignment == MarkerAlignment.center) { - top = (num + 1) * layerHeight + num * layerMargin + childOffset.dy; + top = (num + 1) * layerHeight! + num * layerMargin! + childOffset!.dy; } else { - top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; + top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; } if (alignment == MarkerAlignment.center) { - bottom = top + layerMargin; + bottom = top + layerMargin!; } else { - bottom = top + layerMargin + layerHeight; + bottom = top + layerMargin! + layerHeight!; } if (alignment == MarkerAlignment.center) { - left = 0 + childOffset.dx; + left = 0 + childOffset!.dx; right = constraints.maxWidth; } else if (alignment == MarkerAlignment.right) { left = (intrinsicHeight - bottom) * - (maxLayerWidth - minLayerWidth) / + (maxLayerWidth! - minLayerWidth!) / (2 * intrinsicHeight) + - (minLayerWidth + maxLayerWidth) / 2 + - childOffset.dx; + (minLayerWidth! + maxLayerWidth!) / 2 + + childOffset!.dx; right = constraints.maxWidth; } else if (alignment == MarkerAlignment.left) { left = 0; right = constraints.maxWidth - - maxLayerWidth + - bottom * (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + - childOffset.dx; + maxLayerWidth! + + bottom * (maxLayerWidth! - minLayerWidth!) / (2 * intrinsicHeight) + + childOffset!.dx; } - final BrnFunnelChartParentData childParentData = child.parentData; - BoxConstraints childConstraints; + final BrnFunnelChartParentData childParentData = + child.parentData as BrnFunnelChartParentData; + late BoxConstraints childConstraints; if (alignment == MarkerAlignment.center) { childConstraints = BoxConstraints( minWidth: 0, maxWidth: constraints.maxWidth, minHeight: 0, - maxHeight: layerMargin); + maxHeight: layerMargin!); } else if (alignment == MarkerAlignment.right) { childConstraints = BoxConstraints( minWidth: 0, maxWidth: right - left > 0 ? right - left : 0, minHeight: 0, - maxHeight: layerMargin + layerHeight); + maxHeight: layerMargin! + layerHeight!); } else if (alignment == MarkerAlignment.left) { childConstraints = BoxConstraints( minWidth: 0, maxWidth: right - left > 0 ? right - left : 0, minHeight: 0, - maxHeight: layerMargin + layerHeight); + maxHeight: layerMargin! + layerHeight!); } child.layout(childConstraints, parentUsesSize: true); final Size childSize = child.size; if (alignment == MarkerAlignment.center) { - intrinsicWidth = max(intrinsicWidth, childSize.width); + intrinsicWidth = max(intrinsicWidth!, childSize.width); } else if (alignment == MarkerAlignment.right) { - intrinsicWidth = max(intrinsicWidth, left + childSize.width); + intrinsicWidth = max(intrinsicWidth!, left + childSize.width); } else if (alignment == MarkerAlignment.left) { intrinsicWidth = max( - intrinsicWidth, - maxLayerWidth + + intrinsicWidth!, + maxLayerWidth! + childSize.width - bottom * - (maxLayerWidth - minLayerWidth) / + (maxLayerWidth! - minLayerWidth!) / (2 * intrinsicHeight)); } num++; child = childParentData.nextSibling; } - Size intrinsicSize = Size(intrinsicWidth, intrinsicHeight); + Size intrinsicSize = Size(intrinsicWidth!, intrinsicHeight); if (intrinsicSize.width > constraints.maxWidth || intrinsicSize.height > constraints.maxHeight) { _hasVisualOverflow = true; } size = constraints.constrain(intrinsicSize); - _centerOffset = centerOffset(size - intrinsicSize); + _centerOffset = centerOffset(size - intrinsicSize as ui.Offset); if (_centerOffset.dx >= 0 && _centerOffset.dy >= 0) { //当实际尺寸比必须尺寸大时,需要居中偏移一下 if (alignment == MarkerAlignment.left) { @@ -505,27 +503,30 @@ class BrnFunnelRender extends RenderFunnelChart { num = 0; child = firstChild; while (child != null) { - final BrnFunnelChartParentData childParentData = child.parentData; + final BrnFunnelChartParentData childParentData = + child.parentData as BrnFunnelChartParentData; if (alignment == MarkerAlignment.center) { childParentData.offset = - Offset(0, ((num * layerMargin) + (num + 1) * layerHeight)) + + Offset(0, ((num * layerMargin!) + (num + 1) * layerHeight!)) + _centerOffset; } else if (alignment == MarkerAlignment.right) { - top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; - bottom = top + layerMargin + layerHeight; + top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; + bottom = top + layerMargin! + layerHeight!; left = (intrinsicHeight - bottom) * - (maxLayerWidth - minLayerWidth) / + (maxLayerWidth! - minLayerWidth!) / (2 * intrinsicHeight) + - (minLayerWidth + maxLayerWidth) / 2 + - childOffset.dx; + (minLayerWidth! + maxLayerWidth!) / 2 + + childOffset!.dx; childParentData.offset = Offset(left, top) + _centerOffset; } else if (alignment == MarkerAlignment.left) { - top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; - bottom = top + layerMargin + layerHeight; + top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; + bottom = top + layerMargin! + layerHeight!; right = size.width - - maxLayerWidth + - (bottom) * (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + - childOffset.dx; + maxLayerWidth! + + (bottom) * + (maxLayerWidth! - minLayerWidth!) / + (2 * intrinsicHeight) + + childOffset!.dx; left = right - child.size.width; childParentData.offset = Offset(left, top) + _centerOffset; } @@ -538,96 +539,92 @@ class BrnFunnelRender extends RenderFunnelChart { void paintFunnel(PaintingContext context, Offset offset) { Canvas canvas = context.canvas; canvas.save(); - Rect rect = (offset + _centerOffset ?? Offset.zero) & size; + Rect rect = (offset + _centerOffset) & size; canvas.clipRect(rect); _paint.blendMode = BlendMode.srcOver; canvas.saveLayer(rect, _paint); canvas.translate(rect.left, rect.top); //绘制漏斗layer - for (int i = 0; i < layerCount; i++) { - Offset topLeft, bottomRight; + for (int i = 0; i < layerCount!; i++) { + late Offset topLeft, bottomRight; if (alignment == MarkerAlignment.center) { - topLeft = Offset((size.width - maxLayerWidth) / 2, - i * layerHeight + i * layerMargin); - bottomRight = Offset((size.width + maxLayerWidth) / 2, - (i + 1) * layerHeight + i * layerMargin); + topLeft = Offset((size.width - maxLayerWidth!) / 2, + i * layerHeight! + i * layerMargin!); + bottomRight = Offset((size.width + maxLayerWidth!) / 2, + (i + 1) * layerHeight! + i * layerMargin!); //绘制背景 } else if (alignment == MarkerAlignment.right) { - topLeft = Offset(0, i * layerHeight + i * layerMargin); + topLeft = Offset(0, i * layerHeight! + i * layerMargin!); bottomRight = - Offset(maxLayerWidth, (i + 1) * layerHeight + i * layerMargin); + Offset(maxLayerWidth!, (i + 1) * layerHeight! + i * layerMargin!); } else if (alignment == MarkerAlignment.left) { topLeft = Offset( - size.width - maxLayerWidth, i * layerHeight + i * layerMargin); + size.width - maxLayerWidth!, i * layerHeight! + i * layerMargin!); bottomRight = - Offset(size.width, (i + 1) * layerHeight + i * layerMargin); + Offset(size.width, (i + 1) * layerHeight! + i * layerMargin!); } //绘制layer背景色 - if (!layerPainter.isGradient(i)) { + if (!layerPainter!.isGradient(i)) { //单色背景 - if (layerPainter.getLayerColors(i) != null) { - _paint.color = layerPainter.getLayerColors(i)[0]; - canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); - } + _paint.color = layerPainter!.getLayerColors(i)[0]; + canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); } else { //渐变背景 - if (layerPainter.getLayerColors(i) != null) { - ui.Gradient gradient = ui.Gradient.linear( - topLeft, bottomRight, layerPainter.getLayerColors(i)); - _paint.shader = gradient; - canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); - } + ui.Gradient gradient = ui.Gradient.linear( + topLeft, bottomRight, layerPainter!.getLayerColors(i)); + _paint.shader = gradient; + canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); } //绘制layer文案 - double safeLeft, safeTop, safeRight, safeBottom; + double? safeLeft, safeTop, safeRight, safeBottom; if (_shape == FunnelShape.LeftAndRight) { - safeTop = i * layerHeight + i * layerMargin; + safeTop = i * layerHeight! + i * layerMargin!; if (alignment == MarkerAlignment.right) { - safeLeft = ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + safeLeft = ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); - safeRight = maxLayerWidth - - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + safeRight = maxLayerWidth! - + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); } else if (alignment == MarkerAlignment.left) { safeLeft = size.width - - maxLayerWidth + - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + maxLayerWidth! + + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); safeRight = size.width - - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); } else { - safeLeft = (size.width - maxLayerWidth) / 2 + - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + safeLeft = (size.width - maxLayerWidth!) / 2 + + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); - safeRight = (size.width + maxLayerWidth) / 2 - - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + safeRight = (size.width + maxLayerWidth!) / 2 - + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); } - safeBottom = safeTop + layerHeight; + safeBottom = safeTop + layerHeight!; } else { - safeTop = i * layerHeight + i * layerMargin; - safeBottom = safeTop + layerHeight; + safeTop = i * layerHeight! + i * layerMargin!; + safeBottom = safeTop + layerHeight!; if (alignment == MarkerAlignment.right) { safeLeft = 0; - safeRight = maxLayerWidth - - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + safeRight = maxLayerWidth! - + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); } else if (alignment == MarkerAlignment.left) { safeLeft = size.width - - maxLayerWidth + - ((i + 1) * layerHeight + i * layerMargin) * - (maxLayerWidth - minLayerWidth) / + maxLayerWidth! + + ((i + 1) * layerHeight! + i * layerMargin!) * + (maxLayerWidth! - minLayerWidth!) / (size.height * 2); safeRight = maxLayerWidth; } else { @@ -635,20 +632,20 @@ class BrnFunnelRender extends RenderFunnelChart { safeRight = maxLayerWidth; } } - layerPainter.paintLayer( - canvas, safeLeft, safeTop, safeRight, safeBottom, i); + layerPainter! + .paintLayer(canvas, safeLeft, safeTop, safeRight!, safeBottom, i); } _paint ..blendMode = BlendMode.dstOut ..style = PaintingStyle.fill ..shader = null; - double topLeftX; + late double topLeftX; if (alignment == MarkerAlignment.center) { - topLeftX = (size.width - maxLayerWidth) / 2; + topLeftX = (size.width - maxLayerWidth!) / 2; } else if (alignment == MarkerAlignment.right) { topLeftX = 0; } else if (alignment == MarkerAlignment.left) { - topLeftX = size.width - maxLayerWidth; + topLeftX = size.width - maxLayerWidth!; } Path path; @@ -661,7 +658,7 @@ class BrnFunnelRender extends RenderFunnelChart { //高版本flutter无此问题 path.moveTo(topLeftX - HALF_PIXEL, -HALF_PIXEL); path.lineTo(topLeftX - HALF_PIXEL, size.height + HALF_PIXEL); - path.lineTo((maxLayerWidth - minLayerWidth) / 2 + topLeftX, + path.lineTo((maxLayerWidth! - minLayerWidth!) / 2 + topLeftX, size.height + HALF_PIXEL); path.close(); canvas.drawPath(path, _paint); @@ -670,10 +667,10 @@ class BrnFunnelRender extends RenderFunnelChart { if (_shape == FunnelShape.LeftAndRight || alignment == MarkerAlignment.right) { path = Path(); - path.moveTo(maxLayerWidth + topLeftX + HALF_PIXEL, -HALF_PIXEL); + path.moveTo(maxLayerWidth! + topLeftX + HALF_PIXEL, -HALF_PIXEL); path.lineTo( - maxLayerWidth + topLeftX + HALF_PIXEL, size.height + HALF_PIXEL); - path.lineTo((maxLayerWidth + minLayerWidth) / 2 + topLeftX, + maxLayerWidth! + topLeftX + HALF_PIXEL, size.height + HALF_PIXEL); + path.lineTo((maxLayerWidth! + minLayerWidth!) / 2 + topLeftX, size.height + HALF_PIXEL); path.close(); canvas.drawPath(path, _paint); @@ -724,7 +721,7 @@ abstract class BrnFunnelLayerPainter { ///[canvas] 提供的画布,对画布进行旋转裁剪等特殊操作,一定要调用[canvas.save()]操作。 ///[left],[top],[right],[bottom]是提供给调用者绘制的一个安全区域,超过这个区域限制,可能会被截断 ///[layerIndex] 漏斗的layer index。 - void paintLayer(Canvas canvas, double left, double top, double right, + void paintLayer(Canvas canvas, double left, double? top, double right, double bottom, int layerIndex); } @@ -744,7 +741,7 @@ class BrnDefaultFunnelLayerPainter extends BrnFunnelLayerPainter { }) : _textPainter = TextPainter()..textDirection = TextDirection.ltr; @override - void paintLayer(Canvas canvas, double left, double top, double right, + void paintLayer(Canvas canvas, double left, double? top, double right, double bottom, int layerIndex) { if (layerIndex >= titles.length) { return; @@ -757,7 +754,7 @@ class BrnDefaultFunnelLayerPainter extends BrnFunnelLayerPainter { _textPainter.paint( canvas, Offset((left + right - _textPainter.width) / 2, - (top + bottom - _textPainter.height) / 2), + (top! + bottom - _textPainter.height) / 2), ); } From 9f982e1e0dbc6913e2bd44f9a656dc8ef91f54d8 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Sat, 15 Jan 2022 14:19:40 +0800 Subject: [PATCH 07/20] migrate broken line chart to null safety --- .../charts/broken_line/brn_base_painter.dart | 10 +- .../charts/broken_line/brn_broken_line.dart | 91 +++--- .../charts/broken_line/brn_line_data.dart | 31 +- .../charts/broken_line/brn_line_painter.dart | 295 +++++++++--------- .../broken_line/brn_line_y_painter.dart | 39 ++- .../charts/broken_line/monotone_x.dart | 27 +- 6 files changed, 236 insertions(+), 257 deletions(-) diff --git a/lib/src/components/charts/broken_line/brn_base_painter.dart b/lib/src/components/charts/broken_line/brn_base_painter.dart index f4f09766..ab648e9e 100644 --- a/lib/src/components/charts/broken_line/brn_base_painter.dart +++ b/lib/src/components/charts/broken_line/brn_base_painter.dart @@ -1,13 +1,9 @@ -// @dart=2.9 - import 'package:flutter/material.dart'; -class BrnBasePainter extends CustomPainter { +abstract class BrnBasePainter extends CustomPainter { @override - void paint(Canvas canvas, Size size) {} + void paint(Canvas canvas, Size size); @override - bool shouldRepaint(CustomPainter oldDelegate) { - return true; - } + bool shouldRepaint(CustomPainter oldDelegate); } diff --git a/lib/src/components/charts/broken_line/brn_broken_line.dart b/lib/src/components/charts/broken_line/brn_broken_line.dart index 1f0a0f83..eb94f315 100644 --- a/lib/src/components/charts/broken_line/brn_broken_line.dart +++ b/lib/src/components/charts/broken_line/brn_broken_line.dart @@ -1,13 +1,9 @@ -// @dart=2.9 - import 'dart:math'; -import 'dart:ui'; import 'package:bruno/src/components/charts/broken_line/brn_line_data.dart'; import 'package:bruno/src/components/charts/broken_line/brn_line_painter.dart'; import 'package:bruno/src/components/charts/broken_line/brn_line_y_painter.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; /// 适用于需要折线图,曲线图的场景 /// 支持数据过多时左右滑动查看数据 @@ -23,16 +19,16 @@ class BrnBrokenLine extends StatefulWidget { final EdgeInsets contentPadding; /// 绘制的背景色 - final Color backgroundColor; + final Color? backgroundColor; /// xy轴线条的宽度,默认 2 final double xyDialLineWidth; /// xy轴的颜色 - final Color xDialColor, yDialColor; + final Color? xDialColor, yDialColor; /// x轴最小值,最大值,用来计算内部绘制点的x轴位置 - final double xDialMin, xDialMax; + final double? xDialMin, xDialMax; /// y轴最小值,最大值,用来计算内部绘制点的y轴位置 final double yDialMin, yDialMax; @@ -41,10 +37,10 @@ class BrnBrokenLine extends StatefulWidget { final double dialWidth; /// y轴左侧刻度显示,不传则没有 - final List yDialValues; + final List? yDialValues; /// x 轴刻度 - final List xDialValues; + final List? xDialValues; /// x轴的辅助线是否展示,默认 true final bool isShowXHintLine; @@ -56,7 +52,7 @@ class BrnBrokenLine extends StatefulWidget { final bool isHintLineSolid; /// 辅助线颜色 - final Color hintLineColor; + final Color? hintLineColor; /// 是否展示 x 坐标刻度,默认 false final bool isShowXDialText; @@ -74,9 +70,9 @@ class BrnBrokenLine extends StatefulWidget { final bool isTipWindowAutoDismiss; BrnBrokenLine({ - Key key, - @required this.size, - @required this.lines, + Key? key, + required this.size, + required this.lines, this.contentPadding = const EdgeInsets.only(left: 10, right: 10), this.backgroundColor, this.xyDialLineWidth = 2, @@ -88,8 +84,8 @@ class BrnBrokenLine extends StatefulWidget { this.xDialMin, this.xDialMax, this.xDialValues, - this.yDialMin, - this.yDialMax, + required this.yDialMin, + required this.yDialMax, this.yDialValues, this.isShowXHintLine = true, this.isShowYHintLine = false, @@ -98,10 +94,7 @@ class BrnBrokenLine extends StatefulWidget { this.isTipWindowAutoDismiss = true, this.isShowXDialText = false, this.isShowYDialText = false, - }) : assert(size != null), - assert(yDialMin != null), - assert(yDialMax != null), - super(key: key) { + }) : super(key: key) { /// 设置自定义 X 轴时,检查 x轴的最大、最小刻度范围 if (xDialValues != null) { assert(xDialMin != null); @@ -158,9 +151,8 @@ class BrnBrokenLineState extends State { isShowYDialText: widget.isShowYDialText, ); //y 轴宽度 = Y 轴刻度宽度+ chartLeftPadding(SingleChildScrollView padding)+ y 轴偏移量 yAxisWidth - var yWidth = widget.size.width + - (widget.contentPadding?.left ?? 10) + - (widget.yHintLineOffset == null ? 20.0 : widget.yHintLineOffset); + var yWidth = + widget.size.width + widget.contentPadding.left + widget.yHintLineOffset; return Stack( children: [ CustomPaint( @@ -176,16 +168,16 @@ class BrnBrokenLineState extends State { : null, ), Padding( - padding: EdgeInsets.only(left: widget.yHintLineOffset ?? 20.0), + padding: EdgeInsets.only(left: widget.yHintLineOffset), child: SingleChildScrollView( padding: EdgeInsets.only( - left: widget.contentPadding?.left ?? 10, + left: widget.contentPadding.left, bottom: 25, - right: widget.contentPadding?.right ?? 10), + right: widget.contentPadding.right), scrollDirection: Axis.horizontal, child: GestureDetector( onPanDown: (DragDownDetails e) { - for (var i = 0; i < widget.lines[0].points.length; i++) { + for (var i = 0; i < widget.lines[0].points!.length; i++) { int lineIndex = _lineWithXPainter.lineIndexCompute(e.localPosition, i); if (lineIndex >= 0) { @@ -194,7 +186,7 @@ class BrnBrokenLineState extends State { Point selectedPoint = _lineWithXPainter.selectedPoint( lineSelectIndex, pointSelectIndex); _fillLeftTopPoint( - widget.lines[lineSelectIndex].points[pointSelectIndex] + widget.lines[lineSelectIndex].points![pointSelectIndex] .lineTouchData, _lineWithXPainter.startX, _lineWithXPainter.endX, @@ -207,14 +199,14 @@ class BrnBrokenLineState extends State { } }, onLongPressUp: () { - if (widget.isTipWindowAutoDismiss ?? true) { + if (widget.isTipWindowAutoDismiss) { pointSelectIndex = -1; lineSelectIndex = -1; setState(() {}); } }, onTapUp: (tapUpDetail) { - if (widget.isTipWindowAutoDismiss ?? true) { + if (widget.isTipWindowAutoDismiss) { pointSelectIndex = -1; lineSelectIndex = -1; setState(() {}); @@ -237,7 +229,7 @@ class BrnBrokenLineState extends State { ), (lineSelectIndex >= 0 && pointSelectIndex >= 0) ? _buildTouchTipWidget( - widget.lines[lineSelectIndex].points[pointSelectIndex]) + widget.lines[lineSelectIndex].points![pointSelectIndex]) : Container(), ]), ), @@ -249,19 +241,18 @@ class BrnBrokenLineState extends State { Widget _buildTouchTipWidget(BrnPointData pointData) { Widget touchTipWidget; - BrnLineTouchData selectLinePoint = pointData?.lineTouchData; + BrnLineTouchData? selectLinePoint = pointData.lineTouchData; if (selectLinePoint != null && - pointData.isClickable != null && pointData.isClickable && selectLinePoint.onTouch != null) { - var content = selectLinePoint.onTouch(); + var content = selectLinePoint.onTouch!(); if (content is String) { touchTipWidget = Positioned( top: selectLinePoint.y, left: selectLinePoint.x, child: Container( - height: selectLinePoint.tipWindowSize?.height, - width: selectLinePoint.tipWindowSize?.width, + height: selectLinePoint.tipWindowSize.height, + width: selectLinePoint.tipWindowSize.width, padding: EdgeInsets.only(left: 10, right: 10, top: 8, bottom: 8), child: Center(child: Text(content)), decoration: BoxDecoration( @@ -283,8 +274,8 @@ class BrnBrokenLineState extends State { top: selectLinePoint.y, left: selectLinePoint.x, child: Container( - height: selectLinePoint.tipWindowSize?.height, - width: selectLinePoint.tipWindowSize?.width, + height: selectLinePoint.tipWindowSize.height, + width: selectLinePoint.tipWindowSize.width, child: content)); } else { touchTipWidget = Container( @@ -303,14 +294,14 @@ class BrnBrokenLineState extends State { } void _fillLeftTopPoint( - BrnLineTouchData lineTouchData, - double startX, - double endX, - double startY, - double endY, - double fixedHeight, + BrnLineTouchData? lineTouchData, + double? startX, + double? endX, + double? startY, + double? endY, + double? fixedHeight, Point selectedPoint) { - if (selectedPoint == null || lineTouchData == null) return; + if (lineTouchData == null) return; if (pointSelectIndex < 0 && lineSelectIndex < 0) { lineTouchData.x = -1.0; @@ -323,19 +314,19 @@ class BrnBrokenLineState extends State { var selectY = selectedPoint.y; double y = 0; double x = 0; - if (selectY <= (startY - endY) / 2) { + if (selectY <= (startY! - endY!) / 2) { y = selectY + padding; } else { - y = selectY - (lineTouchData?.tipWindowSize?.height ?? 0.0) - padding; + y = selectY - (lineTouchData.tipWindowSize.height) - padding; } - if (selectX <= (endX - startX) / 2) { + if (selectX <= (endX! - startX!) / 2) { x = selectX + padding; } else { - x = selectX - (lineTouchData?.tipWindowSize?.width ?? 0.0) - padding; + x = selectX - (lineTouchData.tipWindowSize.width) - padding; } - lineTouchData.x = x + lineTouchData.tipOffset?.dx ?? 0; - lineTouchData.y = y + lineTouchData.tipOffset?.dy ?? 0; + lineTouchData.x = x + lineTouchData.tipOffset.dx; + lineTouchData.y = y + lineTouchData.tipOffset.dy; } } diff --git a/lib/src/components/charts/broken_line/brn_line_data.dart b/lib/src/components/charts/broken_line/brn_line_data.dart index e24688a9..542ac0a4 100644 --- a/lib/src/components/charts/broken_line/brn_line_data.dart +++ b/lib/src/components/charts/broken_line/brn_line_data.dart @@ -1,19 +1,19 @@ -// @dart=2.9 + import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:flutter/material.dart'; class BrnDialItem { /// 刻度标志内容 - String dialText; + String? dialText; /// 刻度标志样式 - TextStyle dialTextStyle; + TextStyle? dialTextStyle; /// x,y 轴刻度值。用于刻度在坐标的真实定位 double value; - BrnDialItem({this.dialText, this.dialTextStyle, @required this.value}); + BrnDialItem({this.dialText, this.dialTextStyle, required this.value}); } class BrnPointData { @@ -27,15 +27,15 @@ class BrnPointData { Offset offset; /// 点要展示的内容 - String pointText; + String? pointText; /// 点展示内容样式 - TextStyle pointTextStyle; + TextStyle? pointTextStyle; /// 折线节点的点击击事件是否可用 bool isClickable; - BrnLineTouchData lineTouchData; + BrnLineTouchData? lineTouchData; BrnPointData( {this.x = 0, @@ -58,7 +58,7 @@ class BrnPointData { class BrnLineTouchData { /// 用于临时存储要展示 tip 内容在坐标的位置 - double x, y; + double? x, y; /// 要展示 tip 的相对偏移量 Offset tipOffset; @@ -67,10 +67,10 @@ class BrnLineTouchData { Size tipWindowSize; /// 点击回调,由于返回 展示内容(String 或 Widget) - Function() onTouch; + Function()? onTouch; BrnLineTouchData({ - @required this.tipWindowSize, + required this.tipWindowSize, this.tipOffset: const Offset(0, 0), this.onTouch, }); @@ -79,28 +79,28 @@ class BrnLineTouchData { /// 每条线的定义 class BrnPointsLine { /// 点集合 - List points; + List? points; /// 线宽 double lineWidth; /// Line渐变色,从曲线到x轴从上到下的闭合颜色集 - List shaderColors; + List? shaderColors; /// 曲线或折线的颜色 Color lineColor; /// 点外圈的颜色 - Color pointColor; + Color? pointColor; /// 点的外半径参数 double pointRadius; /// 点内圈的颜色 - Color pointInnerColor; + Color? pointInnerColor; /// 点内圈的半径 - double pointInnerRadius; + double? pointInnerRadius; /// 是否显示x轴的文字,用来处理多个线条绘制的时候,同一x轴坐标不需要绘制多次,则只需要将多条线中一个标记绘制即可 bool isShowXDial; @@ -127,7 +127,6 @@ class BrnPointsLine { this.isShowPointText = false, this.shaderColors, this.lineColor = Colors.purple}) { - lineColor ??= Colors.purple; pointColor ??= lineColor; pointInnerColor ??= lineColor; pointInnerRadius ??= pointRadius - 1.5; diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index f6343e3f..270433b2 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -1,7 +1,4 @@ -// @dart=2.9 - import 'dart:math'; -import 'dart:ui'; import 'package:bruno/src/components/charts/broken_line/brn_base_painter.dart'; import 'package:bruno/src/components/charts/broken_line/brn_line_data.dart'; @@ -18,25 +15,25 @@ class BrnLinePainter extends BrnBasePainter { double xyLineWidth = 0.5; /// x轴的颜色 - Color xDialColor; + Color? xDialColor; ///y轴的颜色 - Color yDialColor; + Color? yDialColor; /// 刻度的宽度或者高度 double rulerWidth; /// x轴最小值,最大值,用来计算内部绘制点的x轴位置 - double xDialMin, xDialMax; + double? xDialMin, xDialMax; /// y轴最小值,最大值,用来计算内部绘制点的y轴位置 - double yDialMin, yDialMax; + double? yDialMin, yDialMax; /// x轴 刻度 - List xDialValues; + List? xDialValues; /// y轴左侧刻度显示,不传则没有 - List yDialValues; + List? yDialValues; /// x、y轴的辅助线 bool isShowHintX, isShowHintY; @@ -45,12 +42,12 @@ class BrnLinePainter extends BrnBasePainter { bool hintLineSolid; /// 辅助线颜色 - Color hintLineColor; + Color? hintLineColor; /// 绘制线条的参数内容 List lines; - bool isShowXText, isShowYText; + bool? isShowXText, isShowYText; bool showPointDashLine; @@ -63,27 +60,27 @@ class BrnLinePainter extends BrnBasePainter { /// 图标距离 widget 顶部的 padding static const double paddingTop = 10; - double selectX; - double selectY; - double _startX = 0.0, + double? selectX; + double? selectY; + double? _startX = 0.0, _endX = 0.0, _startY = 0.0, _endY = 0.0, _fixedHeight, _fixedWidth; - List _lineCanvasModels; + late List _lineCanvasModels; - List> _linePointPositions = List(); + List> _linePointPositions = []; - double get startX => _startX; + double? get startX => _startX; - double get startY => _startY; + double? get startY => _startY; - double get endX => _endX; + double? get endX => _endX; - double get endY => _endY; + double? get endY => _endY; - double get fixedHeight => _fixedHeight; + double? get fixedHeight => _fixedHeight; BrnLinePainter( this.lines, { @@ -107,7 +104,7 @@ class BrnLinePainter extends BrnBasePainter { }) { if (xDialValues == null) { for (var i = 1; i < lines.length; i++) { - assert(lines[i - 1].points.length == lines[i].points.length, + assert(lines[i - 1].points!.length == lines[i].points!.length, '折线${i - 1}和$i条线的节点数不一致'); } } @@ -166,11 +163,8 @@ class BrnLinePainter extends BrnBasePainter { .colorTextSecondary; hintLineColor ??= BrnThemeConfigurator.instance.getConfig().commonConfig.colorTextBase; - hintLineSolid ??= true; - xyLineWidth ??= 0.5; xDialMin ??= 0; xDialMax ??= 1; - yDialMin ??= 0; yDialMax ??= 1; } @@ -179,49 +173,49 @@ class BrnLinePainter extends BrnBasePainter { void _initBorder(Size size) { _endX = size.width; _startY = size.height; - if (isShowXText) { + if (isShowXText!) { _endY = 20.0; } - _fixedHeight = _startY - _endY - paddingTop; - _fixedWidth = _endX - _startX; + _fixedHeight = _startY! - _endY! - paddingTop; + _fixedWidth = _endX! - _startX!; } ///计算Path void _initPath(Canvas canvas, Paint xyPaint) { _lineCanvasModels = []; - if (lines != null && lines.isNotEmpty) { + if (lines.isNotEmpty) { _linePointPositions.clear(); // 计算点和线的 数据,用于渲染。 for (var item in lines) { - var paths = [], shadowPaths = []; + var paths = [], shadowPaths = []; var pointArr = []; - if (item.points != null && item.points.isNotEmpty) { - var _path = Path(); - var _shadowPath = Path(); - - if (xDialValues != null && xDialValues.isNotEmpty) { - for (var i = 0; i < item.points.length; i++) { - var xPosition = _startX + - ((item.points[i].x - xDialMin) / - (xDialMax - xDialMin) * - _fixedWidth); - var yPosition = _startY - - ((item.points[i].y - yDialMin) / - (yDialMax - yDialMin) * - _fixedHeight); + if (item.points != null && item.points!.isNotEmpty) { + Path? _path = Path(); + Path _shadowPath = Path(); + + if (xDialValues != null && xDialValues!.isNotEmpty) { + for (var i = 0; i < item.points!.length; i++) { + var xPosition = _startX! + + ((item.points![i].x - xDialMin!) / + (xDialMax! - xDialMin!) * + _fixedWidth!); + var yPosition = _startY! - + ((item.points![i].y - yDialMin!) / + (yDialMax! - yDialMin!) * + _fixedHeight!); pointArr.add(Point(xPosition, yPosition)); } } else { var xScaleCount = item.points?.length ?? 0; - var W = _fixedWidth / + var W = _fixedWidth! / (xScaleCount > 1 ? (xScaleCount - 1) : 1); //两个点之间的x方向距离 - for (var i = 0; i < item.points.length; i++) { - var xPosition = _startX + W * i; - var yPosition = _startY - - ((item.points[i].y - yDialMin) / - (yDialMax - yDialMin) * - _fixedHeight); + for (var i = 0; i < item.points!.length; i++) { + var xPosition = _startX! + W * i; + var yPosition = _startY! - + ((item.points![i].y - yDialMin!) / + (yDialMax! - yDialMin!) * + _fixedHeight!); pointArr.add(Point(xPosition, yPosition)); } } @@ -232,20 +226,23 @@ class BrnLinePainter extends BrnBasePainter { /// 生成 Shadow path。 _shadowPath = _getSmoothLinePath(pointArr); _shadowPath - ..lineTo(pointArr[pointArr.length - 1].x, _fixedHeight) - ..lineTo(pointArr[0].x, _fixedHeight) + ..lineTo(pointArr[pointArr.length - 1].x as double, _fixedHeight!) + ..lineTo(pointArr[0].x as double, _fixedHeight!) ..close(); } else { - _path.moveTo(pointArr[0].x, pointArr[0].y); - _shadowPath.moveTo(pointArr[0].x, pointArr[0].y); + _path.moveTo(pointArr[0].x as double, pointArr[0].y as double); + _shadowPath.moveTo( + pointArr[0].x as double, pointArr[0].y as double); for (var i = 1; i < pointArr.length; i++) { - _path.lineTo(pointArr[i].x, pointArr[i].y); - _shadowPath.lineTo(pointArr[i].x, pointArr[i].y); + _path.lineTo(pointArr[i].x as double, pointArr[i].y as double); + _shadowPath.lineTo( + pointArr[i].x as double, pointArr[i].y as double); if (i == pointArr.length - 1) { _shadowPath - ..lineTo(pointArr[pointArr.length - 1].x, _fixedHeight) - ..lineTo(pointArr[0].x, _fixedHeight) + ..lineTo( + pointArr[pointArr.length - 1].x as double, _fixedHeight!) + ..lineTo(pointArr[0].x as double, _fixedHeight!) ..close(); } } @@ -271,11 +268,12 @@ class BrnLinePainter extends BrnBasePainter { /// Draws smooth lines between each point. Path _getSmoothLinePath(List points) { - var targetPoints = List(); + var targetPoints = []; targetPoints.addAll(points); targetPoints.add(Point( points[points.length - 1].x * 2, points[points.length - 1].y * 2)); - var x0, y0, x1, y1, t0, path = Path(); + double? x0, y0, x1, y1, t0; + var path = Path(); for (int i = 0; i < targetPoints.length; i++) { var t1; var x = targetPoints[i].x; @@ -283,23 +281,23 @@ class BrnLinePainter extends BrnBasePainter { if (x == x1 && y == y1) break; switch (i) { case 0: - path.moveTo(x, y); + path.moveTo(x as double, y as double); break; case 1: break; case 2: - t1 = MonotoneX.slope3(x0, y0, x1, y1, x, y); + t1 = MonotoneX.slope3(x0!, y0!, x1!, y1!, x as double, y as double); MonotoneX.point( path, x0, y0, x1, y1, MonotoneX.slope2(x0, y0, x1, y1, t1), t1); break; default: - t1 = MonotoneX.slope3(x0, y0, x1, y1, x, y); - MonotoneX.point(path, x0, y0, x1, y1, t0, t1); + t1 = MonotoneX.slope3(x0!, y0!, x1!, y1!, x as double, y as double); + MonotoneX.point(path, x0, y0, x1, y1, t0!, t1); } x0 = x1; y0 = y1; - x1 = x; - y1 = y; + x1 = x as double; + y1 = y as double; t0 = t1; } return path; @@ -308,42 +306,46 @@ class BrnLinePainter extends BrnBasePainter { ///x,y轴 void _drawXy(Canvas canvas, Paint paint) { if (isShowHintY) { - canvas.drawLine(Offset(_startX, _startY), - Offset(_startX, _endY - basePadding), paint..color = yDialColor); //y轴 + canvas.drawLine( + Offset(_startX!, _startY!), + Offset(_startX!, _endY! - basePadding), + paint..color = yDialColor!); //y轴 } - if (lines != null && lines.isNotEmpty) { + if (lines.isNotEmpty) { //绘制x轴的文字部分 for (var item in lines) { - if (item.points != null && item.points.isNotEmpty && item.isShowXDial) { - _drawXRuler(canvas, paint..color = xDialColor, item.points); + if (item.points != null && + item.points!.isNotEmpty && + item.isShowXDial) { + _drawXRuler(canvas, paint..color = xDialColor!, item.points); } } } } ///x轴刻度 & 辅助线 - void _drawXRuler(Canvas canvas, Paint paint, List points) { - if (xDialValues != null && xDialValues.isNotEmpty) { + void _drawXRuler(Canvas canvas, Paint paint, List? points) { + if (xDialValues != null && xDialValues!.isNotEmpty) { // 获取刻度长度 - for (var i = 0; i < xDialValues.length; i++) { + for (var i = 0; i < xDialValues!.length; i++) { ///绘制x轴文本 var tpX = TextPainter( textAlign: TextAlign.center, ellipsis: '.', text: TextSpan( - text: xDialValues[i].dialText, - style: xDialValues[i].dialTextStyle), + text: xDialValues![i].dialText, + style: xDialValues![i].dialTextStyle), textDirection: TextDirection.ltr) ..layout(); // 开始绘制刻度 _drawXRuleByPointPosition( tpX, canvas, - _startX + - (xDialValues[i].value - xDialMin) / - (xDialMax - xDialMin) * - _fixedWidth, + _startX! + + (xDialValues![i].value - xDialMin!) / + (xDialMax! - xDialMin!) * + _fixedWidth!, paint); } } @@ -351,30 +353,31 @@ class BrnLinePainter extends BrnBasePainter { void _drawXRuleByPointPosition( TextPainter tpX, Canvas canvas, double xPosition, Paint paint) { - tpX.paint(canvas, Offset(xPosition - tpX.width / 2, _startY + textPadding)); + tpX.paint( + canvas, Offset(xPosition - tpX.width / 2, _startY! + textPadding)); // 绘制与 X 轴对应的垂直辅助线 if (isShowHintY) { var tempPath = Path() - ..moveTo(xPosition, _startY) - ..lineTo(xPosition, _endY - basePadding); + ..moveTo(xPosition, _startY!) + ..lineTo(xPosition, _endY! - basePadding); if (hintLineSolid) { - canvas.drawPath(tempPath, paint..color = hintLineColor); + canvas.drawPath(tempPath, paint..color = hintLineColor!); } else { canvas.drawPath( dashPath( tempPath, dashArray: CircularIntervalList([4.0, 2.0]), ), - paint..color = hintLineColor, + paint..color = hintLineColor!, ); } } // 绘制 x轴刻度 if (isShowHintX) { - canvas.drawLine(Offset(xPosition, _startY), - Offset(xPosition, _startY + rulerWidth), paint..color = xDialColor); + canvas.drawLine(Offset(xPosition, _startY!), + Offset(xPosition, _startY! + rulerWidth), paint..color = xDialColor!); } } @@ -383,17 +386,17 @@ class BrnLinePainter extends BrnBasePainter { _lineCanvasModels.forEach((element) { //阴影区域 if (element.shadowPaths != null && element.shaderColors != null) { - element.shadowPaths.forEach((shadowPathElement) { + element.shadowPaths!.forEach((shadowPathElement) { var shader = LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, tileMode: TileMode.clamp, - colors: element.shaderColors) + colors: element.shaderColors!) .createShader( - Rect.fromLTWH(_startX, _endY, _fixedWidth, _fixedHeight)); + Rect.fromLTWH(_startX!, _endY!, _fixedWidth!, _fixedHeight!)); canvas ..drawPath( - shadowPathElement, + shadowPathElement!, Paint() ..shader = shader ..isAntiAlias = true @@ -402,14 +405,14 @@ class BrnLinePainter extends BrnBasePainter { } if (element.paths != null) { //路径 - element.paths.forEach((pathElement) { + element.paths!.forEach((pathElement) { var pathPaint = Paint() ..isAntiAlias = true - ..strokeWidth = element.pathWidth + ..strokeWidth = element.pathWidth! ..strokeCap = StrokeCap.round - ..color = element.pathColor + ..color = element.pathColor! ..style = PaintingStyle.stroke; - canvas.drawPath(pathElement, pathPaint); + canvas.drawPath(pathElement!, pathPaint); }); } if (element.points != null) { @@ -418,25 +421,25 @@ class BrnLinePainter extends BrnBasePainter { // 圆环宽度 strokeWidth = element.pointRadius - element.pointInnerRadius // 实际 drawCircle 半径 outerR = (element.pointRadius - element.pointInnerRadius)/2 + element.pointInnerRadius // 内部半径 innerR = element.pointInnerRadius - element.points.forEach((pointElement) { + element.points!.forEach((pointElement) { var pointPaint = Paint() ..isAntiAlias = true ..strokeCap = StrokeCap.round - ..color = element.pointColor - ..strokeWidth = element.pointRadius - element.pointInnerRadius + ..color = element.pointColor! + ..strokeWidth = element.pointRadius! - element.pointInnerRadius! ..style = PaintingStyle.stroke; //描边为居中描边 canvas.drawCircle( - Offset(pointElement.x, pointElement.y), - (element.pointRadius - element.pointInnerRadius) / 2 + - element.pointInnerRadius, + Offset(pointElement.x as double, pointElement.y as double), + (element.pointRadius! - element.pointInnerRadius!) / 2 + + element.pointInnerRadius!, pointPaint); }); //内圆 int currentLineIndex = _lineCanvasModels.indexOf(element); - element.points.forEach((pointElement) { - int currentPointIndex = element.points.indexOf(pointElement); + element.points!.forEach((pointElement) { + int currentPointIndex = element.points!.indexOf(pointElement); Color color = Colors.white; var pointPaintBg = Paint() @@ -444,20 +447,24 @@ class BrnLinePainter extends BrnBasePainter { ..strokeCap = StrokeCap.round ..color = color ..style = PaintingStyle.fill; - canvas.drawCircle(Offset(pointElement.x, pointElement.y), - element.pointInnerRadius, pointPaintBg); + canvas.drawCircle( + Offset(pointElement.x as double, pointElement.y as double), + element.pointInnerRadius!, + pointPaintBg); if (currentLineIndex == lineSelectIndex && currentPointIndex == pointSelectIndex) { - color = element.pointInnerColor; + color = element.pointInnerColor!; } var pointPaint = Paint() ..isAntiAlias = true ..strokeCap = StrokeCap.round ..color = color ..style = PaintingStyle.fill; - canvas.drawCircle(Offset(pointElement.x, pointElement.y), - element.pointInnerRadius, pointPaint); + canvas.drawCircle( + Offset(pointElement.x as double, pointElement.y as double), + element.pointInnerRadius!, + pointPaint); }); } }); @@ -470,12 +477,12 @@ class BrnLinePainter extends BrnBasePainter { var x = _linePointPositions[lineSelectIndex][pointSelectIndex].x; var xPath = Path() - ..moveTo(x, _startY) - ..lineTo(x, _endY - basePadding); + ..moveTo(x as double, _startY!) + ..lineTo(x, _endY! - basePadding); var y = _linePointPositions[lineSelectIndex][pointSelectIndex].y; var yPath = Path() - ..moveTo(_startX, y) - ..lineTo(_endX, y); + ..moveTo(_startX!, y as double) + ..lineTo(_endX!, y); if (showPointDashLine) { canvas.drawPath( dashPath( @@ -506,26 +513,26 @@ class BrnLinePainter extends BrnBasePainter { } void _drawPointDisplayText(Canvas canvas) { - if (_linePointPositions != null && _linePointPositions.isNotEmpty) { + if (_linePointPositions.isNotEmpty) { for (int lineIndex = 0; lineIndex < _linePointPositions.length; lineIndex++) { BrnPointsLine item = lines[lineIndex]; if (item.isShowPointText && item.points != null && - item.points.isNotEmpty) { - var length = item.points.length; + item.points!.isNotEmpty) { + var length = item.points!.length; for (var i = 0; i < length; i++) { - if (item.points[i].pointText == null || - item.points[i].pointText.length == 0) { + if (item.points![i].pointText == null || + item.points![i].pointText!.length == 0) { continue; } var tpX = TextPainter( textAlign: TextAlign.center, ellipsis: '.', text: TextSpan( - text: '${item.points[i].pointText}', - style: item.points[i].pointTextStyle), + text: '${item.points![i].pointText}', + style: item.points![i].pointTextStyle), textDirection: TextDirection.ltr) ..layout(); double adjustOffset = isAdjustPosition(lineIndex, @@ -535,10 +542,10 @@ class BrnLinePainter extends BrnBasePainter { tpX.paint( canvas, Offset( - (item.points[i].offset?.dx ?? 0) + + (item.points![i].offset.dx) + _linePointPositions[lineIndex][i].x - tpX.width / 2, - (item.points[i].offset?.dy ?? 0) + + (item.points![i].offset.dy) + _linePointPositions[lineIndex][i].y + adjustOffset)); } @@ -562,19 +569,13 @@ class BrnLinePainter extends BrnBasePainter { List> getSameXValuePoints( Point currentPoint, List>> lines) { - List> sameXPoints = List(); - if (lines != null) { - for (int lineIndex = 0; lineIndex < lines.length; lineIndex++) { - List> linePoints = lines[lineIndex]; - if (linePoints != null) { - for (int pointIndex = 0; - pointIndex < linePoints.length; - pointIndex++) { - if (currentPoint.x == linePoints[pointIndex].x && - currentPoint != linePoints[pointIndex]) { - sameXPoints.add(linePoints[pointIndex]); - } - } + List> sameXPoints = []; + for (int lineIndex = 0; lineIndex < lines.length; lineIndex++) { + List> linePoints = lines[lineIndex]; + for (int pointIndex = 0; pointIndex < linePoints.length; pointIndex++) { + if (currentPoint.x == linePoints[pointIndex].x && + currentPoint != linePoints[pointIndex]) { + sameXPoints.add(linePoints[pointIndex]); } } } @@ -584,18 +585,18 @@ class BrnLinePainter extends BrnBasePainter { //绘制图表的计算之后的结果模型集 class LineCanvasModel { - List paths; - Color pathColor; - double pathWidth; - - List shadowPaths; - List shaderColors; - - List points; - Color pointColor; - double pointRadius; - double pointInnerRadius; - Color pointInnerColor; + List? paths; + Color? pathColor; + double? pathWidth; + + List? shadowPaths; + List? shaderColors; + + List? points; + Color? pointColor; + double? pointRadius; + double? pointInnerRadius; + Color? pointInnerColor; bool showPointText; LineCanvasModel({ diff --git a/lib/src/components/charts/broken_line/brn_line_y_painter.dart b/lib/src/components/charts/broken_line/brn_line_y_painter.dart index 2688883e..df30dab1 100644 --- a/lib/src/components/charts/broken_line/brn_line_y_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_y_painter.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:bruno/src/components/charts/broken_line/brn_base_painter.dart'; import 'package:bruno/src/components/charts/broken_line/brn_line_data.dart'; import 'package:bruno/src/theme/brn_theme_configurator.dart'; @@ -21,10 +19,10 @@ class BrnLineYPainter extends BrnBasePainter { double xyLineWidth = 0.5; /// x轴的颜色 - Color xColor; + Color? xColor; /// y轴的颜色 - Color yColor; + Color? yColor; /// y轴刻度的偏移量 double yHintLineOffset; @@ -33,10 +31,10 @@ class BrnLineYPainter extends BrnBasePainter { double rulerWidth; /// y轴最大值,用来计算内部绘制点的y轴位置 - double yMin, yMax; + double? yMin, yMax; /// y轴左侧刻度显示,不传则没有 - List yDialValues; + List? yDialValues; /// x、y轴的辅助线 bool isShowXHintLine, isShowYHintLine; @@ -45,16 +43,17 @@ class BrnLineYPainter extends BrnBasePainter { bool isHintLineSolid; /// 辅助线颜色 - Color hintLineColor; + Color? hintLineColor; /// 绘制线条的参数内容 List lines; bool isShowXDialText, isShowYDialText; - double selectX; - double selectY; - double _startX = 0.0, _endX = 0.0, _startY = 0.0, _endY = 0.0, _fixedHeight; + double? selectX; + double? selectY; + double _startX = 0.0, _endX = 0.0, _startY = 0.0, _endY = 0.0; + late double _fixedHeight; BrnLineYPainter( this.lines, { @@ -107,8 +106,6 @@ class BrnLineYPainter extends BrnBasePainter { .colorTextSecondary; hintLineColor ??= BrnThemeConfigurator.instance.getConfig().commonConfig.colorTextBase; - isHintLineSolid ??= true; - xyLineWidth ??= 0.5; yMin ??= 0; yMax ??= 1; @@ -121,7 +118,7 @@ class BrnLineYPainter extends BrnBasePainter { /// 如果展示y刻度文本,则左侧默认预留 20 像素高度展示x刻度 if (isShowYDialText) { - _startX = yHintLineOffset ?? 20.0; + _startX = yHintLineOffset; } /// 如果展示x刻度文本,则底部预留 20 像素高度展示x刻度 @@ -135,11 +132,11 @@ class BrnLineYPainter extends BrnBasePainter { void _drawXy(Canvas canvas, Paint paint) { if (isShowXHintLine) { canvas.drawLine(Offset(_startX, _startY), - Offset(_endX + _basePadding, _startY), paint..color = xColor); //x轴 + Offset(_endX + _basePadding, _startY), paint..color = xColor!); //x轴 } if (isShowYHintLine) { canvas.drawLine(Offset(_startX, _startY), - Offset(_startX, _endY - _basePadding), paint..color = yColor); //y轴 + Offset(_startX, _endY - _basePadding), paint..color = yColor!); //y轴 } _drawYRuler(canvas, paint); } @@ -149,11 +146,11 @@ class BrnLineYPainter extends BrnBasePainter { if (yDialValues == null) { return; } - for (var i = 0; i < yDialValues.length; i++) { - var ydialValue = yDialValues[i]; + for (var i = 0; i < yDialValues!.length; i++) { + var ydialValue = yDialValues![i]; // 绘制y轴文本 - var yLength = (ydialValue.value - yMin) / (yMax - yMin) * _fixedHeight; + var yLength = (ydialValue.value - yMin!) / (yMax! - yMin!) * _fixedHeight; var textY = TextPainter( textAlign: TextAlign.right, ellipsis: '.', @@ -179,7 +176,7 @@ class BrnLineYPainter extends BrnBasePainter { ..moveTo(_startX, _startY - yLength) ..lineTo(_startX + _endX - yHintLineOffset, _startY - yLength); if (isHintLineSolid) { - canvas.drawPath(hitXPath, paint..color = hintLineColor); + canvas.drawPath(hitXPath, paint..color = hintLineColor!); } else { canvas.drawPath( dashPath( @@ -187,7 +184,7 @@ class BrnLineYPainter extends BrnBasePainter { dashArray: CircularIntervalList([4.0, 4.0]), //虚线和间隔 ), - paint..color = hintLineColor, + paint..color = hintLineColor!, ); } } @@ -197,7 +194,7 @@ class BrnLineYPainter extends BrnBasePainter { canvas.drawLine( Offset(_startX, _startY - yLength), Offset(_startX + rulerWidth, _startY - yLength), - paint..color = yColor); + paint..color = yColor!); } } } diff --git a/lib/src/components/charts/broken_line/monotone_x.dart b/lib/src/components/charts/broken_line/monotone_x.dart index 2b5ccd40..0494780a 100644 --- a/lib/src/components/charts/broken_line/monotone_x.dart +++ b/lib/src/components/charts/broken_line/monotone_x.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'dart:math'; import 'dart:ui'; @@ -25,7 +23,7 @@ class MonotoneX { double p = (s0 * h1 + s1 * h0) / (h0 + h1); var source = [s0.abs(), s1.abs(), 0.5 * p.abs()]; source.sort(); - return (sign(s0) + sign(s1)) * source.first ?? 0; + return (sign(s0) + sign(s1)) * source.first; } // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations @@ -40,19 +38,16 @@ class MonotoneX { static Path addCurve(Path path, List points, {bool reversed = false, int endIndex = -1}) { - var targetPoints = List(); + var targetPoints = >[]; targetPoints.addAll(points); targetPoints.add(Point( points[points.length - 1].x * 2, points[points.length - 1].y * 2)); - double x0, y0, x1, y1, t0; - if (path == null) { - path = Path(); - } - List> arr = []; + double? x0, y0, x1, y1, t0; + List> arr = []; for (int i = 0; i < targetPoints.length; i++) { - double t1; - double x = targetPoints[i].x; - double y = targetPoints[i].y; + double? t1; + double x = targetPoints[i].x as double; + double y = targetPoints[i].y as double; if (x == x1 && y == y1) continue; switch (i) { case 0: @@ -60,11 +55,11 @@ class MonotoneX { case 1: break; case 2: - t1 = slope3(x0, y0, x1, y1, x, y); + t1 = slope3(x0!, y0!, x1!, y1!, x, y); arr.add([x0, y0, x1, y1, slope2(x0, y0, x1, y1, t1), t1]); break; default: - t1 = slope3(x0, y0, x1, y1, x, y); + t1 = slope3(x0!, y0!, x1!, y1!, x, y); arr.add([x0, y0, x1, y1, t0, t1]); } x0 = x1; @@ -77,13 +72,13 @@ class MonotoneX { if (reversed) { arr.reversed.forEach((f) { if (endIndex < 0 || index++ < endIndex) { - point(path, f[2], f[3], f[0], f[1], f[5], f[4]); + point(path, f[2]!, f[3]!, f[0]!, f[1]!, f[5]!, f[4]!); } }); } else { arr.forEach((f) { if (endIndex < 0 || index++ < endIndex) { - point(path, f[0], f[1], f[2], f[3], f[4], f[5]); + point(path, f[0]!, f[1]!, f[2]!, f[3]!, f[4]!, f[5]!); } }); } From d16b2d2a167b06b4b24b60f2c1ac20692109715f Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 15:24:16 +0800 Subject: [PATCH 08/20] fix progress bar chart some value is required --- .../brn_progress_bar_chart.dart | 4 ++-- .../brn_progress_bar_chart_painter.dart | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart index 7645ba04..e17c3e22 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart @@ -28,7 +28,7 @@ class BrnProgressBarChart extends StatefulWidget { final double singleBarWidth; /// 柱状图的最大值,柱状图的宽/高会依此值计算,默认 0 - final double? barMaxValue; + final double barMaxValue; /// 柱状图方向,默认 BarChartStyle.vertical final BarChartStyle barChartStyle; @@ -58,7 +58,7 @@ class BrnProgressBarChart extends StatefulWidget { required this.barBundleList, this.barGroupSpace = 30, this.singleBarWidth = 30, - this.barMaxValue, + this.barMaxValue = 0, this.selectedHintTextColor = Colors.white, this.selectedHintTextBackgroundColor = Colors.black, this.onBarItemClickInterceptor, diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart index 2ac29588..36b80125 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart @@ -145,13 +145,13 @@ class BrnProgressBarChartPainter extends CustomPainter { final List barBundleList; /// 条形间距 - final double? barGroupSpace; + final double barGroupSpace; /// 单个柱形宽度 final double? singleBarWidth; /// 柱状图的最大值,柱状图的宽/高会依此值计算 - final double? barMaxValue; + final double barMaxValue; final bool drawX; final bool drawY; final bool drawBar; @@ -179,7 +179,7 @@ class BrnProgressBarChartPainter extends CustomPainter { Rect yAxisRect = Rect.zero; /// 最大数据 - double? maxValue = 0; + double maxValue = 0; final double _yTextAxisSpace = 10; final double _yTextMaxWidth = 50; @@ -190,9 +190,9 @@ class BrnProgressBarChartPainter extends CustomPainter { required this.xAxis, required this.yAxis, required this.barBundleList, - this.barGroupSpace, + required this.barGroupSpace, this.singleBarWidth, - this.barMaxValue, + required this.barMaxValue, this.drawX = true, this.drawY = true, this.drawBar = true, @@ -276,12 +276,12 @@ class BrnProgressBarChartPainter extends CustomPainter { } // 找到柱状图最大值 - if (null != this.barMaxValue && 0 != this.barMaxValue) { + if (0 != this.barMaxValue) { this.maxValue = this.barMaxValue; } else { this.barBundleList.forEach((BrnProgressBarBundle barbundle) { barbundle.barList.forEach((BrnProgressBarItem barItem) { - if (barItem.value > this.maxValue!) this.maxValue = barItem.value; + if (barItem.value > this.maxValue) this.maxValue = barItem.value; }); }); } @@ -291,17 +291,17 @@ class BrnProgressBarChartPainter extends CustomPainter { int barBundleCount = this.barBundleList.length; this.barItemEnumerator((int barBundleIndex, BrnProgressBarBundle barBundle, int barGroupIndex, BrnProgressBarItem barItem) { - barItem.percentage = barItem.value / this.maxValue!; + barItem.percentage = barItem.value / this.maxValue; if (null != barItem.hintValue) { - barItem.hintPercentage = barItem.hintValue! / this.maxValue!; + barItem.hintPercentage = barItem.hintValue! / this.maxValue; } if (BarChartStyle.horizontal == this.barChartStyle) { //水平方向的柱状图 Offset leftTop = Offset( this.yAxisRect.right, - (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * + (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * barGroupIndex + this.yAxis.leadingSpace); double width = this.contentRect.width * barItem.percentage; @@ -325,7 +325,7 @@ class BrnProgressBarChartPainter extends CustomPainter { this.yAxisRect.width + this.xAxis.leadingSpace + barBundleIndex * this.singleBarWidth! + - (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * + (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * barGroupIndex, this.xAxisRect.top); double width = this.singleBarWidth!; @@ -338,7 +338,7 @@ class BrnProgressBarChartPainter extends CustomPainter { barItem.barGroupAxisCenter = Offset( this.yAxisRect.width + this.xAxis.leadingSpace + - (barBundleCount * this.singleBarWidth! + this.barGroupSpace!) * + (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * barGroupIndex + (barBundleCount * this.singleBarWidth!) / 2, this.xAxisRect.top); From 72df28f98387306449452def1add7977ddb14cd1 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 15:24:52 +0800 Subject: [PATCH 09/20] fix progress bar chart some value is required --- .../brn_progress_bar_chart_painter.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart index 36b80125..eb475db4 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart @@ -133,7 +133,7 @@ class BrnProgressBarBundle { /// 根据参数对 x y 坐标轴以及柱状图进行绘制 class BrnProgressBarChartPainter extends CustomPainter { /// 柱状图的样式 - final BarChartStyle? barChartStyle; + final BarChartStyle barChartStyle; /// x轴 final ChartAxis xAxis; @@ -148,7 +148,7 @@ class BrnProgressBarChartPainter extends CustomPainter { final double barGroupSpace; /// 单个柱形宽度 - final double? singleBarWidth; + final double singleBarWidth; /// 柱状图的最大值,柱状图的宽/高会依此值计算 final double barMaxValue; @@ -186,12 +186,12 @@ class BrnProgressBarChartPainter extends CustomPainter { final double _xAxisHeight = 22; BrnProgressBarChartPainter( - {this.barChartStyle, + {required this.barChartStyle, required this.xAxis, required this.yAxis, required this.barBundleList, required this.barGroupSpace, - this.singleBarWidth, + required this.singleBarWidth, required this.barMaxValue, this.drawX = true, this.drawY = true, @@ -301,11 +301,11 @@ class BrnProgressBarChartPainter extends CustomPainter { //水平方向的柱状图 Offset leftTop = Offset( this.yAxisRect.right, - (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * + (barBundleCount * this.singleBarWidth + this.barGroupSpace) * barGroupIndex + this.yAxis.leadingSpace); double width = this.contentRect.width * barItem.percentage; - double height = this.singleBarWidth!; + double height = this.singleBarWidth; Rect barRect = Rect.fromLTWH(leftTop.dx, leftTop.dy, width, height); barItem.barRect = barRect; @@ -324,11 +324,11 @@ class BrnProgressBarChartPainter extends CustomPainter { Offset leftBottom = Offset( this.yAxisRect.width + this.xAxis.leadingSpace + - barBundleIndex * this.singleBarWidth! + - (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * + barBundleIndex * this.singleBarWidth + + (barBundleCount * this.singleBarWidth + this.barGroupSpace) * barGroupIndex, this.xAxisRect.top); - double width = this.singleBarWidth!; + double width = this.singleBarWidth; double height = this.contentRect.height * barItem.percentage; Rect barRect = Rect.fromLTWH(leftBottom.dx, leftBottom.dy - height, width, height); @@ -338,9 +338,9 @@ class BrnProgressBarChartPainter extends CustomPainter { barItem.barGroupAxisCenter = Offset( this.yAxisRect.width + this.xAxis.leadingSpace + - (barBundleCount * this.singleBarWidth! + this.barGroupSpace) * + (barBundleCount * this.singleBarWidth + this.barGroupSpace) * barGroupIndex + - (barBundleCount * this.singleBarWidth!) / 2, + (barBundleCount * this.singleBarWidth) / 2, this.xAxisRect.top); // BarHintRect From d775beaa68328274bb4ffbd0beb4ed52435408e3 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 15:27:37 +0800 Subject: [PATCH 10/20] fix brn_line_paint _path is not null --- lib/src/components/charts/broken_line/brn_line_painter.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index 270433b2..5627667a 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -191,7 +191,7 @@ class BrnLinePainter extends BrnBasePainter { var pointArr = []; if (item.points != null && item.points!.isNotEmpty) { - Path? _path = Path(); + Path _path = Path(); Path _shadowPath = Path(); if (xDialValues != null && xDialValues!.isNotEmpty) { From 3fa95cd48cb193865ead830d6bb102d4c0559084 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 15:58:26 +0800 Subject: [PATCH 11/20] fix brn_funnel_chart properties is not null --- lib/src/components/charts/funnel_chart.dart | 262 ++++++++++---------- 1 file changed, 130 insertions(+), 132 deletions(-) diff --git a/lib/src/components/charts/funnel_chart.dart b/lib/src/components/charts/funnel_chart.dart index 884f5256..463222b9 100644 --- a/lib/src/components/charts/funnel_chart.dart +++ b/lib/src/components/charts/funnel_chart.dart @@ -156,14 +156,14 @@ abstract class RenderFunnelChart extends RenderBox ContainerRenderObjectMixin, RenderBoxContainerDefaultsMixin { RenderFunnelChart({ - double? layerMargin, - double? layerHeight, - int? layerCount, - double? maxLayerWidth, - double? minLayerWidth, - Offset? childOffset, - MarkerAlignment? alignment, - BrnFunnelLayerPainter? layerPainter, + required double layerMargin, + required double layerHeight, + required int layerCount, + required double maxLayerWidth, + required double minLayerWidth, + required Offset childOffset, + required MarkerAlignment alignment, + required BrnFunnelLayerPainter layerPainter, }) : _layerMargin = layerMargin, _layerHeight = layerHeight, _layerCount = layerCount, @@ -173,81 +173,81 @@ abstract class RenderFunnelChart extends RenderBox _alignment = alignment, _layerPainter = layerPainter; - MarkerAlignment? _alignment; + MarkerAlignment _alignment; - MarkerAlignment? get alignment => _alignment; + MarkerAlignment get alignment => _alignment; - set alignment(MarkerAlignment? value) { + set alignment(MarkerAlignment value) { if (value == _alignment) return; _alignment = value; markNeedsLayout(); } - BrnFunnelLayerPainter? get layerPainter => _layerPainter; + BrnFunnelLayerPainter get layerPainter => _layerPainter; - BrnFunnelLayerPainter? _layerPainter; + BrnFunnelLayerPainter _layerPainter; - set layerPainter(BrnFunnelLayerPainter? value) { + set layerPainter(BrnFunnelLayerPainter value) { if (value == _layerPainter) return; _layerPainter = value; markNeedsPaint(); } - double? get layerMargin => _layerMargin; + double get layerMargin => _layerMargin; - double? _layerMargin; + double _layerMargin; - set layerMargin(double? value) { + set layerMargin(double value) { if (value == _layerMargin) return; _layerMargin = value; markNeedsLayout(); } - double? get layerHeight => _layerHeight; + double get layerHeight => _layerHeight; - double? _layerHeight; + double _layerHeight; - set layerHeight(double? value) { + set layerHeight(double value) { if (value == _layerHeight) return; _layerHeight = value; markNeedsLayout(); } - int? get layerCount => _layerCount; + int get layerCount => _layerCount; - int? _layerCount; + int _layerCount; - set layerCount(int? value) { + set layerCount(int value) { if (value == _layerCount) return; _layerCount = value; markNeedsLayout(); } - double? get maxLayerWidth => _maxLayerWidth; + double get maxLayerWidth => _maxLayerWidth; - double? _maxLayerWidth; + double _maxLayerWidth; - set maxLayerWidth(double? value) { + set maxLayerWidth(double value) { if (value == _maxLayerWidth) return; _maxLayerWidth = value; markNeedsLayout(); } - double? get minLayerWidth => _minLayerWidth; + double get minLayerWidth => _minLayerWidth; - double? _minLayerWidth; + double _minLayerWidth; - set minLayerWidth(double? value) { + set minLayerWidth(double value) { if (value == _minLayerWidth) return; _minLayerWidth = value; markNeedsLayout(); } - Offset? get childOffset => _childOffset; + Offset get childOffset => _childOffset; - Offset? _childOffset; + Offset _childOffset; - set childOffset(Offset? value) { + set childOffset(Offset value) { if (value == _childOffset) return; _childOffset = value; markNeedsLayout(); @@ -319,17 +319,17 @@ class BrnFunnelRender extends RenderFunnelChart { static const double HALF_PIXEL = 0.5; BrnFunnelRender({ - double? layerHeight, - double? layerMargin, - int? layerCount, - double? maxLayerWidth, - double? minLayerWidth, - Offset? childOffset, + required double layerHeight, + required double layerMargin, + required int layerCount, + required double maxLayerWidth, + required double minLayerWidth, + required Offset childOffset, bool? gradient, List? layerColors, - MarkerAlignment? alignment, - BrnFunnelLayerPainter? layerPainter, - FunnelShape? shape, + required MarkerAlignment alignment, + required BrnFunnelLayerPainter layerPainter, + required FunnelShape shape, }) : _shape = shape, _paint = Paint()..isAntiAlias = true, super( @@ -343,7 +343,7 @@ class BrnFunnelRender extends RenderFunnelChart { layerPainter: layerPainter, ); - FunnelShape? _shape; + FunnelShape _shape; Paint _paint; bool _hasVisualOverflow = false; @@ -367,13 +367,13 @@ class BrnFunnelRender extends RenderFunnelChart { double top, bottom, left; int num = 0; while (child != null) { - top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; - bottom = top + layerMargin! + layerHeight!; + top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; + bottom = top + layerMargin + layerHeight; left = (intrinsicHeight - bottom) * - (maxLayerWidth! - minLayerWidth!) / + (maxLayerWidth - minLayerWidth) / intrinsicHeight + - minLayerWidth! + - childOffset!.dx; + minLayerWidth + + childOffset.dx; if (child == firstChild) { extent = max(extent!, left + mainChildSizeGetter(child)); @@ -390,50 +390,50 @@ class BrnFunnelRender extends RenderFunnelChart { @override double getIntrinsicDimensionVertical( double? width, double mainChildSizeGetter(RenderBox child)?) { - return layerCount! * layerHeight! + (layerCount! - 1) * layerMargin!; + return layerCount * layerHeight + (layerCount - 1) * layerMargin; } @override void performLayout() { _hasVisualOverflow = false; - double? intrinsicWidth = maxLayerWidth; - double intrinsicHeight = layerHeight! * layerCount! + - (childCount >= layerCount! - ? layerMargin! * childCount - : layerMargin! * (layerCount! - 1)); + double intrinsicWidth = maxLayerWidth; + double intrinsicHeight = layerHeight * layerCount + + (childCount >= layerCount + ? layerMargin * childCount + : layerMargin * (layerCount - 1)); RenderBox? child = firstChild; late double top, bottom, left, right; int num = 0; while (child != null) { if (alignment == MarkerAlignment.center) { - top = (num + 1) * layerHeight! + num * layerMargin! + childOffset!.dy; + top = (num + 1) * layerHeight + num * layerMargin + childOffset.dy; } else { - top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; + top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; } if (alignment == MarkerAlignment.center) { - bottom = top + layerMargin!; + bottom = top + layerMargin; } else { - bottom = top + layerMargin! + layerHeight!; + bottom = top + layerMargin + layerHeight; } if (alignment == MarkerAlignment.center) { - left = 0 + childOffset!.dx; + left = 0 + childOffset.dx; right = constraints.maxWidth; } else if (alignment == MarkerAlignment.right) { left = (intrinsicHeight - bottom) * - (maxLayerWidth! - minLayerWidth!) / + (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + - (minLayerWidth! + maxLayerWidth!) / 2 + - childOffset!.dx; + (minLayerWidth + maxLayerWidth) / 2 + + childOffset.dx; right = constraints.maxWidth; } else if (alignment == MarkerAlignment.left) { left = 0; right = constraints.maxWidth - - maxLayerWidth! + - bottom * (maxLayerWidth! - minLayerWidth!) / (2 * intrinsicHeight) + - childOffset!.dx; + maxLayerWidth + + bottom * (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + + childOffset.dx; } final BrnFunnelChartParentData childParentData = @@ -444,39 +444,39 @@ class BrnFunnelRender extends RenderFunnelChart { minWidth: 0, maxWidth: constraints.maxWidth, minHeight: 0, - maxHeight: layerMargin!); + maxHeight: layerMargin); } else if (alignment == MarkerAlignment.right) { childConstraints = BoxConstraints( minWidth: 0, maxWidth: right - left > 0 ? right - left : 0, minHeight: 0, - maxHeight: layerMargin! + layerHeight!); + maxHeight: layerMargin + layerHeight); } else if (alignment == MarkerAlignment.left) { childConstraints = BoxConstraints( minWidth: 0, maxWidth: right - left > 0 ? right - left : 0, minHeight: 0, - maxHeight: layerMargin! + layerHeight!); + maxHeight: layerMargin + layerHeight); } child.layout(childConstraints, parentUsesSize: true); final Size childSize = child.size; if (alignment == MarkerAlignment.center) { - intrinsicWidth = max(intrinsicWidth!, childSize.width); + intrinsicWidth = max(intrinsicWidth, childSize.width); } else if (alignment == MarkerAlignment.right) { - intrinsicWidth = max(intrinsicWidth!, left + childSize.width); + intrinsicWidth = max(intrinsicWidth, left + childSize.width); } else if (alignment == MarkerAlignment.left) { intrinsicWidth = max( - intrinsicWidth!, - maxLayerWidth! + + intrinsicWidth, + maxLayerWidth + childSize.width - bottom * - (maxLayerWidth! - minLayerWidth!) / + (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight)); } num++; child = childParentData.nextSibling; } - Size intrinsicSize = Size(intrinsicWidth!, intrinsicHeight); + Size intrinsicSize = Size(intrinsicWidth, intrinsicHeight); if (intrinsicSize.width > constraints.maxWidth || intrinsicSize.height > constraints.maxHeight) { _hasVisualOverflow = true; @@ -507,26 +507,24 @@ class BrnFunnelRender extends RenderFunnelChart { child.parentData as BrnFunnelChartParentData; if (alignment == MarkerAlignment.center) { childParentData.offset = - Offset(0, ((num * layerMargin!) + (num + 1) * layerHeight!)) + + Offset(0, ((num * layerMargin) + (num + 1) * layerHeight)) + _centerOffset; } else if (alignment == MarkerAlignment.right) { - top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; - bottom = top + layerMargin! + layerHeight!; + top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; + bottom = top + layerMargin + layerHeight; left = (intrinsicHeight - bottom) * - (maxLayerWidth! - minLayerWidth!) / + (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + - (minLayerWidth! + maxLayerWidth!) / 2 + - childOffset!.dx; + (minLayerWidth + maxLayerWidth) / 2 + + childOffset.dx; childParentData.offset = Offset(left, top) + _centerOffset; } else if (alignment == MarkerAlignment.left) { - top = (num + 0.5) * layerHeight! + num * layerMargin! + childOffset!.dy; - bottom = top + layerMargin! + layerHeight!; + top = (num + 0.5) * layerHeight + num * layerMargin + childOffset.dy; + bottom = top + layerMargin + layerHeight; right = size.width - - maxLayerWidth! + - (bottom) * - (maxLayerWidth! - minLayerWidth!) / - (2 * intrinsicHeight) + - childOffset!.dx; + maxLayerWidth + + (bottom) * (maxLayerWidth - minLayerWidth) / (2 * intrinsicHeight) + + childOffset.dx; left = right - child.size.width; childParentData.offset = Offset(left, top) + _centerOffset; } @@ -546,33 +544,33 @@ class BrnFunnelRender extends RenderFunnelChart { canvas.translate(rect.left, rect.top); //绘制漏斗layer - for (int i = 0; i < layerCount!; i++) { + for (int i = 0; i < layerCount; i++) { late Offset topLeft, bottomRight; if (alignment == MarkerAlignment.center) { - topLeft = Offset((size.width - maxLayerWidth!) / 2, - i * layerHeight! + i * layerMargin!); - bottomRight = Offset((size.width + maxLayerWidth!) / 2, - (i + 1) * layerHeight! + i * layerMargin!); + topLeft = Offset((size.width - maxLayerWidth) / 2, + i * layerHeight + i * layerMargin); + bottomRight = Offset((size.width + maxLayerWidth) / 2, + (i + 1) * layerHeight + i * layerMargin); //绘制背景 } else if (alignment == MarkerAlignment.right) { - topLeft = Offset(0, i * layerHeight! + i * layerMargin!); + topLeft = Offset(0, i * layerHeight + i * layerMargin); bottomRight = - Offset(maxLayerWidth!, (i + 1) * layerHeight! + i * layerMargin!); + Offset(maxLayerWidth, (i + 1) * layerHeight + i * layerMargin); } else if (alignment == MarkerAlignment.left) { topLeft = Offset( - size.width - maxLayerWidth!, i * layerHeight! + i * layerMargin!); + size.width - maxLayerWidth, i * layerHeight + i * layerMargin); bottomRight = - Offset(size.width, (i + 1) * layerHeight! + i * layerMargin!); + Offset(size.width, (i + 1) * layerHeight + i * layerMargin); } //绘制layer背景色 - if (!layerPainter!.isGradient(i)) { + if (!layerPainter.isGradient(i)) { //单色背景 - _paint.color = layerPainter!.getLayerColors(i)[0]; + _paint.color = layerPainter.getLayerColors(i)[0]; canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); } else { //渐变背景 ui.Gradient gradient = ui.Gradient.linear( - topLeft, bottomRight, layerPainter!.getLayerColors(i)); + topLeft, bottomRight, layerPainter.getLayerColors(i)); _paint.shader = gradient; canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), _paint); } @@ -580,51 +578,51 @@ class BrnFunnelRender extends RenderFunnelChart { //绘制layer文案 double? safeLeft, safeTop, safeRight, safeBottom; if (_shape == FunnelShape.LeftAndRight) { - safeTop = i * layerHeight! + i * layerMargin!; + safeTop = i * layerHeight + i * layerMargin; if (alignment == MarkerAlignment.right) { - safeLeft = ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + safeLeft = ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); - safeRight = maxLayerWidth! - - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + safeRight = maxLayerWidth - + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); } else if (alignment == MarkerAlignment.left) { safeLeft = size.width - - maxLayerWidth! + - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + maxLayerWidth + + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); safeRight = size.width - - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); } else { - safeLeft = (size.width - maxLayerWidth!) / 2 + - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + safeLeft = (size.width - maxLayerWidth) / 2 + + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); - safeRight = (size.width + maxLayerWidth!) / 2 - - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + safeRight = (size.width + maxLayerWidth) / 2 - + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); } - safeBottom = safeTop + layerHeight!; + safeBottom = safeTop + layerHeight; } else { - safeTop = i * layerHeight! + i * layerMargin!; - safeBottom = safeTop + layerHeight!; + safeTop = i * layerHeight + i * layerMargin; + safeBottom = safeTop + layerHeight; if (alignment == MarkerAlignment.right) { safeLeft = 0; - safeRight = maxLayerWidth! - - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + safeRight = maxLayerWidth - + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); } else if (alignment == MarkerAlignment.left) { safeLeft = size.width - - maxLayerWidth! + - ((i + 1) * layerHeight! + i * layerMargin!) * - (maxLayerWidth! - minLayerWidth!) / + maxLayerWidth + + ((i + 1) * layerHeight + i * layerMargin) * + (maxLayerWidth - minLayerWidth) / (size.height * 2); safeRight = maxLayerWidth; } else { @@ -632,8 +630,8 @@ class BrnFunnelRender extends RenderFunnelChart { safeRight = maxLayerWidth; } } - layerPainter! - .paintLayer(canvas, safeLeft, safeTop, safeRight!, safeBottom, i); + layerPainter.paintLayer( + canvas, safeLeft, safeTop, safeRight, safeBottom, i); } _paint ..blendMode = BlendMode.dstOut @@ -641,11 +639,11 @@ class BrnFunnelRender extends RenderFunnelChart { ..shader = null; late double topLeftX; if (alignment == MarkerAlignment.center) { - topLeftX = (size.width - maxLayerWidth!) / 2; + topLeftX = (size.width - maxLayerWidth) / 2; } else if (alignment == MarkerAlignment.right) { topLeftX = 0; } else if (alignment == MarkerAlignment.left) { - topLeftX = size.width - maxLayerWidth!; + topLeftX = size.width - maxLayerWidth; } Path path; @@ -658,7 +656,7 @@ class BrnFunnelRender extends RenderFunnelChart { //高版本flutter无此问题 path.moveTo(topLeftX - HALF_PIXEL, -HALF_PIXEL); path.lineTo(topLeftX - HALF_PIXEL, size.height + HALF_PIXEL); - path.lineTo((maxLayerWidth! - minLayerWidth!) / 2 + topLeftX, + path.lineTo((maxLayerWidth - minLayerWidth) / 2 + topLeftX, size.height + HALF_PIXEL); path.close(); canvas.drawPath(path, _paint); @@ -667,10 +665,10 @@ class BrnFunnelRender extends RenderFunnelChart { if (_shape == FunnelShape.LeftAndRight || alignment == MarkerAlignment.right) { path = Path(); - path.moveTo(maxLayerWidth! + topLeftX + HALF_PIXEL, -HALF_PIXEL); + path.moveTo(maxLayerWidth + topLeftX + HALF_PIXEL, -HALF_PIXEL); path.lineTo( - maxLayerWidth! + topLeftX + HALF_PIXEL, size.height + HALF_PIXEL); - path.lineTo((maxLayerWidth! + minLayerWidth!) / 2 + topLeftX, + maxLayerWidth + topLeftX + HALF_PIXEL, size.height + HALF_PIXEL); + path.lineTo((maxLayerWidth + minLayerWidth) / 2 + topLeftX, size.height + HALF_PIXEL); path.close(); canvas.drawPath(path, _paint); From b409f7d693026c710eece373f67853b282430096 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 16:20:48 +0800 Subject: [PATCH 12/20] fix brn_radar_chart properties is not null --- lib/src/components/charts/radar_chart.dart | 212 ++++++++++----------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/lib/src/components/charts/radar_chart.dart b/lib/src/components/charts/radar_chart.dart index 6e90ebca..4e7e2804 100644 --- a/lib/src/components/charts/radar_chart.dart +++ b/lib/src/components/charts/radar_chart.dart @@ -207,30 +207,30 @@ class RenderRadarChart extends RenderBox Offset _overflowOffset = Offset.zero; Offset _centerOffset = Offset.zero; - double? _radius; - double? _markerMargin; - int? _sideCount; - double? _maxValue; - int? _levelCount; - Color? _axisLineColor; - bool? _crossedAxiLine; - double? _rotateAngle; - List? _offset; - - BrnRadarChartDataProvider? _dataProvider; + double _radius; + double _markerMargin; + int _sideCount; + double _maxValue; + int _levelCount; + Color _axisLineColor; + bool _crossedAxiLine; + double _rotateAngle; + List _offset; + + BrnRadarChartDataProvider _dataProvider; RenderRadarChart({ - double? radius, - double? markerMargin, - int? sideCount, - double? maxValue, - double? rotateAngle, - List? offset, - BrnRadarChartDataProvider? provider, - int? levelCount, - Color? axisLineColor, - bool? crossedAxisLine, - double? animateProgress, + required double radius, + required double markerMargin, + required int sideCount, + required double maxValue, + required double rotateAngle, + required List offset, + required BrnRadarChartDataProvider provider, + required int levelCount, + required Color axisLineColor, + required bool crossedAxisLine, + required double animateProgress, }) : _radius = radius, _markerMargin = markerMargin, _maxValue = maxValue, @@ -247,91 +247,91 @@ class RenderRadarChart extends RenderBox _animateProgress = animateProgress, _sideCount = sideCount; - double? _animateProgress; + double _animateProgress; - double? get animateProgress => _animateProgress; + double get animateProgress => _animateProgress; - set animateProgress(double? value) { + set animateProgress(double value) { if (value == _animateProgress) return; _animateProgress = value; markNeedsPaint(); } - double? get radius => _radius; + double get radius => _radius; - set radius(double? value) { + set radius(double value) { if (value == _radius) return; _radius = value; markNeedsLayout(); } - double? get markerMargin => _markerMargin; + double get markerMargin => _markerMargin; - set markerMargin(double? value) { + set markerMargin(double value) { if (value == _markerMargin) return; _markerMargin = value; markNeedsLayout(); } - int? get sideCount => _sideCount; + int get sideCount => _sideCount; - set sideCount(int? value) { + set sideCount(int value) { if (value == _sideCount) return; _sideCount = value; markNeedsLayout(); } - double? get maxValue => _maxValue; + double get maxValue => _maxValue; - set maxValue(double? value) { + set maxValue(double value) { if (value == _maxValue) return; _maxValue = value; markNeedsPaint(); } - int? get levelCount => _levelCount; + int get levelCount => _levelCount; - set levelCount(int? value) { + set levelCount(int value) { if (value == _levelCount) return; _levelCount = value; markNeedsPaint(); } - BrnRadarChartDataProvider? get dataProvider => _dataProvider; + BrnRadarChartDataProvider get dataProvider => _dataProvider; - set dataProvider(BrnRadarChartDataProvider? value) { + set dataProvider(BrnRadarChartDataProvider value) { if (value == _dataProvider) return; _dataProvider = value; markNeedsPaint(); } - Color? get axisLineColor => _axisLineColor; + Color get axisLineColor => _axisLineColor; - set axisLineColor(Color? value) { + set axisLineColor(Color value) { if (value == _axisLineColor) return; _axisLineColor = value; markNeedsPaint(); } - double? get rotateAngle => _rotateAngle; + double get rotateAngle => _rotateAngle; - set rotateAngle(double? value) { + set rotateAngle(double value) { if (value == _rotateAngle) return; _rotateAngle = value; markNeedsLayout(); } - List? get offset => _offset; + List get offset => _offset; - set offset(List? value) { + set offset(List value) { if (value == _offset) return; _offset = value; markNeedsLayout(); } - bool? get crossedAxisLine => _crossedAxiLine; + bool get crossedAxisLine => _crossedAxiLine; - set crossedAxisLine(bool? value) { + set crossedAxisLine(bool value) { if (value == _crossedAxiLine) return; _crossedAxiLine = value; markNeedsPaint(); @@ -353,24 +353,24 @@ class RenderRadarChart extends RenderBox while (child != null) { final BrnRadarChartParentData childParentData = child.parentData as BrnRadarChartParentData; - double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); - x = _radius! * sin(angle); + double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); + x = _radius * sin(angle); if (x >= 0) { if (angle == 0 || angle == pi) { x = x + mainChildSizeGetter(child) / 2; } else if (angle == pi / 2) { - x = x + _markerMargin! + mainChildSizeGetter(child); + x = x + _markerMargin + mainChildSizeGetter(child); } else { - x = x + mainChildSizeGetter(child) + _markerMargin! * sin(angle); + x = x + mainChildSizeGetter(child) + _markerMargin * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = x - _markerMargin! - mainChildSizeGetter(child); + x = x - _markerMargin - mainChildSizeGetter(child); } else { - x = x - mainChildSizeGetter(child) + _markerMargin! * sin(angle); + x = x - mainChildSizeGetter(child) + _markerMargin * sin(angle); } } - x = x + _offset![i].dx; + x = x + _offset[i].dx; minX = min(x, minX); maxX = max(x, maxX); child = childParentData.nextSibling; @@ -388,27 +388,27 @@ class RenderRadarChart extends RenderBox while (child != null) { final BrnRadarChartParentData childParentData = child.parentData as BrnRadarChartParentData; - double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); - y = _radius! * cos(angle); + double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); + y = _radius * cos(angle); if (y >= 0) { if (angle == 0) { - y = y + mainChildSizeGetter(child) + _markerMargin!; + y = y + mainChildSizeGetter(child) + _markerMargin; } else if (angle == pi / 2) { y = y + mainChildSizeGetter(child) / 2; } else { - y = y + mainChildSizeGetter(child) + _markerMargin! * cos(angle); + y = y + mainChildSizeGetter(child) + _markerMargin * cos(angle); } } else { if (angle == pi) { - y = y - mainChildSizeGetter(child) - _markerMargin!; + y = y - mainChildSizeGetter(child) - _markerMargin; } else if (angle == pi * 3 / 2) { y = y - mainChildSizeGetter(child) / 2; } else { - y = y - mainChildSizeGetter(child) + _markerMargin! * cos(angle); + y = y - mainChildSizeGetter(child) + _markerMargin * cos(angle); } } - y = y + _offset![i].dy; + y = y + _offset[i].dy; minY = min(y, minY); maxY = max(y, maxY); child = childParentData.nextSibling; @@ -460,44 +460,44 @@ class RenderRadarChart extends RenderBox BoxConstraints childConstraints = constraints.loosen(); child.layout(childConstraints, parentUsesSize: true); final Size childSize = child.size; - double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); - x = _radius! * sin(angle); - y = _radius! * cos(angle); + double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); + x = _radius * sin(angle); + y = _radius * cos(angle); if (y >= 0) { if (angle == 0) { - y = y + childSize.height + _markerMargin! * cos(angle); + y = y + childSize.height + _markerMargin * cos(angle); } else if (angle == pi / 2) { y = y + childSize.height / 2; } else { - y = y + childSize.height + _markerMargin! * cos(angle); + y = y + childSize.height + _markerMargin * cos(angle); } } else { if (angle == pi) { - y = y - childSize.height + _markerMargin! * cos(angle); + y = y - childSize.height + _markerMargin * cos(angle); } else if (angle == pi * 3 / 2) { y = y - child.size.height / 2; } else { - y = y - childSize.height + _markerMargin! * cos(angle); + y = y - childSize.height + _markerMargin * cos(angle); } } - y = y + _offset![i].dy; + y = y + _offset[i].dy; if (x >= 0) { if (angle == 0 || angle == pi) { x = x + child.size.width / 2; } else if (angle == pi / 2) { - x = x + _markerMargin! + childSize.width; + x = x + _markerMargin + childSize.width; } else { - x = x + childSize.width + _markerMargin! * sin(angle); + x = x + childSize.width + _markerMargin * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = x - _markerMargin! - child.size.width; + x = x - _markerMargin - child.size.width; } else { - x = x - childSize.width + _markerMargin! * sin(angle); + x = x - childSize.width + _markerMargin * sin(angle); } } - x = x + _offset![i].dx; + x = x + _offset[i].dx; minX = min(x, minX); maxX = max(x, maxX); minY = min(y, minY); @@ -522,31 +522,31 @@ class RenderRadarChart extends RenderBox child = firstChild; i = 0; while (child != null) { - double angle = (2 * pi * i / _sideCount! + _rotateAngle!) % (2 * pi); - double x = _radius! * sin(angle); //在以多边形中心为原点的坐标 - double y = _radius! * cos(angle); //在以多边形中心为原点的坐标 + double angle = (2 * pi * i / _sideCount + _rotateAngle) % (2 * pi); + double x = _radius * sin(angle); //在以多边形中心为原点的坐标 + double y = _radius * cos(angle); //在以多边形中心为原点的坐标 final BrnRadarChartParentData childParentData = child.parentData as BrnRadarChartParentData; //转换到左上角为原点中的坐标 if (y >= 0) { if (angle == 0) { - y = size.height / 2 - y - child.size.height - _markerMargin!; + y = size.height / 2 - y - child.size.height - _markerMargin; } else if (angle == pi / 2) { y = size.height / 2 - y - child.size.height / 2; } else { y = size.height / 2 - y - child.size.height - - _markerMargin! * cos(angle); + _markerMargin * cos(angle); } } else { if (angle == pi) { - y = size.height / 2 - y + _markerMargin!; + y = size.height / 2 - y + _markerMargin; } else if (angle == pi * 3 / 2) { y = size.height / 2 - y - child.size.height / 2; } else { - y = size.height / 2 - y - _markerMargin! * cos(angle); + y = size.height / 2 - y - _markerMargin * cos(angle); } } @@ -554,21 +554,21 @@ class RenderRadarChart extends RenderBox if (angle == 0 || angle == pi) { x = size.width / 2 + x - child.size.width / 2; } else if (angle == pi / 2) { - x = size.width / 2 + x + _markerMargin!; + x = size.width / 2 + x + _markerMargin; } else { - x = size.width / 2 + x + _markerMargin! * sin(angle); + x = size.width / 2 + x + _markerMargin * sin(angle); } } else { if (angle == pi * 3 / 2) { - x = size.width / 2 + x - _markerMargin! - child.size.width; + x = size.width / 2 + x - _markerMargin - child.size.width; } else { x = size.width / 2 + x - child.size.width + - _markerMargin! * sin(angle); + _markerMargin * sin(angle); } } - childParentData.offset = Offset(x, y) + _offset![i] + _centerOffset; + childParentData.offset = Offset(x, y) + _offset[i] + _centerOffset; child = childParentData.nextSibling; i++; } @@ -594,7 +594,7 @@ class RenderRadarChart extends RenderBox //translate the canvas's top left to widget'center since flutter canvas rotate pivot can only be the top left. canvas.translate( translateX + _centerOffset.dx, translateY + _centerOffset.dy); - canvas.rotate(_rotateAngle!); + canvas.rotate(_rotateAngle); _drawBackground(canvas, rect.size, translateX, translateY); _drawRadar(canvas); canvas.restore(); @@ -614,18 +614,18 @@ class RenderRadarChart extends RenderBox double translateX, double translateY, ) { - _axisPainter..color = _axisLineColor!; + _axisPainter..color = _axisLineColor; _axisPainter..strokeWidth = 0.5; //calculate the side length of polygon. - double centralAngle = 2 * pi / _sideCount!; - if (_crossedAxiLine!) { - for (int i = 0; i < _sideCount!; i++) { + double centralAngle = 2 * pi / _sideCount; + if (_crossedAxiLine) { + for (int i = 0; i < _sideCount; i++) { canvas.save(); - canvas.rotate(2 * pi * i / _sideCount!); + canvas.rotate(2 * pi * i / _sideCount); Path path = Path(); path ..moveTo(0, 0) - ..lineTo(0, -_radius!); + ..lineTo(0, -_radius); canvas.drawPath( dashPath( path, @@ -636,8 +636,8 @@ class RenderRadarChart extends RenderBox } } - for (int i = 1; i <= _levelCount!; i++) { - double r = _radius! * i / _levelCount!; + for (int i = 1; i <= _levelCount; i++) { + double r = _radius * i / _levelCount; double sideLength = 2 * r * sin(centralAngle / 2); double dx = sideLength * sin((pi - centralAngle) / 2); double dy = sideLength * cos((pi - centralAngle) / 2); @@ -647,9 +647,9 @@ class RenderRadarChart extends RenderBox double px2 = px1 + dx; double py2 = py1 + dy; //draw the polygon - for (int i = 0; i < _sideCount!; i++) { + for (int i = 0; i < _sideCount; i++) { canvas.save(); - canvas.rotate(2 * pi * i / _sideCount!); + canvas.rotate(2 * pi * i / _sideCount); Path path = Path(); path ..moveTo(px1, py1) @@ -661,16 +661,16 @@ class RenderRadarChart extends RenderBox } void _drawRadar(Canvas canvas) { - int radarCount = _dataProvider!.getRadarCount(); + int radarCount = _dataProvider.getRadarCount(); for (int radarIndex = 0; radarIndex < radarCount; radarIndex++) { - BrnRadarChartStyle radarStyle = _dataProvider!.getRadarStyle(radarIndex); + BrnRadarChartStyle radarStyle = _dataProvider.getRadarStyle(radarIndex); _radarPainter ..isAntiAlias = true ..color = radarStyle.strokeColor ..strokeWidth = radarStyle.strokeWidth; - List values = _dataProvider!.getRadarValues(radarIndex); + List values = _dataProvider.getRadarValues(radarIndex); Path path = Path(); - double percent = values[0] / _maxValue!; + double percent = values[0] / _maxValue; double angle = 0; if (percent > 1) { percent = 1; @@ -679,15 +679,15 @@ class RenderRadarChart extends RenderBox } double x, y; List dotPosition = []; - x = _radius! * percent * sin(angle) * _animateProgress!; - y = -_radius! * percent * cos(angle) * _animateProgress!; + x = _radius * percent * sin(angle) * _animateProgress; + y = -_radius * percent * cos(angle) * _animateProgress; dotPosition.add(Offset(x, y)); path.moveTo(x, y); - for (int i = 1; i < _sideCount!; i++) { - angle = 2 * pi * i / _sideCount!; - percent = values[i] / _maxValue!; - x = _radius! * percent * sin(angle) * _animateProgress!; - y = -_radius! * percent * cos(angle) * _animateProgress!; + for (int i = 1; i < _sideCount; i++) { + angle = 2 * pi * i / _sideCount; + percent = values[i] / _maxValue; + x = _radius * percent * sin(angle) * _animateProgress; + y = -_radius * percent * cos(angle) * _animateProgress; path.lineTo(x, y); dotPosition.add(Offset(x, y)); } From 3a8b8a5ef00e78558c4484a1fddfff68db7406b9 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 16:39:19 +0800 Subject: [PATCH 13/20] fix brn_line_painter not null values --- .../charts/broken_line/brn_line_painter.dart | 104 +++++++++--------- .../broken_line/brn_line_y_painter.dart | 45 ++++---- 2 files changed, 70 insertions(+), 79 deletions(-) diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index 5627667a..ff584dc8 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -8,8 +8,8 @@ import 'package:flutter/material.dart'; import 'package:path_drawing/path_drawing.dart'; class BrnLinePainter extends BrnBasePainter { - int lineSelectIndex = -1; - int pointSelectIndex = -1; + final int lineSelectIndex; + final int pointSelectIndex; /// xy轴线条的宽度 double xyLineWidth = 0.5; @@ -21,13 +21,13 @@ class BrnLinePainter extends BrnBasePainter { Color? yDialColor; /// 刻度的宽度或者高度 - double rulerWidth; + final double rulerWidth; /// x轴最小值,最大值,用来计算内部绘制点的x轴位置 double? xDialMin, xDialMax; /// y轴最小值,最大值,用来计算内部绘制点的y轴位置 - double? yDialMin, yDialMax; + final double yDialMin, yDialMax; /// x轴 刻度 List? xDialValues; @@ -47,9 +47,9 @@ class BrnLinePainter extends BrnBasePainter { /// 绘制线条的参数内容 List lines; - bool? isShowXText, isShowYText; + bool isShowXText, isShowYText; - bool showPointDashLine; + final bool showPointDashLine; /// 默认的边距 static const double basePadding = 0; @@ -62,12 +62,8 @@ class BrnLinePainter extends BrnBasePainter { double? selectX; double? selectY; - double? _startX = 0.0, - _endX = 0.0, - _startY = 0.0, - _endY = 0.0, - _fixedHeight, - _fixedWidth; + double _startX = 0.0, _endX = 0.0, _startY = 0.0, _endY = 0.0; + double? _fixedHeight, _fixedWidth; late List _lineCanvasModels; List> _linePointPositions = []; @@ -84,23 +80,24 @@ class BrnLinePainter extends BrnBasePainter { BrnLinePainter( this.lines, { - this.lineSelectIndex = -1, - this.pointSelectIndex = -1, - this.showPointDashLine = true, - this.xDialColor, - this.yDialColor, - this.rulerWidth = 4, - this.xDialMin, - this.xDialMax, - this.xDialValues, - this.yDialMin, - this.yDialMax, - this.yDialValues, - this.isShowHintX = true, - this.isShowHintY = false, - this.hintLineSolid = true, - this.hintLineColor, + required this.lineSelectIndex, + required this.pointSelectIndex, + required this.showPointDashLine, + required this.xDialColor, + required this.yDialColor, + required this.rulerWidth, + required this.xDialMin, + required this.xDialMax, + required this.xDialValues, + required this.yDialMin, + required this.yDialMax, + required this.yDialValues, + required this.isShowHintX, + required this.isShowHintY, + required this.hintLineSolid, + required this.hintLineColor, this.isShowXText = false, + this.isShowYText = false, }) { if (xDialValues == null) { for (var i = 1; i < lines.length; i++) { @@ -165,19 +162,17 @@ class BrnLinePainter extends BrnBasePainter { BrnThemeConfigurator.instance.getConfig().commonConfig.colorTextBase; xDialMin ??= 0; xDialMax ??= 1; - yDialMin ??= 0; - yDialMax ??= 1; } ///计算边界 void _initBorder(Size size) { _endX = size.width; _startY = size.height; - if (isShowXText!) { + if (isShowXText) { _endY = 20.0; } - _fixedHeight = _startY! - _endY! - paddingTop; - _fixedWidth = _endX! - _startX!; + _fixedHeight = _startY - _endY - paddingTop; + _fixedWidth = _endX - _startX; } ///计算Path @@ -196,13 +191,13 @@ class BrnLinePainter extends BrnBasePainter { if (xDialValues != null && xDialValues!.isNotEmpty) { for (var i = 0; i < item.points!.length; i++) { - var xPosition = _startX! + + var xPosition = _startX + ((item.points![i].x - xDialMin!) / (xDialMax! - xDialMin!) * _fixedWidth!); - var yPosition = _startY! - - ((item.points![i].y - yDialMin!) / - (yDialMax! - yDialMin!) * + var yPosition = _startY - + ((item.points![i].y - yDialMin) / + (yDialMax - yDialMin) * _fixedHeight!); pointArr.add(Point(xPosition, yPosition)); } @@ -211,10 +206,10 @@ class BrnLinePainter extends BrnBasePainter { var W = _fixedWidth! / (xScaleCount > 1 ? (xScaleCount - 1) : 1); //两个点之间的x方向距离 for (var i = 0; i < item.points!.length; i++) { - var xPosition = _startX! + W * i; - var yPosition = _startY! - - ((item.points![i].y - yDialMin!) / - (yDialMax! - yDialMin!) * + var xPosition = _startX + W * i; + var yPosition = _startY - + ((item.points![i].y - yDialMin) / + (yDialMax - yDialMin) * _fixedHeight!); pointArr.add(Point(xPosition, yPosition)); } @@ -307,8 +302,8 @@ class BrnLinePainter extends BrnBasePainter { void _drawXy(Canvas canvas, Paint paint) { if (isShowHintY) { canvas.drawLine( - Offset(_startX!, _startY!), - Offset(_startX!, _endY! - basePadding), + Offset(_startX, _startY), + Offset(_startX, _endY - basePadding), paint..color = yDialColor!); //y轴 } @@ -342,7 +337,7 @@ class BrnLinePainter extends BrnBasePainter { _drawXRuleByPointPosition( tpX, canvas, - _startX! + + _startX + (xDialValues![i].value - xDialMin!) / (xDialMax! - xDialMin!) * _fixedWidth!, @@ -353,14 +348,13 @@ class BrnLinePainter extends BrnBasePainter { void _drawXRuleByPointPosition( TextPainter tpX, Canvas canvas, double xPosition, Paint paint) { - tpX.paint( - canvas, Offset(xPosition - tpX.width / 2, _startY! + textPadding)); + tpX.paint(canvas, Offset(xPosition - tpX.width / 2, _startY + textPadding)); // 绘制与 X 轴对应的垂直辅助线 if (isShowHintY) { var tempPath = Path() - ..moveTo(xPosition, _startY!) - ..lineTo(xPosition, _endY! - basePadding); + ..moveTo(xPosition, _startY) + ..lineTo(xPosition, _endY - basePadding); if (hintLineSolid) { canvas.drawPath(tempPath, paint..color = hintLineColor!); } else { @@ -376,8 +370,8 @@ class BrnLinePainter extends BrnBasePainter { // 绘制 x轴刻度 if (isShowHintX) { - canvas.drawLine(Offset(xPosition, _startY!), - Offset(xPosition, _startY! + rulerWidth), paint..color = xDialColor!); + canvas.drawLine(Offset(xPosition, _startY), + Offset(xPosition, _startY + rulerWidth), paint..color = xDialColor!); } } @@ -393,7 +387,7 @@ class BrnLinePainter extends BrnBasePainter { tileMode: TileMode.clamp, colors: element.shaderColors!) .createShader( - Rect.fromLTWH(_startX!, _endY!, _fixedWidth!, _fixedHeight!)); + Rect.fromLTWH(_startX, _endY, _fixedWidth!, _fixedHeight!)); canvas ..drawPath( shadowPathElement!, @@ -477,12 +471,12 @@ class BrnLinePainter extends BrnBasePainter { var x = _linePointPositions[lineSelectIndex][pointSelectIndex].x; var xPath = Path() - ..moveTo(x as double, _startY!) - ..lineTo(x, _endY! - basePadding); + ..moveTo(x as double, _startY) + ..lineTo(x, _endY - basePadding); var y = _linePointPositions[lineSelectIndex][pointSelectIndex].y; var yPath = Path() - ..moveTo(_startX!, y as double) - ..lineTo(_endX!, y); + ..moveTo(_startX, y as double) + ..lineTo(_endX, y); if (showPointDashLine) { canvas.drawPath( dashPath( diff --git a/lib/src/components/charts/broken_line/brn_line_y_painter.dart b/lib/src/components/charts/broken_line/brn_line_y_painter.dart index df30dab1..712d2c87 100644 --- a/lib/src/components/charts/broken_line/brn_line_y_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_y_painter.dart @@ -12,8 +12,8 @@ const double _basePadding = 0; const double _contentTopPadding = 10; class BrnLineYPainter extends BrnBasePainter { - int lineSelectIndex = -1; - int pointSelectIndex = -1; + final int lineSelectIndex; + final int pointSelectIndex; /// xy轴线条的宽度 double xyLineWidth = 0.5; @@ -25,16 +25,16 @@ class BrnLineYPainter extends BrnBasePainter { Color? yColor; /// y轴刻度的偏移量 - double yHintLineOffset; + final double yHintLineOffset; /// 刻度的宽度或者高度 double rulerWidth; /// y轴最大值,用来计算内部绘制点的y轴位置 - double? yMin, yMax; + final double yMin, yMax; /// y轴左侧刻度显示,不传则没有 - List? yDialValues; + final List? yDialValues; /// x、y轴的辅助线 bool isShowXHintLine, isShowYHintLine; @@ -57,21 +57,21 @@ class BrnLineYPainter extends BrnBasePainter { BrnLineYPainter( this.lines, { - this.lineSelectIndex = -1, - this.pointSelectIndex = -1, - this.yHintLineOffset = 20, - this.xColor, - this.yColor, - this.rulerWidth = 4, - this.yMin, - this.yMax, - this.yDialValues, - this.isShowXHintLine = true, - this.isShowYHintLine = false, - this.isHintLineSolid = true, - this.hintLineColor, - this.isShowXDialText = false, - this.isShowYDialText = false, + required this.lineSelectIndex, + required this.pointSelectIndex, + required this.yHintLineOffset, + required this.xColor, + required this.yColor, + required this.rulerWidth, + required this.yMin, + required this.yMax, + required this.yDialValues, + required this.isShowXHintLine, + required this.isShowYHintLine, + required this.isHintLineSolid, + required this.hintLineColor, + required this.isShowXDialText, + required this.isShowYDialText, }); @override @@ -106,9 +106,6 @@ class BrnLineYPainter extends BrnBasePainter { .colorTextSecondary; hintLineColor ??= BrnThemeConfigurator.instance.getConfig().commonConfig.colorTextBase; - - yMin ??= 0; - yMax ??= 1; } /// 计算边界 @@ -150,7 +147,7 @@ class BrnLineYPainter extends BrnBasePainter { var ydialValue = yDialValues![i]; // 绘制y轴文本 - var yLength = (ydialValue.value - yMin!) / (yMax! - yMin!) * _fixedHeight; + var yLength = (ydialValue.value - yMin) / (yMax - yMin) * _fixedHeight; var textY = TextPainter( textAlign: TextAlign.right, ellipsis: '.', From a7f1056f673b27b344fe02035d9cbf497e03b062 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 16:45:49 +0800 Subject: [PATCH 14/20] fix brn_progress_bar_chart error --- .../charts/brn_progress_bar_chart/brn_progress_bar_chart.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart index e17c3e22..fb12f8de 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart.dart @@ -27,7 +27,7 @@ class BrnProgressBarChart extends StatefulWidget { /// 单个柱形宽度,默认 30 final double singleBarWidth; - /// 柱状图的最大值,柱状图的宽/高会依此值计算,默认 0 + /// 柱状图的最大值,柱状图的宽/高会依此值计算,默认 0,为0时自动计算柱状图最大值 final double barMaxValue; /// 柱状图方向,默认 BarChartStyle.vertical @@ -72,7 +72,6 @@ class BrnProgressBarChart extends StatefulWidget { assert(barBundleList[0].barList.length == xAxis.axisItemList.length, '竖直柱状图个数与X轴坐标数目要相等'); } - assert(0 != this.barMaxValue, '柱状图最大值不能为0'); } @override From 33054db4e5b67864282242c462c7773c9741f039 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 18 Jan 2022 17:34:26 +0800 Subject: [PATCH 15/20] brn_broken_line some properties is not null value --- .../charts/broken_line/brn_broken_line.dart | 14 ++++---- .../charts/broken_line/brn_line_painter.dart | 32 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/src/components/charts/broken_line/brn_broken_line.dart b/lib/src/components/charts/broken_line/brn_broken_line.dart index eb94f315..129810dd 100644 --- a/lib/src/components/charts/broken_line/brn_broken_line.dart +++ b/lib/src/components/charts/broken_line/brn_broken_line.dart @@ -295,11 +295,11 @@ class BrnBrokenLineState extends State { void _fillLeftTopPoint( BrnLineTouchData? lineTouchData, - double? startX, - double? endX, - double? startY, - double? endY, - double? fixedHeight, + double startX, + double endX, + double startY, + double endY, + double fixedHeight, Point selectedPoint) { if (lineTouchData == null) return; @@ -314,13 +314,13 @@ class BrnBrokenLineState extends State { var selectY = selectedPoint.y; double y = 0; double x = 0; - if (selectY <= (startY! - endY!) / 2) { + if (selectY <= (startY - endY) / 2) { y = selectY + padding; } else { y = selectY - (lineTouchData.tipWindowSize.height) - padding; } - if (selectX <= (endX! - startX!) / 2) { + if (selectX <= (endX - startX) / 2) { x = selectX + padding; } else { x = selectX - (lineTouchData.tipWindowSize.width) - padding; diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index ff584dc8..710eceba 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -63,20 +63,20 @@ class BrnLinePainter extends BrnBasePainter { double? selectX; double? selectY; double _startX = 0.0, _endX = 0.0, _startY = 0.0, _endY = 0.0; - double? _fixedHeight, _fixedWidth; + late double _fixedHeight, _fixedWidth; late List _lineCanvasModels; List> _linePointPositions = []; - double? get startX => _startX; + double get startX => _startX; - double? get startY => _startY; + double get startY => _startY; - double? get endX => _endX; + double get endX => _endX; - double? get endY => _endY; + double get endY => _endY; - double? get fixedHeight => _fixedHeight; + double get fixedHeight => _fixedHeight; BrnLinePainter( this.lines, { @@ -194,23 +194,23 @@ class BrnLinePainter extends BrnBasePainter { var xPosition = _startX + ((item.points![i].x - xDialMin!) / (xDialMax! - xDialMin!) * - _fixedWidth!); + _fixedWidth); var yPosition = _startY - ((item.points![i].y - yDialMin) / (yDialMax - yDialMin) * - _fixedHeight!); + _fixedHeight); pointArr.add(Point(xPosition, yPosition)); } } else { var xScaleCount = item.points?.length ?? 0; - var W = _fixedWidth! / + var W = _fixedWidth / (xScaleCount > 1 ? (xScaleCount - 1) : 1); //两个点之间的x方向距离 for (var i = 0; i < item.points!.length; i++) { var xPosition = _startX + W * i; var yPosition = _startY - ((item.points![i].y - yDialMin) / (yDialMax - yDialMin) * - _fixedHeight!); + _fixedHeight); pointArr.add(Point(xPosition, yPosition)); } } @@ -221,8 +221,8 @@ class BrnLinePainter extends BrnBasePainter { /// 生成 Shadow path。 _shadowPath = _getSmoothLinePath(pointArr); _shadowPath - ..lineTo(pointArr[pointArr.length - 1].x as double, _fixedHeight!) - ..lineTo(pointArr[0].x as double, _fixedHeight!) + ..lineTo(pointArr[pointArr.length - 1].x as double, _fixedHeight) + ..lineTo(pointArr[0].x as double, _fixedHeight) ..close(); } else { _path.moveTo(pointArr[0].x as double, pointArr[0].y as double); @@ -236,8 +236,8 @@ class BrnLinePainter extends BrnBasePainter { if (i == pointArr.length - 1) { _shadowPath ..lineTo( - pointArr[pointArr.length - 1].x as double, _fixedHeight!) - ..lineTo(pointArr[0].x as double, _fixedHeight!) + pointArr[pointArr.length - 1].x as double, _fixedHeight) + ..lineTo(pointArr[0].x as double, _fixedHeight) ..close(); } } @@ -340,7 +340,7 @@ class BrnLinePainter extends BrnBasePainter { _startX + (xDialValues![i].value - xDialMin!) / (xDialMax! - xDialMin!) * - _fixedWidth!, + _fixedWidth, paint); } } @@ -387,7 +387,7 @@ class BrnLinePainter extends BrnBasePainter { tileMode: TileMode.clamp, colors: element.shaderColors!) .createShader( - Rect.fromLTWH(_startX, _endY, _fixedWidth!, _fixedHeight!)); + Rect.fromLTWH(_startX, _endY, _fixedWidth, _fixedHeight)); canvas ..drawPath( shadowPathElement!, From 957fecd5d3005eb9f7da9361fe3db15758a9db81 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 19 Jan 2022 16:53:44 +0800 Subject: [PATCH 16/20] replace empty Container to SizedBox.shrink --- .../brn_doughnut_chart_legend.dart | 2 +- .../charts/broken_line/brn_broken_line.dart | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart index e81384cd..14acb767 100644 --- a/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart +++ b/lib/src/components/charts/brn_doughunt_chart/brn_doughnut_chart_legend.dart @@ -49,7 +49,7 @@ class DoughnutChartLegend extends StatelessWidget { children: items, ); } else { - return Container(); + return const SizedBox.shrink(); } } diff --git a/lib/src/components/charts/broken_line/brn_broken_line.dart b/lib/src/components/charts/broken_line/brn_broken_line.dart index 129810dd..be075deb 100644 --- a/lib/src/components/charts/broken_line/brn_broken_line.dart +++ b/lib/src/components/charts/broken_line/brn_broken_line.dart @@ -230,7 +230,7 @@ class BrnBrokenLineState extends State { (lineSelectIndex >= 0 && pointSelectIndex >= 0) ? _buildTouchTipWidget( widget.lines[lineSelectIndex].points![pointSelectIndex]) - : Container(), + : const SizedBox.shrink(), ]), ), ), @@ -278,16 +278,10 @@ class BrnBrokenLineState extends State { width: selectLinePoint.tipWindowSize.width, child: content)); } else { - touchTipWidget = Container( - height: 0, - width: 0, - ); + touchTipWidget = const SizedBox.shrink(); } } else { - touchTipWidget = Container( - height: 0, - width: 0, - ); + touchTipWidget = const SizedBox.shrink(); } return touchTipWidget; From 0b8f3ff54e7a7e91a3bc267f4e174b162715e7f0 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 19 Jan 2022 17:13:36 +0800 Subject: [PATCH 17/20] update progress_bar_chart null safety value by hand --- .../brn_progress_bar_chart_painter.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart index eb475db4..4576437a 100644 --- a/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart +++ b/lib/src/components/charts/brn_progress_bar_chart/brn_progress_bar_chart_painter.dart @@ -215,7 +215,7 @@ class BrnProgressBarChartPainter extends CustomPainter { } static double maxYAxisWidth(ChartAxis yAxis) { - Size getTextAreaSize(String? text, TextStyle textStyle) { + Size getTextAreaSize(String text, TextStyle textStyle) { TextPainter textPainter = TextPainter( text: TextSpan(text: text, style: textStyle), textDirection: TextDirection.ltr, @@ -625,7 +625,7 @@ class BrnProgressBarChartPainter extends CustomPainter { if (null != barItem.showBarValueText) { TextPainter textPainter = TextPainter( text: TextSpan( - text: barItem.showBarValueText ?? '', + text: barItem.showBarValueText!, style: barItem.showBarValueTextStyle), textDirection: TextDirection.ltr) ..layout(maxWidth: double.infinity, minWidth: 0); @@ -749,7 +749,7 @@ class BrnProgressBarChartPainter extends CustomPainter { }); } - Size getTextAreaSize(String? text, TextStyle textStyle) { + Size getTextAreaSize(String text, TextStyle textStyle) { TextPainter textPainter = TextPainter( text: TextSpan(text: text, style: textStyle), textDirection: TextDirection.ltr, From 08aab3503182d022186df7a35e42825bc45ba0d0 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 19 Jan 2022 17:17:17 +0800 Subject: [PATCH 18/20] update broken_line null safety values by hand --- .../charts/broken_line/brn_broken_line.dart | 14 +++---- .../charts/broken_line/brn_line_data.dart | 10 ++--- .../charts/broken_line/brn_line_painter.dart | 40 +++++++++---------- 3 files changed, 27 insertions(+), 37 deletions(-) diff --git a/lib/src/components/charts/broken_line/brn_broken_line.dart b/lib/src/components/charts/broken_line/brn_broken_line.dart index be075deb..d83b7d20 100644 --- a/lib/src/components/charts/broken_line/brn_broken_line.dart +++ b/lib/src/components/charts/broken_line/brn_broken_line.dart @@ -177,7 +177,7 @@ class BrnBrokenLineState extends State { scrollDirection: Axis.horizontal, child: GestureDetector( onPanDown: (DragDownDetails e) { - for (var i = 0; i < widget.lines[0].points!.length; i++) { + for (var i = 0; i < widget.lines[0].points.length; i++) { int lineIndex = _lineWithXPainter.lineIndexCompute(e.localPosition, i); if (lineIndex >= 0) { @@ -186,7 +186,7 @@ class BrnBrokenLineState extends State { Point selectedPoint = _lineWithXPainter.selectedPoint( lineSelectIndex, pointSelectIndex); _fillLeftTopPoint( - widget.lines[lineSelectIndex].points![pointSelectIndex] + widget.lines[lineSelectIndex].points[pointSelectIndex] .lineTouchData, _lineWithXPainter.startX, _lineWithXPainter.endX, @@ -229,7 +229,7 @@ class BrnBrokenLineState extends State { ), (lineSelectIndex >= 0 && pointSelectIndex >= 0) ? _buildTouchTipWidget( - widget.lines[lineSelectIndex].points![pointSelectIndex]) + widget.lines[lineSelectIndex].points[pointSelectIndex]) : const SizedBox.shrink(), ]), ), @@ -242,9 +242,7 @@ class BrnBrokenLineState extends State { Widget _buildTouchTipWidget(BrnPointData pointData) { Widget touchTipWidget; BrnLineTouchData? selectLinePoint = pointData.lineTouchData; - if (selectLinePoint != null && - pointData.isClickable && - selectLinePoint.onTouch != null) { + if (pointData.isClickable && selectLinePoint.onTouch != null) { var content = selectLinePoint.onTouch!(); if (content is String) { touchTipWidget = Positioned( @@ -288,15 +286,13 @@ class BrnBrokenLineState extends State { } void _fillLeftTopPoint( - BrnLineTouchData? lineTouchData, + BrnLineTouchData lineTouchData, double startX, double endX, double startY, double endY, double fixedHeight, Point selectedPoint) { - if (lineTouchData == null) return; - if (pointSelectIndex < 0 && lineSelectIndex < 0) { lineTouchData.x = -1.0; lineTouchData.y = -1.0; diff --git a/lib/src/components/charts/broken_line/brn_line_data.dart b/lib/src/components/charts/broken_line/brn_line_data.dart index 542ac0a4..e8ea7466 100644 --- a/lib/src/components/charts/broken_line/brn_line_data.dart +++ b/lib/src/components/charts/broken_line/brn_line_data.dart @@ -1,5 +1,3 @@ - - import 'package:bruno/src/theme/brn_theme_configurator.dart'; import 'package:flutter/material.dart'; @@ -35,7 +33,7 @@ class BrnPointData { /// 折线节点的点击击事件是否可用 bool isClickable; - BrnLineTouchData? lineTouchData; + BrnLineTouchData lineTouchData; BrnPointData( {this.x = 0, @@ -44,7 +42,7 @@ class BrnPointData { this.pointText, this.pointTextStyle, this.isClickable: true, - this.lineTouchData}) { + required this.lineTouchData}) { pointText ??= '$y'; pointTextStyle ??= TextStyle( fontWeight: FontWeight.w500, @@ -79,7 +77,7 @@ class BrnLineTouchData { /// 每条线的定义 class BrnPointsLine { /// 点集合 - List? points; + List points; /// 线宽 double lineWidth; @@ -122,7 +120,7 @@ class BrnPointsLine { this.pointInnerRadius, this.pointInnerColor, this.isCurve = false, - this.points, + required this.points, this.isShowPoint: true, this.isShowPointText = false, this.shaderColors, diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index 710eceba..bcae042f 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -101,7 +101,7 @@ class BrnLinePainter extends BrnBasePainter { }) { if (xDialValues == null) { for (var i = 1; i < lines.length; i++) { - assert(lines[i - 1].points!.length == lines[i].points!.length, + assert(lines[i - 1].points.length == lines[i].points.length, '折线${i - 1}和$i条线的节点数不一致'); } } @@ -185,30 +185,30 @@ class BrnLinePainter extends BrnBasePainter { var paths = [], shadowPaths = []; var pointArr = []; - if (item.points != null && item.points!.isNotEmpty) { + if (item.points.isNotEmpty) { Path _path = Path(); Path _shadowPath = Path(); if (xDialValues != null && xDialValues!.isNotEmpty) { - for (var i = 0; i < item.points!.length; i++) { + for (var i = 0; i < item.points.length; i++) { var xPosition = _startX + - ((item.points![i].x - xDialMin!) / + ((item.points[i].x - xDialMin!) / (xDialMax! - xDialMin!) * _fixedWidth); var yPosition = _startY - - ((item.points![i].y - yDialMin) / + ((item.points[i].y - yDialMin) / (yDialMax - yDialMin) * _fixedHeight); pointArr.add(Point(xPosition, yPosition)); } } else { - var xScaleCount = item.points?.length ?? 0; + var xScaleCount = item.points.length; var W = _fixedWidth / (xScaleCount > 1 ? (xScaleCount - 1) : 1); //两个点之间的x方向距离 - for (var i = 0; i < item.points!.length; i++) { + for (var i = 0; i < item.points.length; i++) { var xPosition = _startX + W * i; var yPosition = _startY - - ((item.points![i].y - yDialMin) / + ((item.points[i].y - yDialMin) / (yDialMax - yDialMin) * _fixedHeight); pointArr.add(Point(xPosition, yPosition)); @@ -310,9 +310,7 @@ class BrnLinePainter extends BrnBasePainter { if (lines.isNotEmpty) { //绘制x轴的文字部分 for (var item in lines) { - if (item.points != null && - item.points!.isNotEmpty && - item.isShowXDial) { + if (item.points.isNotEmpty && item.isShowXDial) { _drawXRuler(canvas, paint..color = xDialColor!, item.points); } } @@ -320,7 +318,7 @@ class BrnLinePainter extends BrnBasePainter { } ///x轴刻度 & 辅助线 - void _drawXRuler(Canvas canvas, Paint paint, List? points) { + void _drawXRuler(Canvas canvas, Paint paint, List points) { if (xDialValues != null && xDialValues!.isNotEmpty) { // 获取刻度长度 for (var i = 0; i < xDialValues!.length; i++) { @@ -512,21 +510,19 @@ class BrnLinePainter extends BrnBasePainter { lineIndex < _linePointPositions.length; lineIndex++) { BrnPointsLine item = lines[lineIndex]; - if (item.isShowPointText && - item.points != null && - item.points!.isNotEmpty) { - var length = item.points!.length; + if (item.isShowPointText && item.points.isNotEmpty) { + var length = item.points.length; for (var i = 0; i < length; i++) { - if (item.points![i].pointText == null || - item.points![i].pointText!.length == 0) { + if (item.points[i].pointText == null || + item.points[i].pointText!.length == 0) { continue; } var tpX = TextPainter( textAlign: TextAlign.center, ellipsis: '.', text: TextSpan( - text: '${item.points![i].pointText}', - style: item.points![i].pointTextStyle), + text: '${item.points[i].pointText}', + style: item.points[i].pointTextStyle), textDirection: TextDirection.ltr) ..layout(); double adjustOffset = isAdjustPosition(lineIndex, @@ -536,10 +532,10 @@ class BrnLinePainter extends BrnBasePainter { tpX.paint( canvas, Offset( - (item.points![i].offset.dx) + + (item.points[i].offset.dx) + _linePointPositions[lineIndex][i].x - tpX.width / 2, - (item.points![i].offset.dy) + + (item.points[i].offset.dy) + _linePointPositions[lineIndex][i].y + adjustOffset)); } From c54d660a419ae6f5598eb54fdaed3e1bb11917b5 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 19 Jan 2022 17:22:52 +0800 Subject: [PATCH 19/20] update funnel_chart null safety value by hand --- lib/src/components/charts/funnel_chart.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/components/charts/funnel_chart.dart b/lib/src/components/charts/funnel_chart.dart index 463222b9..4a70327b 100644 --- a/lib/src/components/charts/funnel_chart.dart +++ b/lib/src/components/charts/funnel_chart.dart @@ -576,7 +576,7 @@ class BrnFunnelRender extends RenderFunnelChart { } //绘制layer文案 - double? safeLeft, safeTop, safeRight, safeBottom; + late double safeLeft, safeTop, safeRight, safeBottom; if (_shape == FunnelShape.LeftAndRight) { safeTop = i * layerHeight + i * layerMargin; if (alignment == MarkerAlignment.right) { @@ -719,7 +719,7 @@ abstract class BrnFunnelLayerPainter { ///[canvas] 提供的画布,对画布进行旋转裁剪等特殊操作,一定要调用[canvas.save()]操作。 ///[left],[top],[right],[bottom]是提供给调用者绘制的一个安全区域,超过这个区域限制,可能会被截断 ///[layerIndex] 漏斗的layer index。 - void paintLayer(Canvas canvas, double left, double? top, double right, + void paintLayer(Canvas canvas, double left, double top, double right, double bottom, int layerIndex); } From b5970efc3d714b2659c71ffa9cd7c1d1c8359da1 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 19 Jan 2022 18:00:20 +0800 Subject: [PATCH 20/20] make LineCanvasModel immutable --- .../charts/broken_line/brn_line_painter.dart | 96 +++++++++---------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/lib/src/components/charts/broken_line/brn_line_painter.dart b/lib/src/components/charts/broken_line/brn_line_painter.dart index bcae042f..5b0f850f 100644 --- a/lib/src/components/charts/broken_line/brn_line_painter.dart +++ b/lib/src/components/charts/broken_line/brn_line_painter.dart @@ -182,7 +182,7 @@ class BrnLinePainter extends BrnBasePainter { _linePointPositions.clear(); // 计算点和线的 数据,用于渲染。 for (var item in lines) { - var paths = [], shadowPaths = []; + var paths = [], shadowPaths = []; var pointArr = []; if (item.points.isNotEmpty) { @@ -253,10 +253,10 @@ class BrnLinePainter extends BrnBasePainter { shadowPaths: shadowPaths, shaderColors: item.shaderColors, points: item.isShowPoint ? pointArr : null, - pointColor: item.pointColor, - pointInnerColor: item.pointInnerColor, + pointColor: item.pointColor!, + pointInnerColor: item.pointInnerColor!, pointRadius: item.pointRadius, - pointInnerRadius: item.pointInnerRadius)); + pointInnerRadius: item.pointInnerRadius!)); } } } @@ -388,25 +388,23 @@ class BrnLinePainter extends BrnBasePainter { Rect.fromLTWH(_startX, _endY, _fixedWidth, _fixedHeight)); canvas ..drawPath( - shadowPathElement!, + shadowPathElement, Paint() ..shader = shader ..isAntiAlias = true ..style = PaintingStyle.fill); }); } - if (element.paths != null) { - //路径 - element.paths!.forEach((pathElement) { - var pathPaint = Paint() - ..isAntiAlias = true - ..strokeWidth = element.pathWidth! - ..strokeCap = StrokeCap.round - ..color = element.pathColor! - ..style = PaintingStyle.stroke; - canvas.drawPath(pathElement!, pathPaint); - }); - } + //路径 + element.paths.forEach((pathElement) { + var pathPaint = Paint() + ..isAntiAlias = true + ..strokeWidth = element.pathWidth + ..strokeCap = StrokeCap.round + ..color = element.pathColor + ..style = PaintingStyle.stroke; + canvas.drawPath(pathElement, pathPaint); + }); if (element.points != null) { //点 // 画圆环的计算规则是: @@ -417,13 +415,13 @@ class BrnLinePainter extends BrnBasePainter { var pointPaint = Paint() ..isAntiAlias = true ..strokeCap = StrokeCap.round - ..color = element.pointColor! - ..strokeWidth = element.pointRadius! - element.pointInnerRadius! + ..color = element.pointColor + ..strokeWidth = element.pointRadius - element.pointInnerRadius ..style = PaintingStyle.stroke; //描边为居中描边 canvas.drawCircle( Offset(pointElement.x as double, pointElement.y as double), - (element.pointRadius! - element.pointInnerRadius!) / 2 + - element.pointInnerRadius!, + (element.pointRadius - element.pointInnerRadius) / 2 + + element.pointInnerRadius, pointPaint); }); @@ -441,12 +439,12 @@ class BrnLinePainter extends BrnBasePainter { ..style = PaintingStyle.fill; canvas.drawCircle( Offset(pointElement.x as double, pointElement.y as double), - element.pointInnerRadius!, + element.pointInnerRadius, pointPaintBg); if (currentLineIndex == lineSelectIndex && currentPointIndex == pointSelectIndex) { - color = element.pointInnerColor!; + color = element.pointInnerColor; } var pointPaint = Paint() ..isAntiAlias = true @@ -455,7 +453,7 @@ class BrnLinePainter extends BrnBasePainter { ..style = PaintingStyle.fill; canvas.drawCircle( Offset(pointElement.x as double, pointElement.y as double), - element.pointInnerRadius!, + element.pointInnerRadius, pointPaint); }); } @@ -575,31 +573,31 @@ class BrnLinePainter extends BrnBasePainter { //绘制图表的计算之后的结果模型集 class LineCanvasModel { - List? paths; - Color? pathColor; - double? pathWidth; - - List? shadowPaths; - List? shaderColors; - - List? points; - Color? pointColor; - double? pointRadius; - double? pointInnerRadius; - Color? pointInnerColor; - bool showPointText; - - LineCanvasModel({ - this.paths, - this.pathColor, - this.pathWidth, - this.shadowPaths, - this.shaderColors, - this.points, - this.pointColor, - this.pointRadius, - this.pointInnerRadius, - this.pointInnerColor, + final List paths; + final Color pathColor; + final double pathWidth; + + final List? shadowPaths; + final List? shaderColors; + + final List? points; + final Color pointColor; + final double pointRadius; + final double pointInnerRadius; + final Color pointInnerColor; + final bool showPointText; + + const LineCanvasModel({ + required this.paths, + required this.pathColor, + required this.pathWidth, + required this.shadowPaths, + required this.shaderColors, + required this.points, + required this.pointColor, + required this.pointRadius, + required this.pointInnerRadius, + required this.pointInnerColor, this.showPointText = false, }); }