一、背景
我们flutter页面里需要展示图表,而且开发时间比较紧张,如果自己绘制,时间肯定不够。于是去pub上逛了一圈,发现几个分数比较高的图表库,fl_chart,flutter_chart,mp_chart。
fl_chart:对Dart版本要求比较高,我的低版本SDK中,extension关键字还在试验阶段,支持不太好。
flutter_chart:功能比较简单,画风也和我们需求的不太一样,而且作者放在github上的博客教程已经失效,所以没有选择。
mp_chart:功能齐备,而且API都和MPAndroidChart差不多,是MPAndroidChart的flutter版本,对于用过MPAndroidChart库的同学来说,很容易上手。有的功能如果不知道mp_chart该如何实现,可以百度MPAndroidChart是怎么实现的,然后照葫芦画瓢。
二、简单使用
1.在pubspec.yaml引入依赖:
dependencies:
mp_chart: ^0.1.9
不过我在这里遇到了几个问题:
问题一:mp_chart引入了image_gallery_saver库,在iOS上用cocopods引入依赖失败,无法运行。
解决方案:clone代码,去掉依赖,注释使用代码,本地引入。这个库在mp_chart里的作用是保存截图,应该可以在example里依赖的,不知道为什么作者会在lib库中引入。
问题二:mp_chart依赖的intl版本与flutter_localizations的冲突。
解决方案:修改intl版本,本地引入。解决版本冲突的详细情况可查看我的另一篇博客:解决flutter 依赖版本冲突的n种方法
由于以上问题都需要本地引入才能解决,所以最终在pubspec.yaml中的引入如下:
dependencies:
mp_chart:
path: mp_chart/
2.代码填充数据:
流程大概如下(以PieChar为例):
- 初始化数据列表
- 构建Entry列表
- 构建DataSet
- 构建Data
- 构建Controller
- 将Data与Controller绑定
- 构建Chart
buildPieChart(){
// 初始化数据列表
List values = [4.0,7.2,3,5.5,6];
//构建Entry列表
List<PieEntry> entryList = [];
for(int i = 0; i < values.length; i++) {
PieEntry entry = PieEntry(value:values[i]);
entryList.add(entry);
}
//构建DataSet
PieDataSet dataSet = PieDataSet(entryList,"label");
//构建Data
PieData data = PieData(dataSet);
//构建Controller
PieChartController controller = PieChartController();
//将Data与Controller绑定
controller.data = data;
//构建Chart
PieChart chart = PieChart(controller);
// 完成!!
return chart;
}
3.一些修饰:
mp_chart功能很强大,它开放了太多可以自定义的属性,例如缩放、旋转、点击等事件,都在内部进行了封装,修改颜色、坐标轴、网格线等基本功能更不在话下。
下面是记录了我开发是需要处理的问题,已经实现方式,非常零散,真正想用的时候看下源码就知道。
环状图
- dataSet.setColors1和setColors2的区别?
答:colors1和colors2一样,不过colors2能改变透明度。- 怎么去掉数字?
答:dataSet.setDrawValues- 怎么去掉解释色块和label?
controller的lengendSettingFunction中,legend.enable = false;- 去掉圆心小环形?
controller的transparentCircleRadiusPercent设置为0.它指透明圆环与外圆半径的占比。- 怎么添加中心圆孔,变成环形?
controller的drawHole默认为true。设为false即没有圆孔- 控制圆的大小
controller的minOffset- 关闭旋转
rotateEnabled不可用。返馈之后已修复。- 为什么在Stack里,环状图宽高不生效?自定义控件会导致Stack错位?点击无效?
绘制Description有bug,设置Description.enable = false 后正常- 怎么添加动画效果?
controller.animator…reset()…animateY2(1000, Easing.EaseInOutQuad);柱状图
- 去掉y轴网格
controller里的axisSettingFunction中,设置axis.drawGridLines = false;- 去掉点击
dataSet.setHighlightEnable(false)- 去掉value
dataSet.setDrawValues(false)- 设置宽度
controller.data.barWidth = 1;- 坐标数字太密集
controller里的axisSettingFunction中,axis.setLabelCount1()- 修改坐标轴字体
controller里的axisSettingFunction中,axis.typeface = TypeFace(fontFamily:“MaoTi”)
由于mp_chart发布不久,还有一些小bug是正常的。不过作者维护很积极,基本上只要在github上提issue,当天就能修复。比如设置Description.enable = true时布局异常问题,还有环状图rotateEnabled = false无效问题,我提了issue之后立刻就修复了。