Skip to content

Auto Navigation Transaction: Non-String arguments throws Exception #679

@maximilianmaihoefner

Description

@maximilianmaihoefner

Related to: #643

Platform:

  • Dart
  • Flutter Android or iOS
  • Flutter Web

IDE:

  • VSCode
  • IntelliJ/AS
  • XCode
  • Other, which one?

split-debug-info and obfuscate (Flutter Android or iOS) or CanvasKit (Flutter Web):

  • Enabled
  • Disabled

Platform installed with:

  • pub.dev
  • GitHub

The version of the SDK (See pubspec.lock):
6.3.0-alpha.1


I have the following issue:

When using the SentryNavigatorObserver and triggering a navigation the following Exception gets thrown, when the router arguments are a non-string type object:

[error] Exception caught by widgets library
  type '<MyClass>' is not a subtype of type 'String'
#0      SentryTracer.setData (package:sentry/src/sentry_tracer.dart:89:19)
#1      SentryNavigatorObserver._startTransaction (package:sentry_flutter/src/navigation/sentry_navigator_observer.dart:141:21)
#2      SentryNavigatorObserver.didPush (package:sentry_flutter/src/navigation/sentry_navigator_observer.dart:74:5)
#3      _NavigatorPushObservation.notify (package:flutter/src/widgets/navigator.dart:3116:14)
#4      List.forEach (dart:core-patch/growable_array.dart:410:8)
#5      NavigatorState._flushObserverNotifications (package:flutter/src/widgets/navigator.dart:3923:27)
#6      NavigatorState._flushHistoryUpdates (package:flutter/src/widgets/navigator.dart:3882:5)
#7      NavigatorState._updatePages (package:flutter/src/widgets/navigator.dart:3762:5)
#8      NavigatorState.didUpdateWidget (package:flutter/src/widgets/navigator.dart:3433:7)
#9      StatefulElement.update (package:flutter/src/widgets/framework.dart:4778:57)
#10     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#12     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#13     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#14     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#15     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#17     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#18     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#19     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#20     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#22     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#23     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#25     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#26     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#27     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#28     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#30     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#31     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#32     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2578:33)
#33     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#34     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#35     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1145:15)
#36     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#37     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:996:5)
#38     _rootRun (dart:async/zone.dart:1428:13)
#39     _CustomZone.run (dart:async/zone.dart:1328:19)
#40     _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
#41     _invoke (dart:ui/hooks.dart:150:10)
#42     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5)
#43     _drawFrame (dart:ui/hooks.dart:114:31)

A quick and dirty fix could be stringifying the object before passing it to setData:

if (arguments != null) {
    _transaction?.setData('route_settings_arguments', arguments.toString());
}

Steps to reproduce:

  • Initialize a navigation with an Object as the arguments
const RouteSettings(name: 'Test', arguments: ComplexObject());

Actual result:

  • An exception is thrown

Expected result:

  • No exception should be thrown and the navigation transaction should be sent to sentry.

Metadata

Metadata

Assignees

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions