💡

[firebaseAuth✖️flutter✖️MVVM]ログイン結果をしらせるsnackBarを表示する

2024/05/05に公開

どうも1
初心者flutterプログラマーのちゃきです!
今回は、新規登録・ログインの結果を知らせるsnackBarを作っていきます💪

MVVM型で、
Model → 処理結果をString型で作成する
ViewModel → Modelでえた処理結果をViewに返す
View → showSnackBarで処理結果を表示する
の構造で作っていきます

Model(処理結果をString型で作成)

新規登録もログインも同じ方法で、処理の結果をString型で返します。

  //⭐️新規登録⭐️
  Future<String> createUser({
    required email,
    required password,
  }) async {
    try {
      await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      state = FirebaseAuth.instance.currentUser!;
      return 'success'; //①処理がうまくいった場合、successを返す
    } on FirebaseAuthException catch (e) {
      return e.toString(); //②firebaseAuthのエラーがあった場合、errorをString型にして返す。
    } catch (e) {
      return e.toString(); //③その他のエラーがあった場合、errorをString型にして返す
    }
  }

  //⭐️ログイン⭐️
  Future<String> signIn({
    required email,
    required password,
  }) async {
    try {
      await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: email,
        password: password,
      );
      state = FirebaseAuth.instance.currentUser!;
      return 'success';
    } on FirebaseAuthException catch (e) {
      return e.toString();
    } catch (e) {
      return e.toString();
    }
  }

ViewModel(Modelの結果をViewに渡す)

Modelから受け取った処理の結果を、viewに返します。

  Future<String> createUser({
    required email,
    required password,
  }) async {
    state = const AsyncLoading();
    final result = await ref.read(authModelProvider.notifier).createUser(
          email: email,
          password: password,
        );
    state = const AsyncData(null);
    return result;
  }

  //サインイン
  Future<String> signIn({
    required email,
    required password,
  }) async {
    state = const AsyncLoading();
    final result = await ref.read(authModelProvider.notifier).signIn(
          email: email,
          password: password,
        );
    state = const AsyncData(null);
    return result;
  }

View(showSnackBarで処理結果を画面上に表示)

ViewModelから受け取った結果を、スナックバーにしてユーザーに画面上で知らせます。

    //⭐️新規登録⭐️
            ElevatedButton(
              onPressed: () async {
                //1、新規登録の結果を受け取る
                final String result =
                    await ref.read(authViewModelProvider.notifier).createUser(
                          email: emailController.text,
                          password: passController.text,
                        );
                //2、resultを表示するスナックバーを定義する。

                final snackBar = SnackBar(content: Text(result));
                //3、contextがうまくいっていないときは処理を終了する
                if (!context.mounted) {
                  return;
                }
                //4、resultを表示するスナックバーを走らせる。
                ScaffoldMessenger.of(context).showSnackBar(snackBar);
              },
              child: const Text('新規登録'),
            ),
       //⭐️ログイン⭐️
            ElevatedButton(
              onPressed: () async {
                final result =
                    await ref.read(authViewModelProvider.notifier).signIn(
                          email: emailController.text,
                          password: passController.text,
                        );
                final snackBar = SnackBar(content: Text(result));
                if (!context.mounted) {
                  return;
                }
                ScaffoldMessenger.of(context).showSnackBar(snackBar);
              },
              child: const Text('ログイン'),
            ),

おわりに

ここまで読んでくださってありがとうございました✨✨
明日はfirebaseAuthのまとめ記事を投稿するので、もしご興味あれば見に来てください!

Discussion