UserProfilePage, MainPage 등에서 여전히 이전 Google 계정의 사용자 정보가 보임.userProfileProvider(userId)는 Riverpod의 StreamProvider.family() 기반으로 동작함.userIdProvider의 값이 변경되더라도 StreamProvider는 캐시된 이전 userId에 대한 stream을 유지함.userIdProvider를 갱신해도, 프로필 데이터는 여전히 이전 계정의 userId로 연결된 stream을 구독하고 있었음.signInWithGoogle, signInWithKakao) 내부에서 다음 두 가지 수행:ref.read(userIdProvider.notifier).state = userModel.userId; // 현재 로그인한 계정의 userId로 갱신
ref.invalidate(userProfileProvider(userModel.userId)); // 이전 계정에 연결된 프로필 stream을 무효화
loginProvider 값이 남아 있어서 SplashPage에서 자동으로 로그인 로직을 타게 됨.로그아웃 시에 다음을 수행:
UserApi.instance.logout() 호출SignInWithApple.getCredentialState()를 이용한 로그인 상태 확인 + 제거userId, provider 등을 제거await prefs.remove('userId');
await prefs.remove('provider');
"사용자 정보 불러오는 중입니다"만 뜨고 진입 불가.userIdProvider가 비어 있는 상태에서 SettingsPage로 넘어감.UserProfilePage(userId!)를 호출하니, userId 자체가 null이라 StreamProvider가 동작하지 않음.FutureProvider로 currentUserId 초기화하고, userIdProvider를 업데이트:final currentUserInitProvider = FutureProvider<void>((ref) async {
final id = await getCurrentUserId(); // SharedPreferences에서 불러오기
ref.read(userIdProvider.notifier).state = id; // null이 아닌 경우만 state 설정
});
ref.watch(userIdProvider)를 먼저 확인하고 null이 아닐 때만 프로필 진입 가능하도록 설정.Navigator.pop()만 호출하고 있어서, 이전 userProfileProvider(userId) stream이 그대로 유지되고 있었음.Navigator.pop(context, true)로 수정 여부를 boolean으로 전달하고,UserProfilePage에서는 다음처럼 invalidate 수행:final changed = await Navigator.push<bool>(
context,
MaterialPageRoute(builder: (_) => UserProfileEditPage(user: user)),
);
if (changed == true) {
ref.invalidate(userProfileProvider(userId)); // StreamProvider 강제 리로딩
}
MainPage나 LoginPage로 가야 하는데,userIdProvider 상태 초기화가 되지 않아 항상 LoginPage로 감.getCurrentUserId() 호출 타이밍이 늦거나 결과가 반영되지 않음.userIdProvider가 null로 유지되기 때문에 이후 페이지에서 항상 로그인 상태가 아님으로 인식.ref.watch(currentUserInitProvider)의 상태를 먼저 확인한 뒤, 완료되었을 때만 다음으로 진입:final currentUserInit = ref.watch(currentUserInitProvider);
return currentUserInit.when(
loading: () => SplashWidget(),
error: (_, __) => ErrorPage(),
data: (_) {
final userId = ref.watch(userIdProvider);
return userId != null ? MainPage() : LoginPage();
},
);