Skip to content

Commit 553d53e

Browse files
committed
Temp commit
1 parent 803409c commit 553d53e

File tree

5 files changed

+167
-54
lines changed

5 files changed

+167
-54
lines changed

example/lib/main.dart

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import 'package:fl_chart_app/cubits/app/app_cubit.dart';
2-
import 'package:fl_chart_app/presentation/resources/app_resources.dart';
3-
import 'package:flutter/material.dart';
4-
import 'package:flutter_bloc/flutter_bloc.dart';
5-
import 'package:google_fonts/google_fonts.dart';
1+
import 'dart:math';
62

7-
import 'presentation/router/app_router.dart';
3+
import 'package:fl_chart/fl_chart.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:vector_math/vector_math.dart';
86

97
void main() {
108
runApp(const MyApp());
@@ -15,23 +13,32 @@ class MyApp extends StatelessWidget {
1513

1614
@override
1715
Widget build(BuildContext context) {
18-
return MultiBlocProvider(
19-
providers: [
20-
BlocProvider<AppCubit>(create: (BuildContext context) => AppCubit()),
21-
],
22-
child: MaterialApp.router(
23-
title: AppTexts.appName,
24-
theme: ThemeData(
25-
brightness: Brightness.dark,
26-
useMaterial3: true,
27-
textTheme: GoogleFonts.assistantTextTheme(
28-
Theme.of(context).textTheme.apply(
29-
bodyColor: AppColors.mainTextColor3,
16+
return MaterialApp(
17+
home: Scaffold(
18+
body: Center(
19+
child: SizedBox(
20+
height: 300,
21+
child: LineChart(
22+
LineChartData(
23+
lineBarsData: [
24+
LineChartBarData(
25+
spots: List.generate(
26+
360 * 1,
27+
(index) => FlSpot(
28+
index.toDouble(),
29+
sin(radians(index.toDouble())),
30+
),
31+
),
32+
),
33+
],
34+
horizontalZoomConfig: const ZoomConfig(
35+
enabled: true,
36+
amount: 20,
3037
),
38+
),
39+
),
3140
),
32-
scaffoldBackgroundColor: AppColors.pageBackground,
3341
),
34-
routerConfig: appRouterConfig,
3542
),
3643
);
3744
}

lib/src/chart/base/axis_chart/axis_chart_data.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
2929
super.borderData,
3030
required super.touchData,
3131
ExtraLinesData? extraLinesData,
32+
this.horizontalZoomConfig = const ZoomConfig(),
3233
}) : gridData = gridData ?? const FlGridData(),
3334
rangeAnnotations = rangeAnnotations ?? const RangeAnnotations(),
3435
baselineX = baselineX ?? 0,
@@ -62,6 +63,8 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
6263
/// Extra horizontal or vertical lines to draw on the chart.
6364
final ExtraLinesData extraLinesData;
6465

66+
final ZoomConfig horizontalZoomConfig;
67+
6568
/// Used for equality check, see [EquatableMixin].
6669
@override
6770
List<Object?> get props => [
@@ -79,6 +82,7 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
7982
borderData,
8083
touchData,
8184
extraLinesData,
85+
horizontalZoomConfig,
8286
];
8387
}
8488

@@ -1312,3 +1316,19 @@ class ExtraLinesData with EquatableMixin {
13121316
extraLinesOnTop,
13131317
];
13141318
}
1319+
1320+
class ZoomConfig with EquatableMixin {
1321+
const ZoomConfig({
1322+
this.enabled = false,
1323+
this.amount = 10,
1324+
});
1325+
1326+
final bool enabled;
1327+
final double amount;
1328+
1329+
@override
1330+
List<Object?> get props => [
1331+
enabled,
1332+
amount,
1333+
];
1334+
}

lib/src/chart/base/axis_chart/axis_chart_scaffold_widget.dart

Lines changed: 91 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,104 +19,161 @@ import 'package:flutter/material.dart';
1919
/// `left`, `top`, `right`, `bottom` are some place holders to show titles
2020
/// provided by [AxisChartData.titlesData] around the chart
2121
/// `chart` is a centered place holder to show a raw chart.
22-
class AxisChartScaffoldWidget extends StatelessWidget {
22+
class AxisChartScaffoldWidget extends StatefulWidget {
2323
const AxisChartScaffoldWidget({
2424
super.key,
2525
required this.chart,
2626
required this.data,
2727
});
28+
2829
final Widget chart;
2930
final AxisChartData data;
3031

32+
@override
33+
State<AxisChartScaffoldWidget> createState() =>
34+
_AxisChartScaffoldWidgetState();
35+
}
36+
37+
class _AxisChartScaffoldWidgetState extends State<AxisChartScaffoldWidget> {
38+
late ScrollController scrollController;
39+
40+
@override
41+
void initState() {
42+
scrollController = ScrollController();
43+
super.initState();
44+
}
45+
46+
@override
47+
void dispose() {
48+
scrollController.dispose();
49+
super.dispose();
50+
}
51+
3152
bool get showLeftTitles {
32-
if (!data.titlesData.show) {
53+
if (!widget.data.titlesData.show) {
3354
return false;
3455
}
35-
final showAxisTitles = data.titlesData.leftTitles.showAxisTitles;
36-
final showSideTitles = data.titlesData.leftTitles.showSideTitles;
56+
final showAxisTitles = widget.data.titlesData.leftTitles.showAxisTitles;
57+
final showSideTitles = widget.data.titlesData.leftTitles.showSideTitles;
3758
return showAxisTitles || showSideTitles;
3859
}
3960

4061
bool get showRightTitles {
41-
if (!data.titlesData.show) {
62+
if (!widget.data.titlesData.show) {
4263
return false;
4364
}
44-
final showAxisTitles = data.titlesData.rightTitles.showAxisTitles;
45-
final showSideTitles = data.titlesData.rightTitles.showSideTitles;
65+
final showAxisTitles = widget.data.titlesData.rightTitles.showAxisTitles;
66+
final showSideTitles = widget.data.titlesData.rightTitles.showSideTitles;
4667
return showAxisTitles || showSideTitles;
4768
}
4869

4970
bool get showTopTitles {
50-
if (!data.titlesData.show) {
71+
if (!widget.data.titlesData.show) {
5172
return false;
5273
}
53-
final showAxisTitles = data.titlesData.topTitles.showAxisTitles;
54-
final showSideTitles = data.titlesData.topTitles.showSideTitles;
74+
final showAxisTitles = widget.data.titlesData.topTitles.showAxisTitles;
75+
final showSideTitles = widget.data.titlesData.topTitles.showSideTitles;
5576
return showAxisTitles || showSideTitles;
5677
}
5778

5879
bool get showBottomTitles {
59-
if (!data.titlesData.show) {
80+
if (!widget.data.titlesData.show) {
6081
return false;
6182
}
62-
final showAxisTitles = data.titlesData.bottomTitles.showAxisTitles;
63-
final showSideTitles = data.titlesData.bottomTitles.showSideTitles;
83+
final showAxisTitles = widget.data.titlesData.bottomTitles.showAxisTitles;
84+
final showSideTitles = widget.data.titlesData.bottomTitles.showSideTitles;
6485
return showAxisTitles || showSideTitles;
6586
}
6687

6788
List<Widget> stackWidgets(BoxConstraints constraints) {
89+
final chartWidth = constraints.maxWidth -
90+
widget.data.titlesData.allSidesPadding.horizontal;
91+
92+
final xDelta = widget.data.maxX - widget.data.minX;
93+
final largeChartWidth = xDelta * widget.data.horizontalZoomConfig.amount;
94+
6895
final widgets = <Widget>[
6996
Container(
70-
margin: data.titlesData.allSidesPadding,
97+
margin: widget.data.titlesData.allSidesPadding,
7198
decoration: BoxDecoration(
72-
border: data.borderData.isVisible() ? data.borderData.border : null,
99+
border: widget.data.borderData.isVisible()
100+
? widget.data.borderData.border
101+
: null,
73102
),
74-
child: chart,
103+
child: switch (widget.data.horizontalZoomConfig.enabled) {
104+
true => SingleChildScrollView(
105+
controller: scrollController,
106+
scrollDirection: Axis.horizontal,
107+
child: SizedBox(
108+
width: largeChartWidth,
109+
height: constraints.maxHeight,
110+
child: widget.chart,
111+
),
112+
),
113+
false => SizedBox(
114+
width: constraints.maxWidth,
115+
height: constraints.maxHeight,
116+
child: widget.chart,
117+
),
118+
},
75119
),
76120
];
77121

78122
int insertIndex(bool drawBelow) => drawBelow ? 0 : widgets.length;
79123

124+
double? axisMinXOverride;
125+
double? axisMaxXOverride;
126+
if (scrollController.hasClients) {
127+
final xAmount = widget.data.horizontalZoomConfig.amount;
128+
final showingXDelta = chartWidth / xAmount;
129+
axisMinXOverride = scrollController.offset / xAmount;
130+
axisMaxXOverride = axisMinXOverride + showingXDelta;
131+
}
132+
80133
if (showLeftTitles) {
81134
widgets.insert(
82-
insertIndex(data.titlesData.leftTitles.drawBelowEverything),
135+
insertIndex(widget.data.titlesData.leftTitles.drawBelowEverything),
83136
SideTitlesWidget(
84137
side: AxisSide.left,
85-
axisChartData: data,
138+
axisChartData: widget.data,
86139
parentSize: constraints.biggest,
87140
),
88141
);
89142
}
90143

91144
if (showTopTitles) {
92145
widgets.insert(
93-
insertIndex(data.titlesData.topTitles.drawBelowEverything),
146+
insertIndex(widget.data.titlesData.topTitles.drawBelowEverything),
94147
SideTitlesWidget(
95148
side: AxisSide.top,
96-
axisChartData: data,
149+
axisChartData: widget.data,
97150
parentSize: constraints.biggest,
151+
axisMinOverride: axisMinXOverride,
152+
axisMaxOverride: axisMaxXOverride,
98153
),
99154
);
100155
}
101156

102157
if (showRightTitles) {
103158
widgets.insert(
104-
insertIndex(data.titlesData.rightTitles.drawBelowEverything),
159+
insertIndex(widget.data.titlesData.rightTitles.drawBelowEverything),
105160
SideTitlesWidget(
106161
side: AxisSide.right,
107-
axisChartData: data,
162+
axisChartData: widget.data,
108163
parentSize: constraints.biggest,
109164
),
110165
);
111166
}
112167

113168
if (showBottomTitles) {
114169
widgets.insert(
115-
insertIndex(data.titlesData.bottomTitles.drawBelowEverything),
170+
insertIndex(widget.data.titlesData.bottomTitles.drawBelowEverything),
116171
SideTitlesWidget(
117172
side: AxisSide.bottom,
118-
axisChartData: data,
173+
axisChartData: widget.data,
119174
parentSize: constraints.biggest,
175+
axisMinOverride: axisMinXOverride,
176+
axisMaxOverride: axisMaxXOverride,
120177
),
121178
);
122179
}
@@ -125,9 +182,16 @@ class AxisChartScaffoldWidget extends StatelessWidget {
125182

126183
@override
127184
Widget build(BuildContext context) {
128-
return LayoutBuilder(
129-
builder: (context, constraints) {
130-
return Stack(children: stackWidgets(constraints));
185+
return ListenableBuilder(
186+
listenable: scrollController,
187+
builder: (context, child) {
188+
return LayoutBuilder(
189+
builder: (context, constraints) {
190+
return Stack(
191+
children: stackWidgets(constraints),
192+
);
193+
},
194+
);
131195
},
132196
);
133197
}

0 commit comments

Comments
 (0)