diff --git a/packages/clerk_flutter/lib/src/widgets/control/clerk_error_listener.dart b/packages/clerk_flutter/lib/src/widgets/control/clerk_error_listener.dart index ed23e62..9b27fd0 100644 --- a/packages/clerk_flutter/lib/src/widgets/control/clerk_error_listener.dart +++ b/packages/clerk_flutter/lib/src/widgets/control/clerk_error_listener.dart @@ -5,7 +5,6 @@ import 'package:clerk_flutter/clerk_flutter.dart'; import 'package:clerk_flutter/src/utils/localization_extensions.dart'; import 'package:clerk_flutter/src/widgets/ui/style/colors.dart'; import 'package:clerk_flutter/src/widgets/ui/style/text_style.dart'; -import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; /// Clerk Error Handler @@ -24,35 +23,31 @@ class ClerkErrorListener extends StatefulWidget { /// Construct a [ClerkErrorListener] widget const ClerkErrorListener({ super.key, - this.handler = defaultErrorHandler, + this.handler, required this.child, }); /// Implement this function to handle errors - final ClerkErrorHandler handler; + final ClerkErrorHandler? handler; /// Child to wrap final Widget child; - /// Default Error Handler - static Future defaultErrorHandler( - BuildContext context, - AuthError error, - ) async { - final localizations = ClerkAuth.localizationsOf(context); - final message = error.localizedMessage(localizations); + @override + State createState() => _ClerkErrorListenerState(); +} - final messenger = ScaffoldMessenger.maybeOf(context); - if (messenger == null) { - if (kDebugMode) { - debugPrint( - 'Warning: no ScaffoldMessenger found ' - 'to display error: $message', - ); - } - return; +class _ClerkErrorListenerState extends State { + StreamSubscription? _errorSub; + + Future _errorHandler(AuthError error) async { + if (widget.handler case ClerkErrorHandler handler) { + return handler(context, error); } + final messenger = ScaffoldMessenger.of(context); + final localizations = ClerkAuth.localizationsOf(context); + final message = error.localizedMessage(localizations); final controller = messenger.showSnackBar( SnackBar( shape: const RoundedRectangleBorder( @@ -74,32 +69,25 @@ class ClerkErrorListener extends StatefulWidget { } @override - State createState() => _ClerkErrorListenerState(); -} - -class _ClerkErrorListenerState extends State { - late StreamSubscription _errorSub; - - @override - void initState() { - super.initState(); - _errorSub = ClerkAuth.errorStreamOf(context) - .asyncMap((error) => widget.handler(context, error)) - .listen(null); + void didChangeDependencies() { + super.didChangeDependencies(); + if (_errorSub == null) { + assert( + widget.handler != null || ScaffoldMessenger.maybeOf(context) != null, + 'ClerkErrorListener must be placed beneath a ScaffoldMessenger ' + 'in the widget tree, or a handler provided', + ); + _errorSub = + ClerkAuth.errorStreamOf(context).asyncMap(_errorHandler).listen(null); + } } @override void dispose() { - _errorSub.cancel(); + _errorSub?.cancel(); super.dispose(); } @override - Widget build(BuildContext context) { - assert( - ScaffoldMessenger.maybeOf(context) != null, - 'ClerkErrorListener must be placed beneath a ScaffoldMessenger in the widget tree', - ); - return widget.child; - } + Widget build(BuildContext context) => widget.child; }