[Day23] Flutter - Domain Error Handle (part7)

前言

Hi, 我是鱼板伯爵今天要把侦错的功能加上去,教学内容只会撷取片段程序码,建议大家搭配完整程序码来练习。

完整程序码

需准备的知识

[Day15] Flutter - 大海捞针不是办法 ( Dartz )

安装

dartz: ^0.9.2

Domain:Google Failure

我创建了一个错误讯息的类别,如果Google登入出错时会出现GoogleAuthServerFailure,如果你还有FB、Github等的登入你可以往里面一直新增,FirebaseAuthFailure则是处理登入获取使用者资料的错误讯息。

import 'package:equatable/equatable.dart';

abstract class AuthFailure extends Equatable {
  final String message;

  AuthFailure({required this.message});

  @override
  List<Object> get props => [message];
}

class GoogleAuthServerFailure extends AuthFailure {
  GoogleAuthServerFailure({required String message}) : super(message: "");
}

class FirebaseAuthFailure extends AuthFailure {
  FirebaseAuthFailure({required String message}) : super(message: "");
}

修改 Infrastructure Auth

将所有功能都加上AuthFailure,我多新增了一个getUser,这样一来登入完成後可以直接获取使用者资讯。

import 'package:dartz/dartz.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:stunning_tribble/domain/auth/auth_failure.dart';

abstract class AuthRepositoryImpl {
  /// Used when the google login button is triggered.
  Future<Either<AuthFailure, Unit>> signInWithGoogle();

  /// Check if you are logged in.
  Future<Either<AuthFailure, Unit>> isSignedIn();

  /// Log out of device.
  Future<Either<AuthFailure, Unit>> signOut();

  /// Get current user info.
  Future<Either<AuthFailure, User>> getUser();
}

class AuthRepository implements AuthRepositoryImpl {
  final FirebaseAuth _firebaseAuth;
  final GoogleSignIn _googleSignIn;

  AuthRepository()
      : _firebaseAuth = FirebaseAuth.instance,
        _googleSignIn = GoogleSignIn();

  @override
  Future<Either<AuthFailure, Unit>> signInWithGoogle() async {
    try {
      final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
      if (googleUser == null) {
        return left(GoogleAuthServerFailure(message: "Cache User Failure"));
      }
      final GoogleSignInAuthentication googleAuth =
          await googleUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );
      await _firebaseAuth.signInWithCredential(credential);

      return right(unit);
    } catch (e) {
      return left(GoogleAuthServerFailure(message: "$e"));
    }
  }

  @override
  Future<Either<AuthFailure, Unit>> isSignedIn() async {
    try {
      final User? currentUser = _firebaseAuth.currentUser;
      if (currentUser != null) {
        return right(unit);
      } else {
        return left(FirebaseAuthFailure(message: "Not Logged In"));
      }
    } catch (e) {
      return left(FirebaseAuthFailure(message: "$e"));
    }
  }

  Future<Either<AuthFailure, User>> getUser() async {
    try {
      return right(_firebaseAuth.currentUser);
    } catch (_) {
      return left(FirebaseAuthFailure(message: "Get Current User Failure"));
    }
  }

  @override
  Future<Either<AuthFailure, Unit>> signOut() async {
    try {
      Future.wait([
        _firebaseAuth.signOut(),
        _googleSignIn.signOut(),
      ]);
      return right(unit);
    } catch (e) {
      return left(FirebaseAuthFailure(message: "$e"));
    }
  }
}


<<:  入门魔法 - 物件

>>:  DAY09随机森林演算法(回归方法)

[Android Studio 30天自我挑战] EditText的元件介绍

EditText与TextView相似,但EditText用於APP需要输入资料时,例如:输入姓名、...

辅助魔法强化AWS上的服务扩大范围

辅助魔法 今日会把架构上的剩下服务讲完。 NACL这边使用预设的,就不用在YAML特别撰写。 Rou...

【Day 28】Cmd 指令很乱,主办单位要不要管一下 (下) - Cmd 指令混淆

环境 Windows 10 19043 System Monitor v13.01 前情提要 在【D...

改造你的VSCode,大幅提升你的Coding效率

工欲善其事,必先利其器,插件是Coding效率提升的利器 今天要来介绍的主角是Visual Stud...

Angular 浅拷贝之...日记文

又踩雷啦啊哈哈哈哈哈。 来重现一下遇到的情境吧 bug 出现 export class AppCom...