Flutter SharedPreferences Null 检查运算符用于空值

Flutter SharedPreferences Null check operator used on a null value

我已经为共享首选项创建了 class。 class如下

class StorageUtil {
  static StorageUtil? _storageInstance;
  static SharedPreferences? _preferences;

  static Future<StorageUtil?> getInstance() async {
    if (_storageInstance == null) {
      _storageInstance = StorageUtil();
    }
    if (_preferences == null) {
      _preferences = await SharedPreferences.getInstance();
    }
    return _storageInstance;
  }

  addStringtoSF(String key, String value) async {
    print(' inside sharedPreferences file $key $value'); // Receives data here
    await _preferences!.setString(key,
        value); //Unhandled Exception: Null check operator used on a null value
  }

每当我尝试存储值时,我都会收到错误消息 'Null check operator used on a null value'

这就是我将值传递给存储函数的方式。我正在接收函数内的数据。但不能将值存储在其中。这是什么原因造成的?

String? userResponse = json.encode(authResponse);
      print('This is userResponse type');
      _storageUtil.addStringtoSF('userData', userResponse);

在调用 _preferences!.

之前,也将此行添加到您的打印行下方
if (_preferences == null) {
      _preferences = await SharedPreferences.getInstance();
    }

尝试添加这个 WidgetsFlutterBinding.ensureInitialized(); 如果不存在,则在 main.dart 文件中非常 first line of you main() 的方法中。

这里的问题是

  1. class有一个静态函数,负责变量的初始化和can be accessed without an object of class StorageUtil
  2. nonstatic function 调用您时 need to create an object of StorageUtil class 然后访问 static variables are not initialized which are initialized in the static function hence null.
  3. 的那个函数

从代码片段来看,您似乎愿意制作一个单例class这是正确的代码:

class StorageUtil {
  static StorageUtil storageInstance = StorageUtil._instance();
  static SharedPreferences? _preferences;

  StorageUtil._instance(){
    getPreferences();
  }
  void getPreferences()async{
    _preferences = await SharedPreferences.getInstance();
  }


  addStringtoSF(String key, String value) async {
    print(' inside sharedPreferences file $key $value'); // Receives data here
    await _preferences!.setString(key,
        value);
  }
}

无论您希望在何处使用首选项,只需致电:

final StorageUtil storage = StorageUtil.storageInstance;
storage.AnyNonStaticFunctionName()// call for methods in the StorageUtil Class

这是整个应用程序中唯一存在的对象。

如果您不想更改您的 class,那么只需将其添加到顶部使用 _preferences

的所有 nonstatic functions

并添加此空检查

if (_preferences == null) {
    _preferences = await SharedPreferences.getInstance();
}

因为您可能有多个 StorageUtil 实例,每次都使 _preferences 变量为空。