[Day25] Flutter - Application Authentication (part9)

前言

Hi, 我是鱼板伯爵接着就是来验证登入状态,如果已经登入就跳转到首页否则就在登入画面,看完我这句话就知道要使用Bloc了,只要是画面与功能就要使用到Bloc。以上是一个基本的状态你还可以检查有没有重复登入等...。

完整程序码

需要具备知识

Authentication:Event

事件分成三个,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 {}

Authentication:State

状态可以分成两个,未认证与认证,如果认证成功就切换到首页否则就停留在登入画面。

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 {}

Authentication:Bloc

判断三个事件所要触法的功能,写到这边时大家应该都对这个架构感觉了吧,是不是觉得越来越美了呢。

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();
      },
    );
  }
}


<<:  Day25 ( 游戏设计 ) 翻转吃豆子

>>:  Day 11. Zabbix 网页介面介绍

Angular 深入浅出三十天:表单与测试 Day04 - 开始撰写测试之前必须要知道的二三事

在开始撰写测试之前,先带大家来了解一下 Angular 预设使用的测试框架 ─ Karma 。 K...

命令提示字元--CMD那麽好用你不学一下吗?

这是算是一个被我忽略的工具,赛程中时不时提起,直到铁人赛快结束我才想起来,这项工具也是该介绍的,他就...

【17】训练到一半遇到 nan 吗? 梯度爆炸与梯度消失的测试实验

Colab连结 今天大家介绍 Gradient Exploding (梯度爆炸) 与 Gradien...

[Day13] 策略最佳化模组改造(3)

前面Day11和Day12的文章看到一些错误,已经修正了,之後这系列写完再把完整一点的.py档放到g...

Day32 - JS30 - 17 - Sort Without Articles

参考资料 Alex老师教学 pjchender笔记 JS30-Day17-Sort Without ...