Flutter调用SharedPreferences的getString方法报空错误如何解决
错误原因
你触发的The method 'getString' was called on null报错,本质是sharedPreferences变量在你调用getString时还未完成异步初始化,仍为null值。
Dart中State类的成员变量初始化执行时机远早于initState生命周期,即使你在全局位置执行了sharedPreferences = await SharedPreferences.getInstance(),只要这个异步操作还没完成,State类初始化时读取的sharedPreferences就还是null。
可落地解决方案
- 方案1:调整变量赋值时机,将取值操作移到
initState内执行
先将属性声明为late类型,再在initState中完成赋值:class _HomePageState extends State<HomePage> { HomepageBloc _bloc; ScrollController _scrollController = ScrollController(); TextEditingController _userNameSearchController = TextEditingController(); // 只声明不赋值 late String userName; late String userToken; @override void initState() { super.initState(); // initState阶段全局sharedPreferences已完成初始化,再取值 userName = sharedPreferences.getString(SharedPreferencesKey.name) ?? ''; userToken = sharedPreferences.getString(SharedPreferencesKey.token) ?? ''; _bloc = HomepageBloc(userToken); } @override void dispose() { super.dispose(); _bloc.dispose(); } } - 方案2:补全main函数的初始化逻辑,确保启动前所有全局实例已初始化完成
确认你的main函数为async写法,初始化完成后再执行runApp:void main() async { // 必须先调用这行,确保异步初始化前Flutter框架已绑定完成 WidgetsFlutterBinding.ensureInitialized(); // 全局实例初始化完成后再启动App sharedPreferences = await SharedPreferences.getInstance(); firebaseFirestore = FirebaseFirestore.instance; runApp(const MyApp()); } - 方案3:封装SharedPreferences工具类规避时序问题
封装静态工具类,统一处理实例获取和取值逻辑,避免全局变量的空风险:
使用时直接调用class SpUtil { static SharedPreferences? _preferences; static Future<void> init() async { _preferences ??= await SharedPreferences.getInstance(); } static String getString(String key, {String defaultValue = ''}) { return _preferences?.getString(key) ?? defaultValue; } // 其他存取方法同理 }SpUtil.getString(SharedPreferencesKey.name)即可。
内容的提问来源于stack exchange,提问作者Dijon
相关产品推荐
相关产品推荐

