Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- unity
- Clean Architecture
- nodejs
- printf
- JS
- UI/UX
- LLM
- JQ
- ListView
- java
- println
- lifecycle
- 엡
- 자바 포맷 출력
- react
- riverpod
- 배포
- abap
- 앱심사
- 자바 출력 방식
- npm
- scss
- develop
- DART
- 자바스크립트
- java 콘솔 출력 차이
- Flutter
- firebase
- java 출력
- 단축키
Archives
- Today
- Total
guricode
[flutter-sns-project - 9] 트러블슈팅 - 구글로그인 중간에 화면 나갈시 그대로 홈 화면으로 진입되는 문제 본문
앱/Flutter&Dart
[flutter-sns-project - 9] 트러블슈팅 - 구글로그인 중간에 화면 나갈시 그대로 홈 화면으로 진입되는 문제
agentrakugaki 2025. 9. 4. 22:59증상
- 구글 로그인 플로우에서 뒤로가기(취소) 시에도 화면에서 “로그인 성공” 처리가 실행되어 홈으로 네비게이션.
- ViewModel 로그에는 실패가 찍히지만, Screen에서는 성공 분기 실행.
환경
- Flutter + firebase_auth + google_sign_in v7
- 로그인 화면 코드에서 FirebaseAuth.instance.currentUser로 성공 여부 판정
원인
- 판정 기준 오류. currentUser는 세션 복원이나 비동기 타이밍 영향으로 즉시 일관되지 않을 수 있음.
- 로그인 취소 시에도 과거 세션 복원 등으로 currentUser가 값이 있어 보이는 타이밍이 존재.
- 예외적으로 “현재 화면의 로그인 시도 성공” 여부와 **“SDK가 보유한 세션 상태”**가 불일치.

로그인 코드는 이렇게 돼있다.
Future<void> _google() async {
setState(() {
_loading = true;
});
try {
await vm.googleLogin();
if (!mounted) return;
if (FirebaseAuth.instance.currentUser != null) {
context.pushNamed('home');
print('Google 로그인 성공');
} else {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('Google 로그인에 실패했습니다.')));
}
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('Google 로그인 오류: $e')));
} finally {
if (mounted) {
setState(() {
_loading = false;
});
}
}
}
로그를 찍어보면 외부로직에서 로그인 실패가 찍혔음에도 screen에서 로그인성공 로그를 찍고있었다

일단 의심가는 부분은 FirebaseAuth.instance.currentUser 였다.
공식문서에는 로그인 성공했을때만 currentUser가 들어오고 그전에는 무조건 null상태라고한다.
하지만 이전에 로그인 성공했을때 이전세션이 남아있을수도 있겟다고 생각했다.
원인
- 판정 기준 오류. currentUser는 세션 복원이나 비동기 타이밍 영향으로 즉시 일관되지 않을 수 있음.
- 로그인 취소 시에도 과거 세션 복원 등으로 currentUser가 값이 있어 보이는 타이밍이 존재.
- 예외적으로 “현재 화면의 로그인 시도 성공” 여부와 **“SDK가 보유한 세션 상태”**가 불일치.
해결
핵심 전략
- 현재 로그인 시도의 결과를 기준으로 분기.
- ViewModel의 googleLogin()이 성공/실패를 bool로 반환하도록 변경하고, UI는 그 값으로 판단.
뷰모델에서 구글로그인 메서드를 실행했을때 성공여부에 따라 bool을 반환하기때문에 코드를 수정했다.
final ok = await vm.googleLogin();
if (!mounted) return;
if (ok) {
context.pushNamed('home');
print('Google 로그인 성공');
이렇게 수정하니 구글 로그인 도중 종료해도 정상적으로 로그인화면이 다시 나왔다
결론
- 문제는 성공 판정 기준을 currentUser에 의존한 설계 때문.
- ViewModel 반환값 기반 분기로 수정해 정상 동작.
- 전역 상태 변화는 authStateChanges()로 보조 관찰.
추가로 알아본 기능
FirebaseAuth.instance.authStateChanges()
로그인했을때 인증상태가 바뀔때마다 이벤트를 흘려준다.
로그인 성공했을때 -> User반환
로그아웃했을때 -> null반환
앱 시작시 세션복원됐다면?? -> user반환한다.
비슷한 스트림과 차이
- authStateChanges()
인증 상태 변동(로그인/로그아웃)만 - idTokenChanges()
위 + ID 토큰 갱신 시에도 방출 - userChanges()
위 + 프로필 변경(displayName, photoURL 등)에도 방출
'앱 > Flutter&Dart' 카테고리의 다른 글
| [flutter-sns-project - 11]flutter 앱 배포 준비,CheckboxListTile,WebView (0) | 2025.09.08 |
|---|---|
| [flutter-sns-project - 10]안드로이드 릴리즈 단계 요약 (0) | 2025.09.05 |
| [flutter-sns-project - 8] Flutter 앱에 Sentry 연동하기: 설치부터 초기화까지 (0) | 2025.09.04 |
| [flutter-sns-project - 7] 트러블슈팅 - 이메일/패스워드 인자 순서 뒤바뀐 로그인/회원가입 실패 (0) | 2025.09.03 |
| [flutter-sns-project - 6] 트러블슈팅 - 로그인 수행시 Null오류 (0) | 2025.09.02 |