fireflutter 0.3.22 copy "fireflutter: ^0.3.22" to clipboard
fireflutter: ^0.3.22 copied to clipboard

A lightning-fast, robust CMS for seamless real-time content management in app development.

example/lib/main.dart

import 'dart:async';

import 'package:example/firebase_options.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:fireflutter/fireflutter.dart';
import 'package:flutter/material.dart';

final GlobalKey<NavigatorState> navigatorKey = GlobalKey();
BuildContext get globalContext => navigatorKey.currentState!.overlay!.context;

void main() async {
  runZonedGuarded(
    () async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.currentPlatform,
      );

      runApp(const MyApp());

      FlutterError.onError = (FlutterErrorDetails details) {
        FlutterError.dumpErrorToConsole(details);
      };
    },
    zoneErrorHandler,
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    UserService.instance.init();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: defaultLightTheme(context: context),
      navigatorKey: navigatorKey,
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('FireFlutter Quick Start App'),
      ),
      body: Column(
        children: [
          AuthReady(
            builder: (uid) => Padding(
              padding: const EdgeInsets.all(24),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('UID: $uid'),
                  const SizedBox(height: 24),
                  const Text('User menu'),
                  Wrap(
                    spacing: 8,
                    children: [
                      ElevatedButton(
                        onPressed: () => UserService.instance
                            .showProfileUpdateScreen(context),
                        child: const Text('Profile'),
                      ),
                      ElevatedButton(
                        onPressed: () => UserService.instance.signOut(),
                        child: const Text('Sign Out'),
                      ),
                      ElevatedButton(
                        onPressed: () => UserService.instance.signOut(),
                        child: const Text('Blocks'),
                      ),
                      ElevatedButton(
                        onPressed: () => UserService.instance.signOut(),
                        child: const Text('Reports'),
                      ),
                    ],
                  ),
                  const SizedBox(height: 24),
                  Wrap(
                    spacing: 8,
                    children: [
                      ElevatedButton(
                        onPressed: () => UserService.instance
                            .showProfileUpdateScreen(context),
                        child: const Text('User Search'),
                      ),
                      ElevatedButton(
                        onPressed: () => UserService.instance.signOut(),
                        child: const Text('Sign Out'),
                      ),
                    ],
                  ),
                  const SizedBox(height: 24),
                  const NewProfilePhotos(),
                ],
              ),
            ),
            notLoginBuilder: () => Theme(
              data: bigElevatedButtonTheme(context),
              child: const SimpleEmailPasswordLoginForm(),
            ),
          ),
        ],
      ),
    );
  }
}

zoneErrorHandler(e, stackTrace) {
  dog("----> runZoneGuarded() : Exceptions outside flutter framework.");
  dog("--------------------------------------------------------------");
  dog("---> runtimeType: ${e.runtimeType}");

  if (e is FirebaseAuthException) {
    String message = "${e.code} - ${e.message}";
    if (e.code == 'invalid-email') {
      message = '잘못된 이메일 주소입니다.';
    } else if (e.code == 'weak-password') {
      message = '비밀번호를 더 어렵게 해 주세요. 대소문자, 숫자 및 특수문자를 포함하여 6자 이상으로 입력해주세요.';
    } else if (e.code == 'email-already-in-use') {
      message = '메일 주소 또는 비밀번호를 잘못 입력하였습니다.';
    }
    toast(context: globalContext, message: '로그인 에러 :  $message');
  } else if (e is FirebaseException) {
    dog("FirebaseException :  ${e.code}, ${e.message}");
    if (e.plugin == 'firebase_storage') {
      if (e.code == 'unknown') {
        error(
            context: globalContext,
            message: '파일 업로드 에러 :  ${e.message}\n\nStorage 서비스를 확인해주세요.');
      } else {
        error(context: globalContext, message: e.toString());
      }
    } else {
      error(context: globalContext, message: e.toString());
    }
  } else if (e is FireFlutterException) {
    dog("FireshipException: (${e.code}) - ${e.message}");
    if (e.code == 'input-email') {
      error(context: globalContext, message: '이메일 주소를 입력해주세요.');
    } else if (e.code == 'input-password') {
      error(context: globalContext, message: '비밀번호를 입력해주세요.');
    } else {
      error(context: globalContext, title: e.code, message: e.message);
    }
  } else {
    dog("Unknown Error :  $e");
    error(context: globalContext, message: e.toString());
  }
  debugPrintStack(stackTrace: stackTrace);
}