如何在Flutter中创建Singleton类

时间:2019-10-15 07:23:36

标签: android ios flutter flutter-layout

在整个项目中总是需要SharedPreferences对象,但是我们得到的数据像SharedPreferences _prefs = await SharedPreferences.getInstance();

因此,我们想始终使用await,这就是为什么我认为为SharedPreferences创建Singleton类并为SharedPreferences中的GET&SET数据创建静态方法的原因。

  

使用这种类型的功能,我们可以编写可重用的代码,并   提高生产力

帮我创建Singleton类

5 个答案:

答案 0 :(得分:7)

对于句柄单例类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);
      }
    }


2。从您的主类的initState()初始化该类

PreferenceUtils.init();

3。访问您的方法,例如

PreferenceUtils.setString(AppConstants.USER_NAME, "");
String username = PreferenceUtils.getString(AppConstants.USER_NAME);

答案 1 :(得分:1)

这是我的首选解决方案:

class Storage {
  static const String _some_field = 'some_field';

  static Future<SharedPreferences> get prefs => SharedPreferences.getInstance();

  static Future<String> getSomeStringData() async =>
      (await prefs).getString(_some_field) ?? '';

  static Future setSomeStringData(String phone) async =>
      (await prefs).setString(_some_field, phone);

  static Future clear() async {
    await getSomeStringData(null);
  }
}

答案 2 :(得分:0)

我将此代码用于单例设置

static Future<SharedPreferences>  getInstance() async
  {
    SharedPreferences preferences ;
    preferences = await SharedPreferences.getInstance();
    return preferences;
  }

然后使用它来还原您的数据,这里我还原userId。

 /// ----------------------------------------------------------
  /// Method that saves/restores the userId
  /// ----------------------------------------------------------
   static Future<String>  getUserId() async {
    return getInstance().then((pref) {
      return pref.get(Constants.userId);
    });
  }

希望它会有所帮助:)

答案 3 :(得分:0)

class YourClass {
    static final YourClass _singleton = 
           new YourClass._internal();

    factory YourClass(){
            return _singleton;
    }

    YourClass._internal(){
            //initialization your logic here
    }

}

//主代码环境

YourClass mClass = new YourClass(); //把单身人士找回来

答案 4 :(得分:0)

您可以使用以下非常简单的类来获取没有 SharedPreferencesawait 实例:

import 'package:shared_preferences/shared_preferences.dart';

class SharedPrefs {
  static late final SharedPreferences instance;

  static Future<SharedPreferences> init() async =>
      instance = await SharedPreferences.getInstance();
}
  1. 初始化 instance 可能在 main() 函数中,如下所示:
void main() async {
  // Required for async calls in `main`
  WidgetsFlutterBinding.ensureInitialized();

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

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

额外:
如果愿意,可以通过重新定义这些方法(getBoolsetString 等)或定义新方法(getUsersetUsersetAccessToken 等)来进一步抽象.) 在 SharedPrefs 类本身中,并使 instance 成为像 _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);

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

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

final accessToken = SharedPrefs.getAccessToken();