You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:07:26