如何在颤振中创建 SharedPreferences 的 Singleton 类

San*_*inh 5 android ios flutter flutter-layout

总是需要的对象,SharedPreferences但我们使用awaitLike访问 。

await SharedPreferences.getInstance();

这就是为什么我认为SharedPreferences 在 SharedPreferences 中创建 Singleton 类并为 GET & SET 数据创建静态方法。

但我不知道该怎么做,我尝试但无法成功
请帮助我

rma*_*iya 19

您可以使用以下非常简单的类来获取SharedPreferences实例,而无需await

import 'package:shared_preferences/shared_preferences.dart';

class SharedPrefs {
  static late final SharedPreferences instance;

  static Future<SharedPreferences> init() async =>
      instance = await SharedPreferences.getInstance();
}
Run Code Online (Sandbox Code Playgroud)
  1. 初始化instancemay inmain()函数,如下:
void main() async {
  // Required for async calls in `main`
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize SharedPrefs instance.
  await SharedPrefs.init();

  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
  1. 上的访问方法SharedPrefs.instance,例如:
final someString = SharedPrefs.instance.getString('someString') ?? 'defaultValue';
await SharedPrefs.instance.setBool('someBool', true);
Run Code Online (Sandbox Code Playgroud)

额外:
如果愿意,可以通过重新定义这些方法(getBool、等)或在类本身中setString定义新方法(getUsersetUsersetAccessToken)并创建一个像.SharedPrefsinstance_instance

其中一个例子如下:

// Getter
static bool? getBool(String key) => _instance.getBool(key);

// Setter
static Future<bool> setBool(String key, bool value) => _instance.setBool(key, value);

// More abstraction
static const _kAccessToken = 'accessToken';

static Future<bool> setAccessToken(String value) => _instance.setString(_kAccessToken, value);

static String? getAccessToken() => _instance.getString(_kAccessToken);

Run Code Online (Sandbox Code Playgroud)

之后,我们可以简单地调用这些方法,如下所示:

final someBool = SharedPrefs.getBool('someBool') ?? false;
await SharedPrefs.setBool('someBool', someBool);

final accessToken = SharedPrefs.getAccessToken();
Run Code Online (Sandbox Code Playgroud)


San*_*inh 10

对于处理单例​​类,请SharedPreference遵循 3 个步骤 -

1. 把这个类放到你的项目中

    import 'dart:async' show Future;
    import 'package:shared_preferences/shared_preferences.dart';

    class PreferenceUtils {
      static Future<SharedPreferences> get _instance async => _prefsInstance ??= await SharedPreferences.getInstance();
      static SharedPreferences _prefsInstance;

      // call this method from iniState() function of mainApp().
      static Future<SharedPreferences> init() async {
        _prefsInstance = await _instance;
        return _prefsInstance;
      }

      static String getString(String key, [String defValue]) {
        return _prefsInstance.getString(key) ?? defValue ?? "";
      }

      static Future<bool> setString(String key, String value) async {
        var prefs = await _instance;
        return prefs?.setString(key, value) ?? Future.value(false);
      }
    }
Run Code Online (Sandbox Code Playgroud)


2. 从你的主类的 initState() 初始化这个类

PreferenceUtils.init();
Run Code Online (Sandbox Code Playgroud)

3.访问您的方法,例如

PreferenceUtils.setString(AppConstants.USER_NAME, "");
String username = PreferenceUtils.getString(AppConstants.USER_NAME);
Run Code Online (Sandbox Code Playgroud)

  • 未处理的异常:NoSuchMethodError:在 null 上调用了方法“getString”。E / flutter(11362):接收器:null E / flutter(11362):尝试调用:getString(“token”)_prefsInstance为null (4认同)