Releases: getsentry/sentry-dart
8.13.0-beta.1
Breaking changes
- Remove Metrics API (#2571)
- The Metrics product never reached maturity from beta and has officially ended in October 7th, 2024
- Read this post for more information
Features
- Add
beforeCapturefor View Hierarchy (#2523)- View hierarchy calls are now debounced for 2 seconds.
- JS SDK integration (#2572)
- Enable the integration by setting
options.enableSentryJs = true - Features:
- Sending envelopes through Sentry JS transport layer
- Capturing native JS errors
- Enable the integration by setting
Enhancements
- Replay: improve iOS native interop performance (#2530, #2573)
- Replay: improve orientation change tracking accuracy on Android (#2540)
Fixes
- Replay: fix masking for frames captured during UI changes (#2553)
- Replay: fix widget masks overlap when navigating between screens (#2486, #2576)
Dependencies
8.12.0 (Stable)
Deprecations
- Manual TTID (#2477)
Fixes
- Missing replay gestures on Android (#2515)
- Replay mask sizing on scaling transform widget children (#2520)
- Masking semi-transparent widgets (#2472)
- Check
SentryTracertype in TTFD tracker (#2508)
Features
-
Replay: device orientation change support & improve video size fit on Android (#2462)
-
Support custom
Sentry.runZoneGuardedzone creation (#2088)- Sentry will not create a custom zone anymore if it is started within a custom one.
- This fixes Zone miss-match errors when trying to initialize WidgetsBinding before Sentry on Flutter Web
Sentry.runZonedGuardedcreates a zone and also captures exceptions & breadcrumbs automatically.
Sentry.runZonedGuarded(() { WidgetsBinding.ensureInitialized(); // Errors before init will not be handled by Sentry SentryFlutter.init( (options) { ... }, appRunner: () => runApp(MyApp()), ); }, (error, stackTrace) { // Automatically sends errors to Sentry, no need to do any // captureException calls on your part. // On top of that, you can do your own custom stuff in this callback. });
-
Warning (in a debug build) if a potentially sensitive widget is not masked or unmasked explicitly (#2375)
-
Replay: ensure visual update before capturing screenshots (#2527)
Dependencies
8.12.0-beta.2
Deprecations
- Manual TTID (#2477)
Fixes
- Missing replay gestures on Android (#2515)
- Replay mask sizing on scaling transform widget children (#2520)
Enhancements
- Check
SentryTracertype in TTFD tracker (#2508) - Warning (in a debug build) if a potentially sensitive widget is not masked or unmasked explicitly (#2375)
- Replay: ensure visual update before capturing screenshots (#2527)
Dependencies
8.11.2 (Stable)
Changes
-
Windows & Linux native crash handlers: add
SENTRY_NATIVE_BACKENDenv var with default setting ofnone. (#2522)
Native crash reporting support withsentry-native'scrashpadwas added in v8.11.0 and has caused build-time issues
for some users, because it required newer build tools (newer versions of MSVC/Clang/GCC) than base Flutter SDK.
This broke the ability to build the app for some users compiling Windows and Linux apps with older toolchains.To avoid this issue, we're disabling the native crash handling by default for Linux and Windows for now.
You can enable it manually by setting theSENTRY_NATIVE_BACKEND=crashpadenvironment variable before runningflutter build.
You can read more about available backends that fit your use-case in sentry-native docs.We plan to change the default back to
crashpadin the next major SDK release.
8.11.1
8.12.0-beta.1
Features
- Replay: device orientation change support & improve video size fit on Android (#2462)
- Support custom
Sentry.runZoneGuardedzone creation (#2088)- Sentry will not create a custom zone anymore if it is started within a custom one.
- This fixes Zone miss-match errors when trying to initialize WidgetsBinding before Sentry on Flutter Web
Sentry.runZonedGuardedcreates a zone and also captures exceptions & breadcrumbs automatically.
Sentry.runZonedGuarded(() { WidgetsBinding.ensureInitialized(); // Errors before init will not be handled by Sentry SentryFlutter.init( (options) { ... }, appRunner: () => runApp(MyApp()), ); } (error, stackTrace) { // Automatically sends errors to Sentry, no need to do any // captureException calls on your part. // On top of that, you can do your own custom stuff in this callback. });
Fixes
- Masking semi-transparent widgets (#2472)
8.11.0
Features
-
Android 15: Add support for 16KB page sizes (#3620)
- See https://developer.android.com/guide/practices/page-sizes for more details
-
Support for screenshot PII content masking (#2361)
By default, masking is enabled for SessionReplay. To also enable it for screenshots captured with events, you can specifyoptions.experimental.privacy:await SentryFlutter.init( (options) { ... // the defaults are: options.experimental.privacy.maskAllText = true; options.experimental.privacy.maskAllImages = true; options.experimental.privacy.maskAssetImages = false; // you cal also set up custom masking, for example: options.experimental.privacy.mask<WebView>(); }, appRunner: () => runApp(MyApp()), );
Actually, just accessing this field will cause it to be initialized with the default settings to mask all text and images:
await SentryFlutter.init( (options) { ... // this has a side-effect of creating the default privacy configuration, thus enabling Screenshot masking: options.experimental.privacy; }, appRunner: () => runApp(MyApp()), );
-
Linux native error & obfuscation support (#2431)
-
Improve Device context on plain Dart and Flutter desktop apps (#2441)
-
Add debounce to capturing screenshots (#2368)
-
Per default, screenshots are debounced for 2 seconds.
-
If you need more granular screenshots, you can opt out of debouncing:
await SentryFlutter.init((options) { options.beforeCaptureScreenshot = (event, hint, debounce) { if (debounce) { return true; // Capture screenshot even if the SDK wants to debounce it. } else { // check event and hint ... } }; });
-
Replace deprecated
BeforeScreenshotCallbackwith newBeforeCaptureCallback.
-
-
Improve app start measurements by using
addTimingsCallbackinstead ofaddPostFrameCallbackto determine app start end (#2405)⚠️ This change may result in reporting of shorter app start durations
-
Improve frame tracking accuracy (#2372)
-
Introduces
SentryWidgetsFlutterBindingthat tracks a frame starting fromhandleBeginFrameand ending inhandleDrawFrame, this is approximately the buildDuration time -
By default,
SentryFlutter.init()automatically initializesSentryWidgetsFlutterBindingthrough theWidgetsFlutterBindingIntegration -
If you need to initialize the binding before
SentryFlutter.init, useSentryWidgetsFlutterBinding.ensureInitializedinstead ofWidgetsFlutterBinding.ensureInitialized:void main() async { // Replace WidgetsFlutterBinding.ensureInitialized() SentryWidgetsFlutterBinding.ensureInitialized(); await SentryFlutter.init(...); runApp(MyApp()); }
-
⚠️ Frame tracking will be disabled if a different binding is used
-
Enhancements
- Only send debug images referenced in the stacktrace for events (#2329)
- Remove
sentryframes if SDK falls back to current stack trace (#2351)- Flutter doesn't always provide stack traces for unhandled errors - this is normal Flutter behavior
- When no stack trace is provided (in Flutter errors,
captureException, orcaptureMessage):- SDK creates a synthetic trace using
StackTrace.current - Internal SDK frames are removed to reduce noise
- SDK creates a synthetic trace using
- Original stack traces (when provided) are left unchanged
Fixes
- Catch errors thrown during
handleBeginFrameandhandleDrawFrame(#2446) - OS & device contexts missing on Windows (#2439)
- Native iOS/macOS SDK session didn't start after Flutter hot-restart (#2452)
- Kotlin 2.1.0 compatibility on Android, bump Kotlin language version from
1.4to1.6(#2456) - Apply default IP address (
{{auto}}) to transactions (#2395)- Previously, transactions weren't getting the default IP address when user context was loaded
- Now consistently applies default IP address to both events and transactions when:
- No user context exists
- User context exists but IP address is null
Dependencies
8.11.0-beta.2
Features
- Support for screenshot PII content masking (#2361)
By default, masking is enabled for SessionReplay. To also enable it for screenshots captured with events, you can specifyoptions.experimental.privacy:Actually, just accessing this field will cause it to be initialized with the default settings to mask all text and images:await SentryFlutter.init( (options) { ... // the defaults are: options.experimental.privacy.maskAllText = true; options.experimental.privacy.maskAllImages = true; options.experimental.privacy.maskAssetImages = false; // you cal also set up custom masking, for example: options.experimental.privacy.mask<WebView>(); }, appRunner: () => runApp(MyApp()), );
await SentryFlutter.init( (options) { ... // this has a side-effect of creating the default privacy configuration, thus enabling Screenshot masking: options.experimental.privacy; }, appRunner: () => runApp(MyApp()), );
- Linux native error & obfuscation support (#2431)
- Improve Device context on plain Dart and Flutter desktop apps (#2441)
- Add debounce to capturing screenshots (#2368)
- Per default, screenshots are debounced for 2 seconds.
- If you need more granular screenshots, you can opt out of debouncing:
await SentryFlutter.init((options) { options.beforeCaptureScreenshot = (event, hint, debounce) { if (debounce) { return true; // Capture screenshot even if the SDK wants to debounce it. } else { // check event and hint ... } }; });
- Replace deprecated
BeforeScreenshotCallbackwith newBeforeCaptureCallback.
Fixes
- Catch errors thrown during
handleBeginFrameandhandleDrawFrame(#2446) - OS & device contexts missing on Windows (#2439)
- Native iOS/macOS SDK session didn't start after Flutter hot-restart (#2452)
- Kotlin 2.1.0 compatibility on Android, bump Kotlin language version from
1.4to1.6(#2456)
Dependencies
8.11.0-beta.1
Features
- Windows native error & obfuscation support (#2286, #2426)
- Improve app start measurements by using
addTimingsCallbackinstead ofaddPostFrameCallbackto determine app start end (#2405)⚠️ This change may result in reporting of shorter app start durations
- Improve frame tracking accuracy (#2372)
- Introduces
SentryWidgetsFlutterBindingthat tracks a frame starting fromhandleBeginFrameand ending inhandleDrawFrame, this is approximately the buildDuration time - By default,
SentryFlutter.init()automatically initializesSentryWidgetsFlutterBindingthrough theWidgetsFlutterBindingIntegration - If you need to initialize the binding before
SentryFlutter.init, useSentryWidgetsFlutterBinding.ensureInitializedinstead ofWidgetsFlutterBinding.ensureInitialized:
void main() async { // Replace WidgetsFlutterBinding.ensureInitialized() SentryWidgetsFlutterBinding.ensureInitialized(); await SentryFlutter.init(...); runApp(MyApp()); }
⚠️ Frame tracking will be disabled if a different binding is used
- Introduces
Enhancements
- Only send debug images referenced in the stacktrace for events (#2329)
- Remove
sentryframes if SDK falls back to current stack trace (#2351)- Flutter doesn't always provide stack traces for unhandled errors - this is normal Flutter behavior
- When no stack trace is provided (in Flutter errors,
captureException, orcaptureMessage):- SDK creates a synthetic trace using
StackTrace.current - Internal SDK frames are removed to reduce noise
- SDK creates a synthetic trace using
- Original stack traces (when provided) are left unchanged
Fixes
- Apply default IP address (
{{auto}}) to transactions (#2395)- Previously, transactions weren't getting the default IP address when user context was loaded
- Now consistently applies default IP address to both events and transactions when:
- No user context exists
- User context exists but IP address is null
Dependencies
8.10.1 (Stable)
Fixes
- Android build error when compiling (#2397)