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()
的方法中。
这里的问题是
- class有一个静态函数,负责变量的初始化和
can be accessed without an object of class StorageUtil
。
- 当
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这是正确的代码:
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
变量为空。
我已经为共享首选项创建了 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()
的方法中。
这里的问题是
- class有一个静态函数,负责变量的初始化和
can be accessed without an object of class StorageUtil
。 - 当
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这是正确的代码:
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
变量为空。