Hi, 我是鱼板伯爵今天要把侦错的功能加上去,教学内容只会撷取片段程序码,建议大家搭配完整程序码来练习。
dartz: ^0.9.2
我创建了一个错误讯息的类别,如果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: "");
}
将所有功能都加上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"));
}
}
}
EditText与TextView相似,但EditText用於APP需要输入资料时,例如:输入姓名、...
辅助魔法 今日会把架构上的剩下服务讲完。 NACL这边使用预设的,就不用在YAML特别撰写。 Rou...
环境 Windows 10 19043 System Monitor v13.01 前情提要 在【D...
工欲善其事,必先利其器,插件是Coding效率提升的利器 今天要来介绍的主角是Visual Stud...
又踩雷啦啊哈哈哈哈哈。 来重现一下遇到的情境吧 bug 出现 export class AppCom...