Login Management API pada Flutter Part 2



Setelah sebelumnya kita memfokuskan pada segi UI di Login Management pada Flutter Part 1 klik disini   ). Pada kala ini kita akan menfokuskan pada Management request apinya 😁. Dalam Pembuatannya kita create new file terlebih dahulu TokenBloc.dart, TokenEvent.dart dan TokenState.dart

TokenBloc adalah logic dari login, dimana dalam bloc kita dapat mengatur flow dari login tersebut.  Pada kali ini kita membuat flow pertama hit token terlebih dahulu jika response dari token success baru dilanjutkan dengan proses login, jika failed maka akan di kembalikan ke page login untuk menampilkan paga failed, dan saat proses request data akan ditampilkan loading process.
 
class TokenBloc extends Bloc<TokenTokenEvent, TokenState> {
  ApiTokenRepository _apiTokenRepository = new ApiTokenRepository(); 
  @override
  TokenState get initialState => TokenLoginInitialized();

  @override
  Stream<TokenState> mapEventToState(TokenTokenEvent event) async* {
    try{
      if (event is FetchLoginTokenEvent){
        yield TokenLoginLoading();

        TokenModel tokenModel = await _apiTokenRepository.fetchToken();

        if (tokenModel.itemToken.isEmpty){
          yield TokenLoginFailed(tokenModel.error);
          return;
        }

        final prefs = await SharedPreferences.getInstance();
        prefs.setString('token', tokenModel.itemToken);
         
        LoginModel loginModel = await _apiTokenRepository.fetchLogin(event.username, event.password);

        if (loginModel.error.isNotEmpty){
          yield  LoginLoaded(loginModel);
          return;
        }

        yield TokenLoginFailed(loginModel.error);
      }

    }catch(error){
      debugPrint(error);
    }
  }
}

TokenEvent adalah relation antara page login dengan TokenBloc,  dimana pada pada TokenEvent ini hanya ada dua event yang diberikan yaitu startLoginTokenEvent dan FetchLoginTokenEvent
startLoginTokenEvent : event pertama kali saat pertama kali login di tampilkan.
FetchLoginTokenEvent : event ini adalah event ketika klik login button.
 
abstract class TokenEvent{} 

class startLoginTokenEvent extends TokenEvent{}

class FetchLoginTokenEvent extends TokenEvent{
  String username;
  String password;
  FetchLoginTokenEvent(this.username, this.password);
}

TokenState adalah relation antara Bloc dengan request. dimana dengan state ini digunakan untuk menyampaikan response yang diberikan backend ke TokenBloc yang kemudian di teruskan ke UI dengan menggunakan event
 
abstract class TokenState {}

class TokenLoginInitialized extends TokenState{}

class TokenLoginLoading extends TokenState {}

class TokenLoginFailed extends TokenState{
  String errorMessage;
  TokenLoginFailed(this.errorMessage);
}

class LoginLoaded extends TokenState{
  LoginModel loginModel;

  LoginLoaded(this.loginModel);
}

Setelah ketiga file ini terbuat kita mulai dengan pembuatan request ke backend. Pada request ke backend kita menggunakan dio library. dio library yang digunakan kali menggunakan dio library yang telah kami modifikasi sehingga akan memudahkan kita dalam proses request ke backendklik  ).

getTokenGenerate  adalah singleSignon dalam aplikasi ini atau secuity apa pada saat masuk kedalam main application
 
Future<TokenModel> getTokenGenerate() async { 
    var bodyRequest = {
      "client_id": "007",
      "client_secret": "James Bon",
    };

    try{
      final response = await ApiServiceHit("token", bodyRequest);
      debugPrint('response success : ${response.data.toString()}');
      var accessToken = response.data["data"]["access_token"].toString();    
      return TokenModel(accessToken);
    }catch(error){
      debugPrint('Error request : $error');
      return TokenModel.withError(error);
    }
}
 
getLogin adalah request yang di berikan ke backend untuk mendapatkan apa - apa yang dibutuhkan dalam main application.

Future<LoginModel> getLogin(String username, String password) async{  
    var bodyRequest = {
      "username": username,
      "password": password, 
    }; 

    try{
      final response = await ApiServiceHit("other", bodyRequest);
      debugPrint('response success : ${response.data.toString()}');
      itemLogin  item = itemLogin(response.data["data"]["id_username"].toString(),response.data["data"]["username"].toString());
      return LoginModel(item);
    }catch(error){
      debugPrint('Error request : $error');
      return TokenModel.withError(error);
    }
  }
 
Alangkah baiknya  jika kedua function tersebut dimasukkan ke dalam satu class untuk memudahkan dalam proses pembacaan code :

class ApiTokenProvider {
  ApiSession apiSession = new ApiSession();
  securityModule securitymodule = new securityModule();

  Future<TokenModel> getTokenGenerate() async { 
    var bodyRequest = {
      "client_id": "007",
      "client_secret": "James Bon",
    };

    try{
      final response = await ApiServiceHit("token", bodyRequest);
      debugPrint('response success : ${response.data.toString()}');
      var accessToken = response.data["data"]["access_token"].toString();    
      return TokenModel(accessToken);
    }catch(error){
      debugPrint('Error request : $error');
      return TokenModel.withError(error);
    }
  }

  Future<LoginModel> getLogin(String username, String password) async{  
    var bodyRequest = {
      "username": username,
      "password": password, 
    }; 

    try{
      final response = await ApiServiceHit("other", bodyRequest);
      debugPrint('response success : ${response.data.toString()}');

      itemLogin  item = itemLogin(response.data["data"]["id_username"].toString(),response.data["data"]["username"].toString());

      return LoginModel(item);
    }catch(error){
      debugPrint('Error request : $error');
      return TokenModel.withError(error);
    }
  }
}
 
ApiTokenRepository adalah class yang memudahkan kita untuk memanggil class provider dimanapun kita mau.
 
class ApiTokenRepository{
  final ApiTokenProvider _apiTokenProvider = new ApiTokenProvider();

  Future<TokenModel> fetchToken() => _apiTokenProvider.getTokenGenerate();
  Future<dynamic> fetchLogin(username, password) => _apiTokenProvider.getLogin(username, password);
}


Berikut Link full source code dari dari Login Management pada Flutter  😊:










Login Management API pada Flutter Part 2 Login Management API pada Flutter Part 2 Reviewed by sdiik on يونيو 07, 2020 Rating: 5

ليست هناك تعليقات:

يتم التشغيل بواسطة Blogger.