Act99 기술블로그

[비전공자] Flutter + Firebase | 사용자 계정 정보를 Firestore에 저장시키고 싶을 때 방법 및 오류시 꿀팁 본문

개발팁저장소/flutter

[비전공자] Flutter + Firebase | 사용자 계정 정보를 Firestore에 저장시키고 싶을 때 방법 및 오류시 꿀팁

Act99 2020. 11. 19. 21:09

Flutter + Firebase를 이용하면서 사용자 정보를 파이어 스토어에 연동시키고 싶은 경우가 있다.

필자의 경우, 연습용으로 만든 다이어리 앱을 만들 때 필요했다.

('user' collection을 만들고 유저별id 를 document 이름으로 지정한 후, subcollection으로 데이터를 저장하고 싶을 때)

이 때 googleSignin 혹은 emailSignin 에 핸들을 설정해준 후, 핸들함수에 유저 데이터를 저장하는 함수를 넣어주었다.

 

-----------------------------------샘플코드-------------------

 

  @override

  void initState() {

    super.initState();

    // Detects when user signed in

    googleSignIn.onCurrentUserChanged.listen((account) {

      handleSignIn(account);

    }, onError: (err) {

      print('Error signing in: $err');

    });

    // Reauthenticate user when app is opened

    googleSignIn.isSignedIn().then((isSignedIn) async {

      if (isSignedIn)

        await {

          googleSignIn.signInSilently().then((account) => handleSignIn(account))

        };

    });

  }

 

  handleSignIn(GoogleSignInAccount account) async {

    if (account != null) {

      await createUserInFirestore(account);

      setState(() {

        isAuth = true;

      });

    } else {

      setState(() {

        isAuth = false;

      });

    }

  }

 

  Future createUserInFirestore(account) async {

    // 1) check if user exists in users collection in database (according to their id)

    account = googleSignIn.currentUser;

    DocumentSnapshot doc = await usersRef.doc(account.id).get();

 

    if (!doc.exists) {

      // 3) get username from create account, use it to make new user document in users collection

      usersRef.doc(account.id).set({

        "id": account.id,

        "photoUrl": account.photoUrl,

        "email": account.email,

        "displayName": account.displayName,

        "timestamp": timestamp

      });

      // make new user their own follower (to include their posts in their timeline)

    }

 

    diaryUser = DiaryUser.fromDocument(doc);

  }

 

 

------------------------------------

signin 버튼 생성 후, 버튼을 클릭했더니, 로그인은 되지만 id == null 오류가 뜰 때,

 

--------------------------------- 오류코드

      onPressed: () {

        signInWithGoogle().then((result) {

          if (result != null) {

            Navigator.of(context).push(

              MaterialPageRoute(

                builder: (context) {

                  return HomeScreen(user : user);         <----- HomeScreen 호출 시 user 모델을 제대로 call하지 못했음

                },

              ),

            );

            createUserInFirestore(googleSignInAccount);

          }

        });

      },

 

-----------------------------

 

-----------------------------변경코드

 

      onPressed: () {

        signInWithGoogle().then((result) {

          if (result != null) {

            Navigator.of(context).push(

              MaterialPageRoute(

                builder: (context) {

                  return MyApp();

                },

              ),

            );

            createUserInFirestore(googleSignInAccount);

          }

        });

      },

 

_________________________ MyApp을 호출하니 해결

 

 

 

 

(비전공자라 전문용어를 모릅니다.. 참고해서 봐주세요)