Flutter中Google登录:实现登录成功跳转首页并保存登录状态问题
Flutter Google登录自动跳转与状态持久化修复方案
核心问题排查与修复步骤
1. 确保全局Provider配置正确
必须在App顶层初始化ChangeNotifierProvider,否则状态变化无法被AuthenticationWrapper监听:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化SharedPreferences final prefs = await SharedPreferences.getInstance(); runApp( ChangeNotifierProvider( create: (context) => AuthProvider(prefs), child: const MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: AuthenticationWrapper(), // 其他配置(主题、路由等) ); } }
2. 优化AuthProvider登录逻辑
原代码的用户判断逻辑不够严谨,补充await确保SharedPreferences保存完成:
class AuthProvider extends ChangeNotifier { bool _isAuthenticated = false; final SharedPreferences _prefs; final GoogleSignIn _googleSignIn = GoogleSignIn(scopes: ['email']); AuthProvider(this._prefs) { _isAuthenticated = _prefs.getBool('isAuthenticated') ?? false; } bool get isAuthenticated => _isAuthenticated; Future<void> login() async { try { final GoogleSignInAccount? googleUser = await _googleSignIn.signIn(); if (googleUser != null) { // 可选:获取用户认证信息 final GoogleSignInAuthentication googleAuth = await googleUser.authentication; _isAuthenticated = true; await _prefs.setBool('isAuthenticated', true); // 确保状态持久化完成 notifyListeners(); } } catch (error) { print('Google登录错误: $error'); } } Future<void> logout() async { await _googleSignIn.signOut(); _isAuthenticated = false; await _prefs.setBool('isAuthenticated', false); notifyListeners(); } }
3. 确保AuthenticationWrapper正确监听状态
改用Consumer替代直接Provider.of,避免监听失效:
class AuthenticationWrapper extends StatelessWidget { const AuthenticationWrapper({super.key}); @override Widget build(BuildContext context) { return Consumer<AuthProvider>( builder: (context, authProvider, child) { return authProvider.isAuthenticated ? const Homepage() : const WelcomePage(); }, ); } }
4. 检查平台配置(关键)
若以上代码仍不生效,需确认Google登录的平台配置:
- Android:将Firebase控制台下载的
google-services.json放入android/app目录,配置SHA-1指纹 - iOS:将
GoogleService-Info.plist添加到iOS项目,在Info.plist中配置URL Scheme - 确保依赖版本正确:
dependencies: flutter: sdk: flutter provider: ^6.0.0 shared_preferences: ^2.2.0 google_sign_in: ^5.4.0
5. 欢迎页登录逻辑加固
添加手动兜底跳转和错误提示,方便排查问题:
onTap: () async { await authProvider.login(); // 自动切换失效时的兜底逻辑 if (authProvider.isAuthenticated) { Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const Homepage())); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('登录失败,请重试')), ); } },
内容的提问来源于stack exchange,提问作者tallcoder
相关产品推荐
相关产品推荐

