diff --git a/apps/docs/content/guides/getting-started/tutorials/with-flutter.mdx b/apps/docs/content/guides/getting-started/tutorials/with-flutter.mdx index 6ec8c5fb811..34a270ecda7 100644 --- a/apps/docs/content/guides/getting-started/tutorials/with-flutter.mdx +++ b/apps/docs/content/guides/getting-started/tutorials/with-flutter.mdx @@ -130,15 +130,27 @@ These variables will be exposed on the app, and that's completely fine since we [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. ```dart lib/main.dart +import 'package:flutter/material.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + Future main() async { await Supabase.initialize( url: 'YOUR_SUPABASE_URL', anonKey: 'YOUR_SUPABASE_ANON_KEY', ); - runApp(MyApp()); + runApp(const MyApp()); } final supabase = Supabase.instance.client; + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp(title: 'Supabase Flutter'); + } +} ``` ### Set up splash screen @@ -154,7 +166,7 @@ class SplashPage extends StatefulWidget { const SplashPage({super.key}); @override - _SplashPageState createState() => _SplashPageState(); + State createState() => _SplashPageState(); } class _SplashPageState extends State { @@ -206,7 +218,7 @@ class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override - _LoginPageState createState() => _LoginPageState(); + State createState() => _LoginPageState(); } class _LoginPageState extends State { @@ -232,15 +244,19 @@ class _LoginPageState extends State { _emailController.clear(); } } on AuthException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -309,7 +325,7 @@ class AccountPage extends StatefulWidget { const AccountPage({super.key}); @override - _AccountPageState createState() => _AccountPageState(); + State createState() => _AccountPageState(); } class _AccountPageState extends State { @@ -331,15 +347,19 @@ class _AccountPageState extends State { _usernameController.text = (data['username'] ?? '') as String; _websiteController.text = (data['website'] ?? '') as String; } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -371,15 +391,19 @@ class _AccountPageState extends State { ); } } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -393,15 +417,19 @@ class _AccountPageState extends State { try { await supabase.auth.signOut(); } on AuthException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { Navigator.of(context).pushReplacementNamed('/login'); @@ -470,12 +498,14 @@ Future main() async { url: 'YOUR_SUPABASE_URL', anonKey: 'YOUR_SUPABASE_ANON_KEY', ); - runApp(MyApp()); + runApp(const MyApp()); } final supabase = Supabase.instance.client; class MyApp extends StatelessWidget { + const MyApp({super.key}); + @override Widget build(BuildContext context) { return MaterialApp( @@ -569,7 +599,7 @@ class Avatar extends StatefulWidget { final void Function(String) onUpload; @override - _AvatarState createState() => _AvatarState(); + State createState() => _AvatarState(); } class _AvatarState extends State { @@ -668,7 +698,7 @@ class AccountPage extends StatefulWidget { const AccountPage({super.key}); @override - _AccountPageState createState() => _AccountPageState(); + State createState() => _AccountPageState(); } class _AccountPageState extends State { @@ -695,15 +725,19 @@ class _AccountPageState extends State { _websiteController.text = (data['website'] ?? '') as String; _avatarUrl = (data['avatar_url'] ?? '') as String; } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -735,15 +769,19 @@ class _AccountPageState extends State { ); } } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -757,15 +795,19 @@ class _AccountPageState extends State { try { await supabase.auth.signOut(); } on AuthException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { Navigator.of(context).pushReplacementNamed('/login'); @@ -787,15 +829,19 @@ class _AccountPageState extends State { ); } } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } if (!mounted) { return; diff --git a/examples/user-management/flutter-user-management/lib/components/avatar.dart b/examples/user-management/flutter-user-management/lib/components/avatar.dart index dfafdd4d476..f11233cd676 100644 --- a/examples/user-management/flutter-user-management/lib/components/avatar.dart +++ b/examples/user-management/flutter-user-management/lib/components/avatar.dart @@ -14,7 +14,7 @@ class Avatar extends StatefulWidget { final void Function(String) onUpload; @override - _AvatarState createState() => _AvatarState(); + State createState() => _AvatarState(); } class _AvatarState extends State { diff --git a/examples/user-management/flutter-user-management/lib/main.dart b/examples/user-management/flutter-user-management/lib/main.dart index 023d4f87eb4..136c1145a21 100644 --- a/examples/user-management/flutter-user-management/lib/main.dart +++ b/examples/user-management/flutter-user-management/lib/main.dart @@ -12,12 +12,14 @@ Future main() async { url: dotenv.env['SUPABASE_URL']!, anonKey: dotenv.env['SUPABASE_ANON_KEY']!, ); - runApp(MyApp()); + runApp(const MyApp()); } final supabase = Supabase.instance.client; class MyApp extends StatelessWidget { + const MyApp({super.key}); + @override Widget build(BuildContext context) { return MaterialApp( diff --git a/examples/user-management/flutter-user-management/lib/pages/account_page.dart b/examples/user-management/flutter-user-management/lib/pages/account_page.dart index e0bfa574cab..806231cd5f4 100644 --- a/examples/user-management/flutter-user-management/lib/pages/account_page.dart +++ b/examples/user-management/flutter-user-management/lib/pages/account_page.dart @@ -7,7 +7,7 @@ class AccountPage extends StatefulWidget { const AccountPage({super.key}); @override - _AccountPageState createState() => _AccountPageState(); + State createState() => _AccountPageState(); } class _AccountPageState extends State { @@ -31,15 +31,19 @@ class _AccountPageState extends State { _websiteController.text = (data['website'] ?? '') as String; _avatarUrl = (data['avatar_url'] ?? '') as String; } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -71,15 +75,19 @@ class _AccountPageState extends State { ); } } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -93,15 +101,19 @@ class _AccountPageState extends State { try { await supabase.auth.signOut(); } on AuthException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { Navigator.of(context).pushReplacementNamed('/login'); @@ -123,15 +135,19 @@ class _AccountPageState extends State { ); } } on PostgrestException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } if (!mounted) { return; diff --git a/examples/user-management/flutter-user-management/lib/pages/login_page.dart b/examples/user-management/flutter-user-management/lib/pages/login_page.dart index 1655d214761..1fe5d42e645 100644 --- a/examples/user-management/flutter-user-management/lib/pages/login_page.dart +++ b/examples/user-management/flutter-user-management/lib/pages/login_page.dart @@ -9,7 +9,7 @@ class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override - _LoginPageState createState() => _LoginPageState(); + State createState() => _LoginPageState(); } class _LoginPageState extends State { @@ -35,15 +35,19 @@ class _LoginPageState extends State { _emailController.clear(); } } on AuthException catch (error) { - SnackBar( - content: Text(error.message), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: Text(error.message), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } catch (error) { - SnackBar( - content: const Text('Unexpected error occurred'), - backgroundColor: Theme.of(context).colorScheme.error, - ); + if (mounted) { + SnackBar( + content: const Text('Unexpected error occurred'), + backgroundColor: Theme.of(context).colorScheme.error, + ); + } } finally { if (mounted) { setState(() { @@ -68,8 +72,8 @@ class _LoginPageState extends State { @override void dispose() { - _authStateSubscription.cancel(); _emailController.dispose(); + _authStateSubscription.cancel(); super.dispose(); } diff --git a/examples/user-management/flutter-user-management/lib/pages/splash_page.dart b/examples/user-management/flutter-user-management/lib/pages/splash_page.dart index 126b46b7550..7c7b0da1008 100644 --- a/examples/user-management/flutter-user-management/lib/pages/splash_page.dart +++ b/examples/user-management/flutter-user-management/lib/pages/splash_page.dart @@ -5,7 +5,7 @@ class SplashPage extends StatefulWidget { const SplashPage({super.key}); @override - _SplashPageState createState() => _SplashPageState(); + State createState() => _SplashPageState(); } class _SplashPageState extends State {