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

Flutter中SharedPreferences无法保存Google登录Token问题排查

问题根源分析与解决方案

嘿,我一眼就揪出问题所在了!你遇到的NoSuchMethodError本质是**SharedPreferences实例根本没完成初始化**,导致调用getString时_prefs处于null状态。

具体问题点

看你的SharedPreferenceService代码:你写了getSharedPreferencesInstance()方法来初始化_prefs,但在整个登录流程里,你从来没有调用过这个方法!不管是loginWithGoogle里调用sharedPreferenceService.setToken(),还是后续页面取token时,_prefs始终是null,自然存不了也取不出token。

两种修复方案

方案1:懒加载初始化(推荐)

修改SharedPreferenceService的方法,让每次调用存/取token时自动检查并初始化_prefs,不用手动调用初始化方法:

class SharedPreferenceService { 
  SharedPreferences _prefs; 

  Future setToken(String token) async { 
    // 如果_prefs未初始化,先获取实例
    _prefs ??= await SharedPreferences.getInstance().catchError((e) { 
      print("shared prefrences error : $e"); 
      throw e; // 抛出错误方便上层捕获处理
    });
    await _prefs.setString('token', token); 
  } 

  Future clearToken() async { 
    _prefs ??= await SharedPreferences.getInstance();
    await _prefs.clear(); 
  } 

  Future<String> get token async { 
    _prefs ??= await SharedPreferences.getInstance();
    return _prefs.getString('token'); 
  } 
} 

方案2:全局提前初始化

在App启动时就完成SharedPreferences的初始化,确保后续所有操作都能拿到可用实例:

void main() async {
  // 必须加这句,确保Flutter绑定初始化完成
  WidgetsFlutterBinding.ensureInitialized();
  // 提前初始化SharedPreferences
  await sharedPreferenceService.getSharedPreferencesInstance();
  runApp(MyApp());
}

同时修正getSharedPreferencesInstance的错误返回逻辑:

Future<bool> getSharedPreferencesInstance() async { 
  try {
    _prefs = await SharedPreferences.getInstance();
    return true;
  } catch (e) { 
    print("shared prefrences error : $e"); 
    return false; 
  }
} 

验证方式

修改后重新运行,登录时你会发现setToken能正常执行,进入/index页面后取token也不会再报null错误了。

内容的提问来源于stack exchange,提问作者João Mello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:32:40