-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
line_chart_renderer.dart
113 lines (99 loc) · 2.96 KB
/
line_chart_renderer.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import 'package:fl_chart/fl_chart.dart';
import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart';
import 'package:fl_chart/src/chart/base/base_chart/render_base_chart.dart';
import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart';
import 'package:fl_chart/src/utils/canvas_wrapper.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
// coverage:ignore-start
/// Low level LineChart Widget.
class LineChartLeaf extends LeafRenderObjectWidget {
const LineChartLeaf({
super.key,
required this.data,
required this.targetData,
});
final LineChartData data;
final LineChartData targetData;
@override
RenderLineChart createRenderObject(BuildContext context) => RenderLineChart(
context,
data,
targetData,
MediaQuery.of(context).textScaler,
);
@override
void updateRenderObject(BuildContext context, RenderLineChart renderObject) {
renderObject
..data = data
..targetData = targetData
..textScaler = MediaQuery.of(context).textScaler
..buildContext = context;
}
}
// coverage:ignore-end
/// Renders our LineChart, also handles hitTest.
class RenderLineChart extends RenderBaseChart<LineTouchResponse> {
RenderLineChart(
BuildContext context,
LineChartData data,
LineChartData targetData,
TextScaler textScaler,
) : _data = data,
_targetData = targetData,
_textScaler = textScaler,
super(
targetData.lineTouchData,
context,
);
LineChartData get data => _data;
LineChartData _data;
set data(LineChartData value) {
if (_data == value) return;
_data = value;
markNeedsPaint();
}
LineChartData get targetData => _targetData;
LineChartData _targetData;
set targetData(LineChartData value) {
if (_targetData == value) return;
_targetData = value;
super.updateBaseTouchData(_targetData.lineTouchData);
markNeedsPaint();
}
TextScaler get textScaler => _textScaler;
TextScaler _textScaler;
set textScaler(TextScaler value) {
if (_textScaler == value) return;
_textScaler = value;
markNeedsPaint();
}
// We couldn't mock [size] property of this class, that's why we have this
@visibleForTesting
Size? mockTestSize;
@visibleForTesting
LineChartPainter painter = LineChartPainter();
PaintHolder<LineChartData> get paintHolder =>
PaintHolder(data, targetData, textScaler);
@override
void paint(PaintingContext context, Offset offset) {
final canvas = context.canvas
..save()
..translate(offset.dx, offset.dy);
painter.paint(
buildContext,
CanvasWrapper(canvas, mockTestSize ?? size),
paintHolder,
);
canvas.restore();
}
@override
LineTouchResponse getResponseAtLocation(Offset localPosition) {
final touchedSpots = painter.handleTouch(
localPosition,
mockTestSize ?? size,
paintHolder,
);
return LineTouchResponse(touchedSpots);
}
}