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

升级Flutter到2.15后遇Non-nullable字段未初始化错误,如何修复?

修复Flutter 2.15下SharedPreferences工具类的空安全错误

错误原因

Flutter 2.12及以上版本默认启用空安全特性,你的代码中_instance和sharedPreferences被声明为非空类型但未初始化,违反了空安全规则;同时你使用的shared_preferences: ^0.5.7+3是不支持空安全的旧版本,这两个因素共同导致了报错。

修复步骤

1. 升级shared_preferences依赖

在pubspec.yaml中将依赖替换为支持空安全的稳定版本:

dependencies:
  shared_preferences: ^2.2.2 # 或更高兼容空安全的版本

执行flutter pub get完成依赖更新。

2. 修改工具类代码

以下两种方案任选其一即可:

方案一:使用可空类型+空合并运算符
import 'package:shared_preferences/shared_preferences.dart';

class SharedPreferencesUtil {
  SharedPreferencesUtil._();

  static SharedPreferencesUtil? _instance;
  SharedPreferences? sharedPreferences;

  static SharedPreferencesUtil getInstance() {
    // 空合并运算符:仅当_instance为空时初始化
    _instance ??= SharedPreferencesUtil._();
    // 断言非空:此时_instance已确保完成初始化
    return _instance!;
  }

  // 异步初始化SharedPreferences实例
  Future<void> init() async {
    sharedPreferences ??= await SharedPreferences.getInstance();
  }
}
方案二:使用late延迟初始化
import 'package:shared_preferences/shared_preferences.dart';

class SharedPreferencesUtil {
  SharedPreferencesUtil._();

  static late SharedPreferencesUtil _instance;
  late SharedPreferences sharedPreferences;

  static SharedPreferencesUtil getInstance() {
    try {
      return _instance;
    } catch (_) {
      _instance = SharedPreferencesUtil._();
      return _instance;
    }
  }

  // 异步初始化SharedPreferences实例
  Future<void> init() async {
    sharedPreferences = await SharedPreferences.getInstance();
  }
}

3. 使用前完成初始化

在main函数中先初始化工具类,确保sharedPreferences实例加载完成:

import 'package:flutter/material.dart';

void main() async {
  // 必须调用此方法确保Flutter绑定初始化完成
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化SharedPreferences工具类
  await SharedPreferencesUtil.getInstance().init();
  runApp(const MyApp());
}

内容的提问来源于stack exchange,提问作者James2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:52:35