Skip to content

Commit d5857e8

Browse files
committed
Update
1 parent 5ad708c commit d5857e8

File tree

8 files changed

+56
-116
lines changed

8 files changed

+56
-116
lines changed

packages/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ class SentryFlutterPlugin :
7070
"setContexts" -> setContexts(call.argument("key"), call.argument("value"), result)
7171
"removeContexts" -> removeContexts(call.argument("key"), result)
7272
"setUser" -> setUser(call.argument("user"), result)
73-
"addBreadcrumb" -> addBreadcrumb(call.argument("breadcrumb"), result)
7473
"setExtra" -> setExtra(call.argument("key"), call.argument("value"), result)
7574
"removeExtra" -> removeExtra(call.argument("key"), result)
7675
"setTag" -> setTag(call.argument("key"), call.argument("value"), result)
@@ -194,18 +193,6 @@ class SentryFlutterPlugin :
194193
result.success("")
195194
}
196195

197-
private fun addBreadcrumb(
198-
breadcrumb: Map<String, Any?>?,
199-
result: Result,
200-
) {
201-
if (breadcrumb != null) {
202-
val options = ScopesAdapter.getInstance().options
203-
val breadcrumbInstance = Breadcrumb.fromMap(breadcrumb, options)
204-
Sentry.addBreadcrumb(breadcrumbInstance)
205-
}
206-
result.success("")
207-
}
208-
209196
private fun setExtra(
210197
key: String?,
211198
value: String?,

packages/flutter/ios/sentry_flutter/Sources/sentry_flutter/SentryFlutterPlugin.swift

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,6 @@ public class SentryFlutterPlugin: NSObject, FlutterPlugin {
9292
let user = arguments?["user"] as? [String: Any]
9393
setUser(user: user, result: result)
9494

95-
case "addBreadcrumb":
96-
let arguments = call.arguments as? [String: Any?]
97-
let breadcrumb = arguments?["breadcrumb"] as? [String: Any]
98-
addBreadcrumb(breadcrumb: breadcrumb, result: result)
99-
100-
case "clearBreadcrumbs":
101-
clearBreadcrumbs(result: result)
102-
10395
case "setExtra":
10496
let arguments = call.arguments as? [String: Any?]
10597
let key = arguments?["key"] as? String
@@ -322,22 +314,6 @@ public class SentryFlutterPlugin: NSObject, FlutterPlugin {
322314
result("")
323315
}
324316

325-
private func addBreadcrumb(breadcrumb: [String: Any]?, result: @escaping FlutterResult) {
326-
if let breadcrumb = breadcrumb {
327-
let breadcrumbInstance = PrivateSentrySDKOnly.breadcrumb(with: breadcrumb)
328-
SentrySDK.addBreadcrumb(breadcrumbInstance)
329-
}
330-
result("")
331-
}
332-
333-
private func clearBreadcrumbs(result: @escaping FlutterResult) {
334-
SentrySDK.configureScope { scope in
335-
scope.clearBreadcrumbs()
336-
337-
result("")
338-
}
339-
}
340-
341317
private func setExtra(key: String?, value: Any?, result: @escaping FlutterResult) {
342318
guard let key = key else {
343319
result("")

packages/flutter/lib/src/native/cocoa/sentry_native_cocoa.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import '../../../sentry_flutter.dart';
88
import '../../replay/replay_config.dart';
99
import '../native_app_start.dart';
1010
import '../sentry_native_channel.dart';
11+
import '../utils/data_normalizer.dart';
1112
import '../utils/utf8_json.dart';
1213
import 'binding.dart' as cocoa;
1314
import 'cocoa_replay_recorder.dart';
@@ -206,9 +207,7 @@ class SentryNativeCocoa extends SentryNativeChannel {
206207
final normalizedBreadcrumb = Breadcrumb(
207208
message: breadcrumb.message,
208209
category: breadcrumb.category,
209-
data: breadcrumb.data != null
210-
? Map<String, dynamic>.from(breadcrumb.data!)
211-
: null,
210+
data: normalizeMap(breadcrumb.data),
212211
level: breadcrumb.level,
213212
type: breadcrumb.type,
214213
timestamp: breadcrumb.timestamp,

packages/flutter/lib/src/native/java/sentry_native_java.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import '../../../sentry_flutter.dart';
99
import '../../replay/scheduled_recorder_config.dart';
1010
import '../native_app_start.dart';
1111
import '../sentry_native_channel.dart';
12+
import '../utils/data_normalizer.dart';
1213
import '../utils/utf8_json.dart';
1314
import 'android_envelope_sender.dart';
1415
import 'android_replay_recorder.dart';
@@ -230,9 +231,7 @@ class SentryNativeJava extends SentryNativeChannel {
230231
final normalizedBreadcrumb = Breadcrumb(
231232
message: breadcrumb.message,
232233
category: breadcrumb.category,
233-
data: breadcrumb.data != null
234-
? Map<String, dynamic>.from(breadcrumb.data!)
235-
: null,
234+
data: normalizeMap(breadcrumb.data),
236235
level: breadcrumb.level,
237236
type: breadcrumb.type,
238237
timestamp: breadcrumb.timestamp,

packages/flutter/lib/src/native/method_channel_helper.dart

Lines changed: 0 additions & 38 deletions
This file was deleted.

packages/flutter/lib/src/native/sentry_native_channel.dart

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import 'package:meta/meta.dart';
88

99
import '../../sentry_flutter.dart';
1010
import '../replay/replay_config.dart';
11-
import 'method_channel_helper.dart';
1211
import 'native_app_start.dart';
1312
import 'sentry_native_binding.dart';
1413
import 'sentry_native_invoker.dart';
1514
import 'sentry_safe_method_channel.dart';
15+
import 'utils/data_normalizer.dart';
1616

1717
/// Provide typed methods to access native layer via MethodChannel.
1818
@internal
@@ -134,7 +134,7 @@ class SentryNativeChannel
134134
username: user.username,
135135
email: user.email,
136136
ipAddress: user.ipAddress,
137-
data: MethodChannelHelper.normalizeMap(user.data),
137+
data: normalizeMap(user.data),
138138
// ignore: deprecated_member_use
139139
extras: user.extras,
140140
geo: user.geo,
@@ -151,29 +151,19 @@ class SentryNativeChannel
151151

152152
@override
153153
Future<void> addBreadcrumb(Breadcrumb breadcrumb) async {
154-
final normalizedBreadcrumb = Breadcrumb(
155-
message: breadcrumb.message,
156-
category: breadcrumb.category,
157-
data: MethodChannelHelper.normalizeMap(breadcrumb.data),
158-
level: breadcrumb.level,
159-
type: breadcrumb.type,
160-
timestamp: breadcrumb.timestamp,
161-
// ignore: invalid_use_of_internal_member
162-
unknown: breadcrumb.unknown,
163-
);
164-
await channel.invokeMethod(
165-
'addBreadcrumb',
166-
{'breadcrumb': normalizedBreadcrumb.toJson()},
167-
);
154+
assert(false, "addBreadcrumb should not be used through method channels.");
168155
}
169156

170157
@override
171-
Future<void> clearBreadcrumbs() => channel.invokeMethod('clearBreadcrumbs');
158+
Future<void> clearBreadcrumbs() async {
159+
assert(
160+
false, "clearBreadcrumbs should not be used through method channels.");
161+
}
172162

173163
@override
174164
Future<void> setContexts(String key, dynamic value) => channel.invokeMethod(
175165
'setContexts',
176-
{'key': key, 'value': MethodChannelHelper.normalize(value)},
166+
{'key': key, 'value': normalize(value)},
177167
);
178168

179169
@override
@@ -183,7 +173,7 @@ class SentryNativeChannel
183173
@override
184174
Future<void> setExtra(String key, dynamic value) => channel.invokeMethod(
185175
'setExtra',
186-
{'key': key, 'value': MethodChannelHelper.normalize(value)},
176+
{'key': key, 'value': normalize(value)},
187177
);
188178

189179
@override
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:meta/meta.dart';
2+
3+
/// Normalizes data for serialization across native boundaries.
4+
/// Converts non-primitive types to strings for safe serialization.
5+
@internal
6+
dynamic normalize(dynamic data) {
7+
if (data == null) return null;
8+
if (_isPrimitive(data)) return data;
9+
if (data is List<dynamic>) return _normalizeList(data);
10+
if (data is Map<String, dynamic>) return normalizeMap(data);
11+
return data.toString();
12+
}
13+
14+
@internal
15+
Map<String, dynamic>? normalizeMap(Map<String, dynamic>? data) {
16+
if (data == null) return null;
17+
return data.map((key, value) => MapEntry(key, normalize(value)));
18+
}
19+
20+
List<dynamic>? _normalizeList(List<dynamic>? data) {
21+
if (data == null) return null;
22+
return data.map((e) => normalize(e)).toList();
23+
}
24+
25+
bool _isPrimitive(dynamic value) {
26+
return value == null || value is String || value is num || value is bool;
27+
}

packages/flutter/test/method_channel_helper_test.dart renamed to packages/flutter/test/utils/data_normalizer_test.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:flutter_test/flutter_test.dart';
2-
import 'package:sentry_flutter/src/native/method_channel_helper.dart';
32
import 'package:collection/collection.dart';
3+
import 'package:sentry_flutter/src/native/utils/data_normalizer.dart';
44

55
void main() {
66
group('normalize', () {
@@ -13,21 +13,21 @@ void main() {
1313
'string': 'Foo',
1414
};
1515

16-
var actual = MethodChannelHelper.normalizeMap(expected);
16+
var actual = normalizeMap(expected);
1717
expect(
1818
DeepCollectionEquality().equals(actual, expected),
1919
true,
2020
);
2121

22-
expect(MethodChannelHelper.normalize(null), null);
23-
expect(MethodChannelHelper.normalize(1), 1);
24-
expect(MethodChannelHelper.normalize(1.1), 1.1);
25-
expect(MethodChannelHelper.normalize(true), true);
26-
expect(MethodChannelHelper.normalize('Foo'), 'Foo');
22+
expect(normalize(null), null);
23+
expect(normalize(1), 1);
24+
expect(normalize(1.1), 1.1);
25+
expect(normalize(true), true);
26+
expect(normalize('Foo'), 'Foo');
2727
});
2828

2929
test('object', () {
30-
expect(MethodChannelHelper.normalize(_CustomObject()), 'CustomObject()');
30+
expect(normalize(_CustomObject()), 'CustomObject()');
3131
});
3232

3333
test('object in list', () {
@@ -38,7 +38,7 @@ void main() {
3838
'object': ['CustomObject()']
3939
};
4040

41-
var actual = MethodChannelHelper.normalize(input);
41+
var actual = normalize(input);
4242
expect(
4343
DeepCollectionEquality().equals(actual, expected),
4444
true,
@@ -53,7 +53,7 @@ void main() {
5353
'object': <String, dynamic>{'object': 'CustomObject()'}
5454
};
5555

56-
var actual = MethodChannelHelper.normalize(input);
56+
var actual = normalize(input);
5757
expect(
5858
DeepCollectionEquality().equals(actual, expected),
5959
true,
@@ -71,7 +71,7 @@ void main() {
7171
'string': 'Foo',
7272
};
7373

74-
var actual = MethodChannelHelper.normalizeMap(expected);
74+
var actual = normalizeMap(expected);
7575
expect(
7676
DeepCollectionEquality().equals(actual, expected),
7777
true,
@@ -83,7 +83,7 @@ void main() {
8383
'list': [null, 1, 1.1, true, 'Foo'],
8484
};
8585

86-
var actual = MethodChannelHelper.normalizeMap(expected);
86+
var actual = normalizeMap(expected);
8787
expect(
8888
DeepCollectionEquality().equals(actual, expected),
8989
true,
@@ -101,7 +101,7 @@ void main() {
101101
},
102102
};
103103

104-
var actual = MethodChannelHelper.normalizeMap(expected);
104+
var actual = normalizeMap(expected);
105105
expect(
106106
DeepCollectionEquality().equals(actual, expected),
107107
true,
@@ -112,7 +112,7 @@ void main() {
112112
var input = <String, dynamic>{'object': _CustomObject()};
113113
var expected = <String, dynamic>{'object': 'CustomObject()'};
114114

115-
var actual = MethodChannelHelper.normalizeMap(input);
115+
var actual = normalizeMap(input);
116116
expect(
117117
DeepCollectionEquality().equals(actual, expected),
118118
true,
@@ -127,7 +127,7 @@ void main() {
127127
'object': ['CustomObject()']
128128
};
129129

130-
var actual = MethodChannelHelper.normalizeMap(input);
130+
var actual = normalizeMap(input);
131131
expect(
132132
DeepCollectionEquality().equals(actual, expected),
133133
true,
@@ -142,7 +142,7 @@ void main() {
142142
'object': <String, dynamic>{'object': 'CustomObject()'}
143143
};
144144

145-
var actual = MethodChannelHelper.normalizeMap(input);
145+
var actual = normalizeMap(input);
146146
expect(
147147
DeepCollectionEquality().equals(actual, expected),
148148
true,

0 commit comments

Comments
 (0)