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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:06:04