0

我为共享偏好开设了一个课程。班级如下

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
  }

每当我尝试存储值时,都会收到错误消息“空值检查运算符用于空值”

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

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

2 回答 2

2

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

这里的问题是

  1. 该类有一个静态函数,负责初始化变量和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.

从代码片段来看,您似乎愿意创建一个单例类,这里是它的正确代码:

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

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

或者

如果您不想更改您的课程,那么只需将其添加到使用的所有nonstatic functions顶部_preferences

并添加此空检查

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

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

于 2021-09-09T20:07:31.400 回答
0

在调用之前将此行也添加到您的打印行下_preferences!.

if (_preferences == null) {
      _preferences = await SharedPreferences.getInstance();
    }
于 2021-09-09T19:55:57.140 回答