Hi, 我是鱼板伯爵接着就是来验证登入状态,如果已经登入就跳转到首页否则就在登入画面,看完我这句话就知道要使用Bloc了,只要是画面与功能就要使用到Bloc。以上是一个基本的状态你还可以检查有没有重复登入等...。
事件分成三个,AppStarted用於开启APP时触发的事件,用来检查有没有登入,如果没有就跳转到登入介面,LoggedIn用於登入成功时触发把未登入状态
切换成已登入状态
,最後就LoggedOut是登出按钮触发时使用,将已登入
状态切换成未登入状态
。
part of 'authentication_bloc.dart';
abstract class AuthenticationEvent extends Equatable {
const AuthenticationEvent();
@override
List<Object> get props => [];
}
class AppStarted extends AuthenticationEvent {}
class LoggedIn extends AuthenticationEvent {}
class LoggedOut extends AuthenticationEvent {}
状态可以分成两个,未认证与认证,如果认证成功就切换到首页否则就停留在登入画面。
part of 'authentication_bloc.dart';
abstract class AuthenticationState extends Equatable {
const AuthenticationState();
@override
List<Object> get props => [];
}
class AuthenticationInitial extends AuthenticationState {}
class Authenticated extends AuthenticationState {
final String displayName;
const Authenticated(this.displayName);
@override
List<Object> get props => [displayName];
}
class Unauthenticated extends AuthenticationState {}
判断三个事件所要触法的功能,写到这边时大家应该都对这个架构感觉了吧,是不是觉得越来越美了呢。
import 'dart:async';
import 'dart:developer';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:stunning_tribble/infrastructure/auth/auth_repository.dart';
part 'authentication_event.dart';
part 'authentication_state.dart';
class AuthenticationBloc
extends Bloc<AuthenticationEvent, AuthenticationState> {
final AuthRepository _userRepository;
AuthenticationBloc({
required AuthRepository userRepository,
}) : _userRepository = userRepository,
super(AuthenticationInitial());
@override
Stream<AuthenticationState> mapEventToState(
AuthenticationEvent event,
) async* {
if (event is AppStarted) {
yield* _mapAppStartedToState();
} else if (event is LoggedIn) {
yield* _mapLoggedInToState();
} else if (event is LoggedOut) {
yield* _mapLoggedOutToState();
}
}
Stream<AuthenticationState> _mapAppStartedToState() async* {
final isSignedIn = await _userRepository.isSignedIn();
yield* isSignedIn.fold(
(failure) async* {
log("$failure");
yield Unauthenticated();
},
(isSignedInSuccess) async* {
yield* _mapLoggedInToState();
},
);
}
Stream<AuthenticationState> _mapLoggedInToState() async* {
final user = await _userRepository.getUser();
yield* user.fold(
(failure) async* {
log("$failure");
yield Unauthenticated();
},
(user) async* {
yield Authenticated(user.displayName.toString());
},
);
}
Stream<AuthenticationState> _mapLoggedOutToState() async* {
final signOut = await _userRepository.signOut();
yield* signOut.fold(
(failure) async* {
log("$failure");
yield Unauthenticated();
},
(r) async* {
yield Unauthenticated();
},
);
}
}
在开始撰写测试之前,先带大家来了解一下 Angular 预设使用的测试框架 ─ Karma 。 K...
这是算是一个被我忽略的工具,赛程中时不时提起,直到铁人赛快结束我才想起来,这项工具也是该介绍的,他就...
Colab连结 今天大家介绍 Gradient Exploding (梯度爆炸) 与 Gradien...
前面Day11和Day12的文章看到一些错误,已经修正了,之後这系列写完再把完整一点的.py档放到g...
参考资料 Alex老师教学 pjchender笔记 JS30-Day17-Sort Without ...