@@ -39,7 +39,7 @@ class _SentryUserInteractionWidgetState
39
39
extends State <SentryUserInteractionWidget > {
40
40
int ? _lastPointerId;
41
41
Offset ? _lastPointerDownLocation;
42
- Widget ? _lastWidget ;
42
+ TappedWidget ? _lastTappedWidget ;
43
43
ISentrySpan ? _activeTransaction;
44
44
45
45
Hub get _hub => widget._hub;
@@ -82,9 +82,18 @@ class _SentryUserInteractionWidgetState
82
82
83
83
void _onTappedAt (Offset position) {
84
84
final tappedWidget = _getElementAt (position);
85
- if (tappedWidget == null || tappedWidget.keyValue == null ) {
85
+ final keyValue = tappedWidget? .keyValue;
86
+ if (tappedWidget == null || keyValue == null ) {
86
87
return ;
87
88
}
89
+ final element = tappedWidget.element;
90
+
91
+ // String? currentRouteName;
92
+ // if (element is StatefulElement) {
93
+ // currentRouteName = ModalRoute.of(element.state.context)?.settings.name;
94
+ // } else if (element is StatelessElement) {
95
+
96
+ // }
88
97
89
98
Map <String , dynamic >? data;
90
99
// ignore: invalid_use_of_internal_member
@@ -99,12 +108,12 @@ class _SentryUserInteractionWidgetState
99
108
if (_options? .enableUserInteractionBreadcrumbs ?? false ) {
100
109
final crumb = Breadcrumb .userInteraction (
101
110
subCategory: category,
102
- viewId: tappedWidget. keyValue,
111
+ viewId: keyValue,
103
112
// viewClass: tappedWidget.element.widget.runtimeType.toString(),
104
113
viewClass: tappedWidget.type, // to avoid minification
105
114
data: data,
106
115
);
107
- _hub.addBreadcrumb (crumb, hint: tappedWidget. element.widget);
116
+ _hub.addBreadcrumb (crumb, hint: element.widget);
108
117
}
109
118
110
119
// ignore: invalid_use_of_internal_member
@@ -115,16 +124,15 @@ class _SentryUserInteractionWidgetState
115
124
116
125
// TODO: name should be screenName.widgetName, maybe get from router?
117
126
final transactionContext = SentryTransactionContext (
118
- tappedWidget. keyValue! ,
127
+ keyValue,
119
128
'ui.action.$category ' ,
120
129
transactionNameSource: SentryTransactionNameSource .component,
121
130
);
122
131
123
- // TODO: check if when starting a new child, the timer is reset
124
- // TODO: check the type of the event in the widget
125
132
final activeTransaction = _activeTransaction;
126
133
if (activeTransaction != null ) {
127
- if (_lastWidget == tappedWidget.element.widget &&
134
+ if (_lastTappedWidget? .element.widget == element.widget &&
135
+ _lastTappedWidget? .eventType == tappedWidget.eventType &&
128
136
! activeTransaction.finished) {
129
137
// ignore: invalid_use_of_internal_member
130
138
activeTransaction.scheduleFinish ();
@@ -137,11 +145,11 @@ class _SentryUserInteractionWidgetState
137
145
}
138
146
});
139
147
_activeTransaction = null ;
140
- _lastWidget = null ;
148
+ _lastTappedWidget = null ;
141
149
}
142
150
}
143
151
144
- _lastWidget = tappedWidget.element.widget ;
152
+ _lastTappedWidget = tappedWidget;
145
153
146
154
bool hasRunningTransaction = false ;
147
155
_hub.configureScope ((scope) {
@@ -259,6 +267,7 @@ class _SentryUserInteractionWidgetState
259
267
element: element,
260
268
description: _findDescriptionOf (element, true ),
261
269
type: 'ButtonStyleButton' ,
270
+ eventType: 'onClick' ,
262
271
);
263
272
}
264
273
} else if (widget is MaterialButton ) {
@@ -267,6 +276,7 @@ class _SentryUserInteractionWidgetState
267
276
element: element,
268
277
description: _findDescriptionOf (element, true ),
269
278
type: 'MaterialButton' ,
279
+ eventType: 'onClick' ,
270
280
);
271
281
}
272
282
} else if (widget is CupertinoButton ) {
@@ -275,6 +285,7 @@ class _SentryUserInteractionWidgetState
275
285
element: element,
276
286
description: _findDescriptionOf (element, true ),
277
287
type: 'CupertinoButton' ,
288
+ eventType: 'onPressed' ,
278
289
);
279
290
}
280
291
} else if (widget is InkWell ) {
@@ -283,6 +294,7 @@ class _SentryUserInteractionWidgetState
283
294
element: element,
284
295
description: _findDescriptionOf (element, false ),
285
296
type: 'InkWell' ,
297
+ eventType: 'onTap' ,
286
298
);
287
299
}
288
300
} else if (widget is IconButton ) {
@@ -291,6 +303,7 @@ class _SentryUserInteractionWidgetState
291
303
element: element,
292
304
description: _findDescriptionOf (element, false ),
293
305
type: 'IconButton' ,
306
+ eventType: 'onPressed' ,
294
307
);
295
308
}
296
309
} else if (widget is GestureDetector ) {
@@ -299,6 +312,7 @@ class _SentryUserInteractionWidgetState
299
312
element: element,
300
313
description: '' ,
301
314
type: 'GestureDetector' ,
315
+ eventType: 'onTap' ,
302
316
);
303
317
}
304
318
}
0 commit comments