Skip to content

Commit 6f4c6bb

Browse files
committed
chart data sent when tapped
1 parent e34face commit 6f4c6bb

File tree

15 files changed

+279
-142
lines changed

15 files changed

+279
-142
lines changed

.flutter-plugins-dependencies

Lines changed: 0 additions & 1 deletion
This file was deleted.

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ migrate_working_dir/
2727
**/doc/api/
2828
.dart_tool/
2929
build/
30+
.flutter-plugins
31+
.flutter-plugins-dependencies
32+
.pub-cache/
33+
.pub/
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import 'dart:developer';
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:graphify/graphify.dart';
5+
6+
class ChartClick extends StatefulWidget {
7+
const ChartClick({super.key});
8+
9+
@override
10+
State<ChartClick> createState() => _ChartClickState();
11+
}
12+
13+
class _ChartClickState extends State<ChartClick> {
14+
late final GraphifyController _controller;
15+
String _status = 'Ready to test clicks';
16+
17+
@override
18+
void initState() {
19+
super.initState();
20+
_controller = GraphifyController();
21+
_controller.chartClickedEvent.listen((data) {
22+
debugPrint('listener received: $data');
23+
setState(() {
24+
_status = 'Click received: ${data['name'] ?? 'Unknown'}';
25+
});
26+
27+
log('TEST: Chart click received: $data');
28+
});
29+
}
30+
31+
@override
32+
Widget build(BuildContext context) {
33+
return Column(
34+
children: [
35+
Expanded(
36+
child: Padding(
37+
padding: const EdgeInsets.all(16),
38+
child: Text(
39+
_status,
40+
style: const TextStyle(fontWeight: FontWeight.bold),
41+
textAlign: TextAlign.center,
42+
),
43+
),
44+
),
45+
Container(
46+
height: 400,
47+
margin: const EdgeInsets.all(8),
48+
decoration: BoxDecoration(
49+
border: Border.all(color: Colors.grey),
50+
borderRadius: BorderRadius.circular(8),
51+
),
52+
child: GraphifyView(
53+
controller: _controller,
54+
onConsoleMessage: (msg) {
55+
debugPrint('WebView console: ${(msg as dynamic).message}');
56+
},
57+
initialOptions: const {
58+
"tooltip": {
59+
"trigger": "axis",
60+
"axisPointer": {"type": "shadow"}
61+
},
62+
"legend": {
63+
"data": ["Sales", "Marketing"]
64+
},
65+
"xAxis": {
66+
"type": "category",
67+
"data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
68+
},
69+
"yAxis": {"type": "value"},
70+
"series": [
71+
{
72+
"name": "Sales",
73+
"type": "bar",
74+
"data": [120, 200, 150, 80, 70, 110, 130],
75+
"itemStyle": {"color": "#5470c6"}
76+
},
77+
{
78+
"name": "Marketing",
79+
"type": "bar",
80+
"data": [60, 100, 75, 40, 35, 55, 65],
81+
"itemStyle": {"color": "#91cc75"}
82+
}
83+
]
84+
},
85+
),
86+
),
87+
],
88+
);
89+
}
90+
91+
@override
92+
void dispose() {
93+
_controller.dispose();
94+
super.dispose();
95+
}
96+
}

example/lib/main.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:graphify_example/charts/basic_area_chart.dart';
55
import 'package:graphify_example/charts/basic_bar_chart.dart';
66
import 'package:graphify_example/charts/basic_line_chart.dart';
77
import 'package:graphify_example/charts/candle_stick_brush.dart';
8+
import 'package:graphify_example/charts/chart_click.dart';
89
import 'package:graphify_example/charts/customized_radar_chart.dart';
910
import 'package:graphify_example/charts/graph_webkit_dep.dart';
1011
import 'package:graphify_example/charts/heatmap_discrete_mapping_of_color.dart';
@@ -18,7 +19,6 @@ import 'package:graphify_example/charts/shang_hai_index.dart';
1819
import 'package:graphify_example/charts/stacked_area_chart.dart';
1920
import 'package:graphify_example/charts/tangential_polar_bar_chart.dart';
2021
import 'package:graphify_example/charts/world_population.dart';
21-
import 'package:graphify_example/test_chart_click.dart';
2222
import 'package:url_launcher/url_launcher_string.dart';
2323

