스마트시대

FIREBASE AUTHENTICATION 24.0 createUserWithEmailAndPassword 24.1 signOut 24.2 signInWithEmailAndPassword 24.4 Github Login 본문

Programing/Flutter

FIREBASE AUTHENTICATION 24.0 createUserWithEmailAndPassword 24.1 signOut 24.2 signInWithEmailAndPassword 24.4 Github Login

스마트시대 2023. 5. 30. 12:57
728x90

24.0 createUserWithEmailAndPassword

이메일 비밀번호 

 

 

import 'dart:async';

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:tiktok_clone/features/authentication/repos/authentication_repo.dart';

//(24.0)
class SignUpViewModel extends AsyncNotifier<void> {
  late final AuthenticationRepository _authRepo;
  @override
  FutureOr<void> build() {
    _authRepo = ref.read(authRepo);
  }

  Future<void> signUp() async {
    state = const AsyncValue.loading();
    final form = ref.read(signUpForm);
    state = await AsyncValue.guard(
      () async => await _authRepo.signUp(
        form["email"],
        form["password"],
      ),
    );
  }
}

final signUpForm = StateProvider((ref) => {});

final signUpProvider = AsyncNotifierProvider<SignUpViewModel, void>(
  () => SignUpViewModel(),
);

consumerstate로 바꾸고

한 번 signup하면 새로고침해도 firebase가 정보 기억하여 바로 main_navigation으로 간다.

 

24.1 signOut

 

24.2 signInWithEmailAndPassword 

//(24.2)
class LoginFormScreen extends ConsumerStatefulWidget {
  const LoginFormScreen({super.key});

  @override
  //(24.2)
  ConsumerState<LoginFormScreen> createState() => _LoginFormScreenState();
}


//(24.2)
class _LoginFormScreenState extends ConsumerState<LoginFormScreen> {
----------------

  //global key: 고유 식별자 역할, 폼의 state에 접근, 폼의 메서드 실행 목적
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  
  
    void _onSubmitTap() {
    if (_formKey.currentState != null) {
      if (_formKey.currentState!.validate()) {
        _formKey.currentState!.save();
  ----------------
          //(24.2)로그인하면 바로 mainnavi로 가는거,패스워드 잊어버렸을 때 나오는 팝업
        ref.read(loginProvider.notifier).login(
              formData["email"]!,
              formData["password"]!,
              context,
              ----------------
            );
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
    
    
    
                  Gaps.v28,
              GestureDetector(
                onTap: _onSubmitTap,
                child: FormButton(
                              ----------------
                  //(24.2)
                  // disabled: false,
                  disabled: ref.watch(loginProvider).isLoading,
                                ----------------
                ),

 

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:tiktok_clone/features/authentication/repos/authentication_repo.dart';
import 'package:tiktok_clone/utils.dart';

//(24.2)
class LoginViewModel extends AsyncNotifier<void> {
  late final AuthenticationRepository _repository;

  @override
  FutureOr<void> build() {
    _repository = ref.read(authRepo);
  }

  Future<void> login(
    String email,
    String password,
    BuildContext context,
  ) async {
    state = const AsyncValue.loading();
    state = await AsyncValue.guard(
      () async => await _repository.signIn(email, password),
    );
    //패스워드 잊어버렸을 때 나오는 팝업
    if (state.hasError) {
      //이렇게 하면stream이 변하는 걸 감지할 필요 없음
      showFirebaseErrorSnack(context, state.error);
    } else {
      context.go("/home");
    }
  }
}

final loginProvider = AsyncNotifierProvider<LoginViewModel, void>(
  () => LoginViewModel(),
);

 

이렇게 하면 로그인되고 main_navigation화면으로 항상 리다이렉트 됨.

 

24.3 Social Auth Config

Ios, android 인증할 때 참고하기

https://github.com/settings/applications/new

 

Authorization callback URL

는 밑에서 생성된 URL 넣기

https://firebase.google.com/docs/auth/ios/github-auth?hl=en#handle_the_sign-in_flow_with_the_firebase_sdk 

여기 참고

REVERSED_CLIENT_ID can't use anymore, rather than you need to use "General Settings page of the Firebase console, in the section for your iOS app". 2023/05/23

여기 정보를 추가해준다.(인코딩된 앱 ID넣기)

 

이렇게 복사해 넣기

 

24.4 Github Login

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:tiktok_clone/features/authentication/repos/authentication_repo.dart';
import 'package:tiktok_clone/utils.dart';

//(24.4)
class SocialAuthViewModel extends AsyncNotifier<void> {
  late final AuthenticationRepository _repository;

  @override
  FutureOr<void> build() {
    _repository = ref.read(authRepo);
  }

  Future<void> githubSingIn(BuildContext context) async {
    state = const AsyncValue.loading();
    state = await AsyncValue.guard(
      () async => await _repository.githubSignIn(),
    );
    if (state.hasError) {
      showFirebaseErrorSnack(context, state.error);
    } else {
      context.go("/home");
    }
  }
}

final socialAuthProvider = AsyncNotifierProvider<SocialAuthViewModel, void>(
  () => SocialAuthViewModel(),
);

 

728x90
반응형
Comments