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
相关产品推荐
相关产品推荐