2424
void main() {
@@ -29,7 +29,7 @@ class MyApp extends StatelessWidget {
2929
const MyApp({super.key});
3030

3131
static const charts = {
32-
"Chart Click Test": TestChartClick(),
32+
"Chart Click Test": ChartClick(),
3333
"Basic Line Chart": BasicLineChart(),
3434
'Basic Area Chart': BasicAreaChart(),
3535
'Stacked Area Chart': StackedAreaChart(),

example/lib/test_chart_click.dart

Lines changed: 0 additions & 120 deletions
This file was deleted.
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import 'package:graphify/src/controller/interface.dart' as controller_interface;
22

33
class GraphifyController extends controller_interface.GraphifyController {
4-
54
@override
65
void update(Map<String, dynamic>? options) {
76
throw UnimplementedError("update() is not implemented");
87
}
98

9+
@override
10+
Stream<Map<String, dynamic>> get chartClickedEvent =>
11+
throw UnimplementedError("chartClickedEvent is not implemented");
12+
1013
@override
1114
void dispose() {
1215
throw UnimplementedError("dispose() is not implemented");
1316
}
14-
15-
}
17+
}

lib/src/controller/implements/mobile.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import 'package:graphify/src/controller/js_methods.dart';
66
import 'package:webview_flutter/webview_flutter.dart';
77

88
class GraphifyController extends controller_interface.GraphifyController {
9+
final StreamController<Map<String, dynamic>> _clicks =
10+
StreamController<Map<String, dynamic>>.broadcast();
911

1012
late final WebViewController _connector;
1113

@@ -22,7 +24,24 @@ class GraphifyController extends controller_interface.GraphifyController {
2224
}
2325

2426
@override
25-
void dispose() async => _eval(JsMethods.disposeChart, [_quotedUid]);
27+
void dispose() async {
28+
await _clicks.close();
29+
try {
30+
await _eval(JsMethods.disposeChart, [_quotedUid]);
31+
} catch (_) {}
32+
}
33+
34+
@override
35+
Stream<Map<String, dynamic>> get chartClickedEvent => _clicks.stream;
36+
37+
void onChartClick(String message) {
38+
try {
39+
final dynamic decoded = jsonDecode(message);
40+
if (decoded is Map<String, dynamic>) {
41+
_clicks.sink.add(decoded);
42+
}
43+
} catch (_) {}
44+
}
2645

2746
Future<void> _eval(String method, List<String> args) async {
2847
return _connector.runJavaScript(_buildJsMethod(method, args));
@@ -31,5 +50,4 @@ class GraphifyController extends controller_interface.GraphifyController {
3150
String _buildJsMethod(String method, List<String> args) {
3251
return 'window.$method(${args.map((String arg) => arg).join(', ')})';
3352
}
34-
3553
}

lib/src/controller/implements/web.dart

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:async';
12
import 'dart:convert';
23
import 'dart:js_interop';
34
import 'dart:js_interop_unsafe';
@@ -7,6 +8,45 @@ import 'package:graphify/src/controller/js_methods.dart';
78
import 'package:web/web.dart';
89

910
class GraphifyController extends controller_interface.GraphifyController {
11+
GraphifyController() {
12+
_messageListener = ((Event event) {
13+
try {
14+
final msgEvent = event as MessageEvent;
15+
final dataAny = msgEvent.data;
16+
if (dataAny is! String) {
17+
return;
18+
}
19+
final decoded = jsonDecode(dataAny as String);
20+
if (decoded is! Map<String, dynamic>) {
21+
return;
22+
}
23+
if (decoded['source'] != 'graphify') {
24+
return;
25+
}
26+
if (decoded['chartId'] != uid) {
27+
return;
28+
}
29+
30+
final payloadString = decoded['payload'];
31+
if (payloadString is! String) {
32+
return;
33+
}
34+
final payloadDecoded = jsonDecode(payloadString);
35+
if (payloadDecoded is Map<String, dynamic>) {
36+
_clicks.add(payloadDecoded);
37+
}
38+
} catch (_) {}
39+
}).toJS as EventListener;
40+
window.addEventListener('message', _messageListener);
41+
}
42+
43+
final StreamController<Map<String, dynamic>> _clicks =
44+
StreamController<Map<String, dynamic>>.broadcast();
45+
46+
late final EventListener _messageListener;
47+
48+
@override
49+
Stream<Map<String, dynamic>> get chartClickedEvent => _clicks.stream;
1050

1151
@override
1252
void update(Map<String, dynamic>? options) {
@@ -19,6 +59,12 @@ class GraphifyController extends controller_interface.GraphifyController {
1959

2060
@override
2161
void dispose() {
22-
window.callMethod(JsMethods.disposeChart.toJS, uid.toJS);
62+
try {
63+
window.removeEventListener('message', _messageListener);
64+
} catch (_) {}
65+
try {
66+
window.callMethod(JsMethods.disposeChart.toJS, uid.toJS);
67+
} catch (_) {}
68+
_clicks.close();
2369
}
2470
}

0 commit comments

Comments
 (0)