Skip to content

Commit ee11af1

Browse files
authored
Merge pull request #324 from Countly/events
Events Interface
2 parents 91a921f + c64a882 commit ee11af1

File tree

11 files changed

+314
-105
lines changed

11 files changed

+314
-105
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## XX.XX.XX
2+
* Added 'event' interface for events methods which are
3+
* recordEvent(String key, [Map<String, Object>? segmentation, int? count, int? sum, int? duration])
4+
* startEvent(String key)
5+
* endEvent(String key, [Map<String, Object>? segmentation, int? count, int? sum])
6+
* cancelEvent(String key)
7+
* Added 'cancelEvent' to cancel a timed event, it is accesible through 'events' interface
8+
9+
* Deprecated the following methods from the Countly
10+
* 'recordEvent(options)', instead use 'events.recordEvent(key, [segmentation, count, sum, duration])
11+
* 'startEvent(key)', instead use 'events.startEvent(key)'
12+
* 'endEvent(options)', instead use 'events.endEvent(key, [segmentation, count, sum])'
13+
114
## 25.1.0
215
* Improved content size management for better adaptability across devices.
316
* Resolved an issue where the action bar overlapped with the content display.

android/src/main/java/ly/count/dart/countly_flutter/CountlyFlutterPlugin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,10 @@ public void run() {
513513
String startEvent = args.getString(0);
514514
Countly.sharedInstance().events().startEvent(startEvent);
515515
result.success("startEvent for: " + startEvent);
516+
} else if ("cancelEvent".equals(call.method)) {
517+
String cancelEvent = args.getString(0);
518+
Countly.sharedInstance().events().cancelEvent(cancelEvent);
519+
result.success("cancelEvent for: " + cancelEvent);
516520
} else if ("endEvent".equals(call.method)) {
517521
String key = args.getString(0);
518522
int count = Integer.parseInt(args.getString(1));
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import 'package:countly_flutter/countly_flutter.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:integration_test/integration_test.dart';
4+
import '../utils.dart';
5+
import 'event_utils.dart';
6+
import 'dart:convert';
7+
import 'dart:io';
8+
9+
void main() {
10+
const int MAX_INT = -1 >>> 1;
11+
12+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
13+
testWidgets('Init SDK record some events and check what is in the queues with new interface', (WidgetTester tester) async {
14+
// Initialize the SDK
15+
CountlyConfig config = CountlyConfig(SERVER_URL, APP_KEY).setLoggingEnabled(true);
16+
await Countly.initWithConfig(config);
17+
18+
Map<String, Object> segmentation = {
19+
'nar': 'uto',
20+
'sasuke': MAX_INT,
21+
'sakura': false,
22+
'itachi': double.maxFinite,
23+
'kakaski': double.minPositive,
24+
'hashirama': -MAX_INT,
25+
'tobi': {'obito': 'uchiha', 'zetsu': 'white'},
26+
'stringList': ['value1', 'value2', 'value3'],
27+
'intList': [1, 2, 3],
28+
'doubleList': [1.1, 2.2, 3.3],
29+
'boolList': [true, false, true],
30+
'mixedList': ['value1', 2, 3.3, true],
31+
'mapList': [
32+
{'key1': 'value1', 'key2': 2},
33+
{'key1': 'value2', 'key2': 3},
34+
{'key1': 'value3', 'key2': 4}
35+
],
36+
};
37+
await Countly.instance.events.recordEvent('event');
38+
await Countly.instance.events.recordEvent('event_s', segmentation);
39+
await Countly.instance.events.recordEvent('event_s_c_s', segmentation, 23, 90.1);
40+
await Countly.instance.events.recordEvent('event_s_c_s_d', segmentation, 98, 13.2, 123);
41+
42+
await Countly.instance.events.startEvent('timed_event');
43+
await Future.delayed(const Duration(milliseconds: 250));
44+
await Countly.instance.events.endEvent('timed_event', segmentation);
45+
46+
await Countly.instance.events.startEvent('timed_event_s_c_s');
47+
await Future.delayed(const Duration(milliseconds: 250));
48+
await Countly.instance.events.endEvent('timed_event_s_c_s', segmentation, 45, 65.6);
49+
50+
// Get request and event queues from native side
51+
List<String> requestList = await getRequestQueue(); // List of strings
52+
List<String> eventList = await getEventQueue(); // List of json objects
53+
54+
// Some logs for debugging
55+
print('RQ: $requestList');
56+
print('EQ: $eventList');
57+
print('RQ length: ${requestList.length}');
58+
print('EQ length: ${eventList.length}');
59+
60+
expect(requestList.length, 1);
61+
expect(eventList.length, Platform.isAndroid ? 7 : 6);
62+
63+
// begin session
64+
Map<String, List<String>> queryParams = Uri.parse("?" + requestList[0]).queryParametersAll;
65+
testCommonRequestParams(queryParams);
66+
67+
int n = 0;
68+
Map<String, dynamic> currentEvent;
69+
if (Platform.isAndroid) {
70+
currentEvent = json.decode(eventList[n]);
71+
// 1. orientation event
72+
expect("[CLY]_orientation", currentEvent['key']);
73+
expect(1, currentEvent['count']);
74+
n++;
75+
}
76+
77+
Map<String, Object> expectedSegmentation = {
78+
"sasuke": MAX_INT,
79+
"sakura": false,
80+
"mapList": [],
81+
"intList": [1, 2, 3],
82+
"doubleList": [1.1, 2.2, 3.3],
83+
"boolList": [true, false, true],
84+
"mixedList": ["value1", 2, 3.3, true],
85+
"itachi": double.maxFinite,
86+
"stringList": ["value1", "value2", "value3"],
87+
"kakaski": double.minPositive,
88+
"nar": "uto",
89+
"hashirama": -MAX_INT,
90+
};
91+
92+
// 2. event
93+
currentEvent = json.decode(eventList[n++]);
94+
validateEvent(event: currentEvent, key: 'event');
95+
96+
// 3. event_s
97+
currentEvent = json.decode(eventList[n++]);
98+
validateEvent(event: currentEvent, key: 'event_s', segmentation: expectedSegmentation);
99+
100+
// 4. event_s_c_s
101+
currentEvent = json.decode(eventList[n++]);
102+
validateEvent(event: currentEvent, key: 'event_s_c_s', segmentation: expectedSegmentation, count: 23, sum: 90.1);
103+
104+
// 5. event_s_c_s_d
105+
currentEvent = json.decode(eventList[n++]);
106+
validateEvent(event: currentEvent, key: 'event_s_c_s_d', segmentation: expectedSegmentation, count: 98, sum: 13.2, dur: 123);
107+
108+
// 6. timed_event
109+
currentEvent = json.decode(eventList[n++]);
110+
validateEvent(event: currentEvent, key: 'timed_event', segmentation: expectedSegmentation, isTimed: true);
111+
112+
// 7. timed_event_s_c_s
113+
currentEvent = json.decode(eventList[n++]);
114+
validateEvent(event: currentEvent, key: 'timed_event_s_c_s', segmentation: expectedSegmentation, count: 45, sum: 65.6, isTimed: true);
115+
});
116+
}

example/integration_test/event_tests/event_test.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void main() {
5252

5353
// 4. event_c_s
5454
currentEvent = json.decode(eventList[n++]);
55-
validateEvent(event: currentEvent, key: event_c_s['key'] as String, count: event_c_s['count'] as int, sum: event_c_s['sum'] as int);
55+
validateEvent(event: currentEvent, key: event_c_s['key'] as String, count: event_c_s['count'] as int, sum: event_c_s['sum'] as double);
5656

5757
// 5. event_c_d
5858
currentEvent = json.decode(eventList[n++]);
@@ -64,35 +64,35 @@ void main() {
6464

6565
// 7. event_c_s_d
6666
currentEvent = json.decode(eventList[n++]);
67-
validateEvent(event: currentEvent, key: event_c_s_d['key'] as String, count: event_c_s_d['count'] as int, sum: event_c_s_d['sum'] as int, dur: event_c_s_d['duration'] as int);
67+
validateEvent(event: currentEvent, key: event_c_s_d['key'] as String, count: event_c_s_d['count'] as int, sum: event_c_s_d['sum'] as double, dur: event_c_s_d['duration'] as int);
6868

6969
// 8. event_c_s_se
7070
currentEvent = json.decode(eventList[n++]);
71-
validateEvent(event: currentEvent, key: event_c_s_se['key'] as String, count: event_c_s_se['count'] as int, sum: event_c_s_se['sum'] as int, segmentation: expectedSegmentation);
71+
validateEvent(event: currentEvent, key: event_c_s_se['key'] as String, count: event_c_s_se['count'] as int, sum: event_c_s_se['sum'] as double, segmentation: expectedSegmentation);
7272

7373
// 9. event_c_d_se
7474
currentEvent = json.decode(eventList[n++]);
7575
validateEvent(event: currentEvent, key: event_c_d_se['key'] as String, count: event_c_d_se['count'] as int, dur: event_c_d_se['duration'] as int, segmentation: expectedSegmentation);
7676

7777
// 10. event_c_s_d_se
7878
currentEvent = json.decode(eventList[n++]);
79-
validateEvent(event: currentEvent, key: event_c_s_d_se['key'] as String, count: event_c_s_d_se['count'] as int, sum: event_c_s_d_se['sum'] as int, dur: event_c_s_d_se['duration'] as int, segmentation: expectedSegmentation);
79+
validateEvent(event: currentEvent, key: event_c_s_d_se['key'] as String, count: event_c_s_d_se['count'] as int, sum: event_c_s_d_se['sum'] as double, dur: event_c_s_d_se['duration'] as int, segmentation: expectedSegmentation);
8080

8181
// 11. event_s
8282
currentEvent = json.decode(eventList[n++]);
83-
validateEvent(event: currentEvent, key: event_s['key'] as String, sum: event_s['sum'] as int);
83+
validateEvent(event: currentEvent, key: event_s['key'] as String, sum: event_s['sum'] as double);
8484

8585
// 12. event_s_d
8686
currentEvent = json.decode(eventList[n++]);
87-
validateEvent(event: currentEvent, key: event_s_d['key'] as String, sum: event_s_d['sum'] as int, dur: event_s_d['duration'] as int);
87+
validateEvent(event: currentEvent, key: event_s_d['key'] as String, sum: event_s_d['sum'] as double, dur: event_s_d['duration'] as int);
8888

8989
// 13. event_s_se
9090
currentEvent = json.decode(eventList[n++]);
91-
validateEvent(event: currentEvent, key: event_s_se['key'] as String, sum: event_s_se['sum'] as int, segmentation: expectedSegmentation);
91+
validateEvent(event: currentEvent, key: event_s_se['key'] as String, sum: event_s_se['sum'] as double, segmentation: expectedSegmentation);
9292

9393
// 14. event_s_d_se
9494
currentEvent = json.decode(eventList[n++]);
95-
validateEvent(event: currentEvent, key: event_s_d_se['key'] as String, sum: event_s_d_se['sum'] as int, dur: event_s_d_se['duration'] as int, segmentation: expectedSegmentation);
95+
validateEvent(event: currentEvent, key: event_s_d_se['key'] as String, sum: event_s_d_se['sum'] as double, dur: event_s_d_se['duration'] as int, segmentation: expectedSegmentation);
9696

9797
// 15. event_d
9898
currentEvent = json.decode(eventList[n++]);
@@ -116,7 +116,7 @@ void main() {
116116

117117
// 20. timed_event_c_s
118118
currentEvent = json.decode(eventList[n++]);
119-
validateEvent(event: currentEvent, key: timed_event_c_s['key'] as String, count: 1, sum: timed_event_c_s['sum'] as int, isTimed: true);
119+
validateEvent(event: currentEvent, key: timed_event_c_s['key'] as String, count: 1, sum: timed_event_c_s['sum'] as double, isTimed: true);
120120

121121
// 21. timed_event_c_d
122122
currentEvent = json.decode(eventList[n++]);
@@ -128,35 +128,35 @@ void main() {
128128

129129
// 23. timed_event_c_s_d
130130
currentEvent = json.decode(eventList[n++]);
131-
validateEvent(event: currentEvent, key: timed_event_c_s_d['key'] as String, count: 1, sum: timed_event_c_s_d['sum'] as int, dur: timed_event_c_s_d['duration'] as int, isTimed: true);
131+
validateEvent(event: currentEvent, key: timed_event_c_s_d['key'] as String, count: 1, sum: timed_event_c_s_d['sum'] as double, dur: timed_event_c_s_d['duration'] as int, isTimed: true);
132132

133133
// 24. timed_event_c_s_se
134134
currentEvent = json.decode(eventList[n++]);
135-
validateEvent(event: currentEvent, key: timed_event_c_s_se['key'] as String, count: 1, sum: timed_event_c_s_se['sum'] as int, segmentation: expectedSegmentation, isTimed: true);
135+
validateEvent(event: currentEvent, key: timed_event_c_s_se['key'] as String, count: 1, sum: timed_event_c_s_se['sum'] as double, segmentation: expectedSegmentation, isTimed: true);
136136

137137
// 25. timed_event_c_d_se
138138
currentEvent = json.decode(eventList[n++]);
139139
validateEvent(event: currentEvent, key: timed_event_c_d_se['key'] as String, count: 1, dur: timed_event_c_d_se['duration'] as int, segmentation: expectedSegmentation, isTimed: true);
140140

141141
// 26. timed_event_c_s_d_se
142142
currentEvent = json.decode(eventList[n++]);
143-
validateEvent(event: currentEvent, key: timed_event_c_s_d_se['key'] as String, count: 1, sum: timed_event_c_s_d_se['sum'] as int, dur: timed_event_c_s_d_se['duration'] as int, segmentation: expectedSegmentation, isTimed: true);
143+
validateEvent(event: currentEvent, key: timed_event_c_s_d_se['key'] as String, count: 1, sum: timed_event_c_s_d_se['sum'] as double, dur: timed_event_c_s_d_se['duration'] as int, segmentation: expectedSegmentation, isTimed: true);
144144

145145
// 27. timed_event_s
146146
currentEvent = json.decode(eventList[n++]);
147-
validateEvent(event: currentEvent, key: timed_event_s['key'] as String, sum: timed_event_s['sum'] as int, isTimed: true);
147+
validateEvent(event: currentEvent, key: timed_event_s['key'] as String, sum: timed_event_s['sum'] as double, isTimed: true);
148148

149149
// 28. timed_event_s_d
150150
currentEvent = json.decode(eventList[n++]);
151-
validateEvent(event: currentEvent, key: timed_event_s_d['key'] as String, sum: timed_event_s_d['sum'] as int, dur: timed_event_s_d['duration'] as int, isTimed: true);
151+
validateEvent(event: currentEvent, key: timed_event_s_d['key'] as String, sum: timed_event_s_d['sum'] as double, dur: timed_event_s_d['duration'] as int, isTimed: true);
152152

153153
// 29. timed_event_s_se
154154
currentEvent = json.decode(eventList[n++]);
155-
validateEvent(event: currentEvent, key: timed_event_s_se['key'] as String, sum: timed_event_s_se['sum'] as int, segmentation: expectedSegmentation, isTimed: true);
155+
validateEvent(event: currentEvent, key: timed_event_s_se['key'] as String, sum: timed_event_s_se['sum'] as double, segmentation: expectedSegmentation, isTimed: true);
156156

157157
// 30. timed_event_s_d_se
158158
currentEvent = json.decode(eventList[n++]);
159-
validateEvent(event: currentEvent, key: timed_event_s_d_se['key'] as String, sum: timed_event_s_d_se['sum'] as int, dur: timed_event_s_d_se['duration'] as int, segmentation: expectedSegmentation, isTimed: true);
159+
validateEvent(event: currentEvent, key: timed_event_s_d_se['key'] as String, sum: timed_event_s_d_se['sum'] as double, dur: timed_event_s_d_se['duration'] as int, segmentation: expectedSegmentation, isTimed: true);
160160

161161
// 31. timed_event_d
162162
currentEvent = json.decode(eventList[n++]);

example/integration_test/event_tests/event_utils.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,42 +45,42 @@ var expectedSegmentation = {
4545
'boolList': boolList,
4646
'mixedList': mixedList,
4747
'normalString': 'normalString',
48-
'nestedList' : [],
49-
'mapList' : [],
48+
'nestedList': [],
49+
'mapList': [],
5050
'normalInt': 1,
5151
'normalDouble': 1.1,
5252
'normalBool': true,
5353
};
5454

5555
var event = {'key': 'event'};
5656
var event_c = {'key': 'event_c', 'count': 1};
57-
var event_c_s = {'key': 'event_c_s', 'count': 1, 'sum': 3};
57+
var event_c_s = {'key': 'event_c_s', 'count': 1, 'sum': 3.0};
5858
var event_c_d = {'key': 'event_c_d', 'count': 1, 'duration': 3};
5959
var event_c_se = {'key': 'event_c_se', 'count': 1, 'segmentation': segment};
60-
var event_c_s_d = {'key': 'event_c_s_d', 'count': 1, 'sum': 3, 'duration': 3};
61-
var event_c_s_se = {'key': 'event_c_s_se', 'count': 1, 'sum': 3, 'segmentation': segment};
60+
var event_c_s_d = {'key': 'event_c_s_d', 'count': 1, 'sum': 3.0, 'duration': 3};
61+
var event_c_s_se = {'key': 'event_c_s_se', 'count': 1, 'sum': 3.0, 'segmentation': segment};
6262
var event_c_d_se = {'key': 'event_c_d_se', 'count': 1, 'duration': 3, 'segmentation': segment};
63-
var event_c_s_d_se = {'key': 'event_c_s_d_se', 'count': 1, 'sum': 3, 'duration': 3, 'segmentation': segment};
64-
var event_s = {'key': 'event_s', 'sum': 3};
65-
var event_s_d = {'key': 'event_s_d', 'sum': 3, 'duration': 3};
66-
var event_s_se = {'key': 'event_s_se', 'sum': 3, 'segmentation': segment};
67-
var event_s_d_se = {'key': 'event_s_d_se', 'sum': 3, 'duration': 3, 'segmentation': segment};
63+
var event_c_s_d_se = {'key': 'event_c_s_d_se', 'count': 1, 'sum': 3.0, 'duration': 3, 'segmentation': segment};
64+
var event_s = {'key': 'event_s', 'sum': 3.0};
65+
var event_s_d = {'key': 'event_s_d', 'sum': 3.0, 'duration': 3};
66+
var event_s_se = {'key': 'event_s_se', 'sum': 3.0, 'segmentation': segment};
67+
var event_s_d_se = {'key': 'event_s_d_se', 'sum': 3.0, 'duration': 3, 'segmentation': segment};
6868
var event_d = {'key': 'event_d', 'duration': 3};
6969
var event_d_se = {'key': 'event_d_se', 'duration': 3, 'segmentation': segment};
7070
var event_se = {'key': 'event_se', 'segmentation': segment};
7171
var timed_event = {'key': 'timed_event'};
7272
var timed_event_c = {'key': 'timed_event_c', 'count': 1};
73-
var timed_event_c_s = {'key': 'timed_event_c_s', 'count': 1, 'sum': 3};
73+
var timed_event_c_s = {'key': 'timed_event_c_s', 'count': 1, 'sum': 3.0};
7474
var timed_event_c_d = {'key': 'timed_event_c_d', 'count': 1, 'duration': 3};
7575
var timed_event_c_se = {'key': 'timed_event_c_se', 'count': 1, 'segmentation': segment};
76-
var timed_event_c_s_d = {'key': 'timed_event_c_s_d', 'count': 1, 'sum': 3, 'duration': 3};
77-
var timed_event_c_s_se = {'key': 'timed_event_c_s_se', 'count': 1, 'sum': 3, 'segmentation': segment};
76+
var timed_event_c_s_d = {'key': 'timed_event_c_s_d', 'count': 1, 'sum': 3.0, 'duration': 3};
77+
var timed_event_c_s_se = {'key': 'timed_event_c_s_se', 'count': 1, 'sum': 3.0, 'segmentation': segment};
7878
var timed_event_c_d_se = {'key': 'timed_event_c_d_se', 'count': 1, 'duration': 3, 'segmentation': segment};
79-
var timed_event_c_s_d_se = {'key': 'timed_event_c_s_d_se', 'count': 1, 'sum': 3, 'duration': 3, 'segmentation': segment};
80-
var timed_event_s = {'key': 'timed_event_s', 'sum': 3};
81-
var timed_event_s_d = {'key': 'timed_event_s_d', 'sum': 3, 'duration': 3};
82-
var timed_event_s_se = {'key': 'timed_event_s_se', 'sum': 3, 'segmentation': segment};
83-
var timed_event_s_d_se = {'key': 'timed_event_s_d_se', 'sum': 3, 'duration': 3, 'segmentation': segment};
79+
var timed_event_c_s_d_se = {'key': 'timed_event_c_s_d_se', 'count': 1, 'sum': 3.0, 'duration': 3, 'segmentation': segment};
80+
var timed_event_s = {'key': 'timed_event_s', 'sum': 3.0};
81+
var timed_event_s_d = {'key': 'timed_event_s_d', 'sum': 3.0, 'duration': 3};
82+
var timed_event_s_se = {'key': 'timed_event_s_se', 'sum': 3.0, 'segmentation': segment};
83+
var timed_event_s_d_se = {'key': 'timed_event_s_d_se', 'sum': 3.0, 'duration': 3, 'segmentation': segment};
8484
var timed_event_d = {'key': 'timed_event_d', 'duration': 3};
8585
var timed_event_d_se = {'key': 'timed_event_d_se', 'duration': 3, 'segmentation': segment};
8686
var timed_event_se = {'key': 'timed_event_se', 'segmentation': segment};
@@ -128,10 +128,11 @@ Future<void> generateEvents() async {
128128
}
129129

130130
String idCounter = "";
131-
void validateEvent({dynamic event, String? key, int? count = 1, int? sum = 0, int? dur, dynamic segmentation, String? cvid = "", bool isTimed = false}) {
131+
void validateEvent({dynamic event, String? key, int? count = 1, double? sum = 0, int? dur, dynamic segmentation, String? cvid = "", bool isTimed = false}) {
132132
expect(event['key'], key);
133133
expect(event['count'], count);
134-
expect(event['sum'], sum);
134+
double sumDelta = event['sum'] - sum;
135+
expect(true, -00.1 < sumDelta && sumDelta < 00.1);
135136
expect(event['dur'], isTimed || Platform.isIOS ? isNotNull : dur);
136137
expect(event['segmentation'], segmentation);
137138
expect(event['timestamp'], isNotNull);

example/lib/page_events.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ class EventsPage extends StatelessWidget {
7070
});
7171
}
7272

73+
void cancelEvent() {
74+
Countly.startEvent('Timed Event With Cancel');
75+
Timer(const Duration(seconds: 5), () {
76+
Countly.instance.events.cancelEvent('Timed Event With Cancel');
77+
});
78+
}
79+
7380
@override
7481
Widget build(BuildContext context) {
7582
return Scaffold(
@@ -89,6 +96,7 @@ class EventsPage extends StatelessWidget {
8996
MyButton(text: 'Timed event Sum: Start / Stop', color: 'grey', onPressed: endEventWithSum),
9097
MyButton(text: 'Timed event Segment: Start / Stop', color: 'grey', onPressed: endEventWithSegment),
9198
MyButton(text: 'Timed event Sum Segment: Start / Stop', color: 'grey', onPressed: endEventWithSumSegment),
99+
MyButton(text: 'Timed event Start / Cancel', color: 'grey', onPressed: cancelEvent),
92100
],
93101
)),
94102
),

ios/Classes/CountlyFlutterPlugin.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,13 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result
311311
result(@"startEvent!");
312312
});
313313

314+
} else if ([@"cancelEvent" isEqualToString:call.method]) {
315+
dispatch_async(dispatch_get_main_queue(), ^{
316+
NSString *eventName = [command objectAtIndex:0];
317+
[Countly.sharedInstance cancelEvent:eventName];
318+
result(@"cancelEvent!");
319+
});
320+
314321
} else if ([@"endEvent" isEqualToString:call.method]) {
315322
dispatch_async(dispatch_get_main_queue(), ^{
316323
NSString *key = [command objectAtIndex:0];

lib/countly_flutter.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export 'src/content_builder.dart';
22
export 'src/countly_config.dart';
33
export 'src/countly_flutter.dart';
4+
export 'src/events.dart';
45
export 'src/feedback.dart';
56
export 'src/remote_config.dart';
67
export 'src/sessions.dart';

0 commit comments

Comments
 (0)