8.11.0
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
: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
BeforeScreenshotCallback
with newBeforeCaptureCallback
.
-
-
Improve app start measurements by using
addTimingsCallback
instead ofaddPostFrameCallback
to determine app start end (#2405)⚠️ This change may result in reporting of shorter app start durations
-
Improve frame tracking accuracy (#2372)
-
Introduces
SentryWidgetsFlutterBinding
that tracks a frame starting fromhandleBeginFrame
and ending inhandleDrawFrame
, this is approximately the buildDuration time -
By default,
SentryFlutter.init()
automatically initializesSentryWidgetsFlutterBinding
through theWidgetsFlutterBindingIntegration
-
If you need to initialize the binding before
SentryFlutter.init
, useSentryWidgetsFlutterBinding.ensureInitialized
instead 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
sentry
frames 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
handleBeginFrame
andhandleDrawFrame
(#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.4
to1.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