Flutter-在类中创建共享首选项的实例

时间:2020-07-30 16:34:17

标签: flutter dart sharedpreferences

我有一个名为ThemeUtil的类

import 'package:shared_preferences/shared_preferences.dart';

class ThemeUtil {
  SharedPreferences prefs;
  bool initialized = false;
  ThemeUtil() {
    SharedPreferences.getInstance().then((val) {
      prefs = val;
      initialized = true;
    });
  }

  bool getBrightness() {
    if (initialized) {
      try {
        return prefs.getBool("dark") ?? false;
      } catch (error) {
        return false;
      }
    } else {
      return null;
    }
  }

  setBrightness(bool _dark) {
    try {
      prefs.setBool("dark", _dark);
    } catch (error) {
      return;
    }
  }
}

但是我的问题是当我在main.dart中使用它时,它始终返回false,这导致白色主题,因为尚未在ThemeUtil中创建共享首选项。有谁知道该如何解决?

1 个答案:

答案 0 :(得分:1)

您面临的问题称为访问类实例。每次访问utils类时,都在创建该类的另一个类实例,在该类的构造函数中,您不断生成异步的新SharedPreferences实例。这就是为什么您总是得到错误的值的原因。我建议创建一个单例Utils类,在该类中您始终可以访问已分配的首选项。

export default {
  watch: {
    currentEvent(newValue) {
      this.event = { ...newValue }
    }
  }
}

现在确保您在应用启动时初始化此单例:

class LocalStorage {
  static final LocalStorage _instance = LocalStorage._privateConstructor();
  factory LocalStorage() {
    return _instance;
  }
  SharedPreferences _prefs;

  LocalStorage._privateConstructor() {
    SharedPreferences.getInstance().then((prefs) {
      _prefs = prefs;
    });
  }
}

在最初创建SharedPreferences对象之后,您可以通过调用以下内容在应用程序中的任何位置同步访问其内容:

void main() {
  LocalStorage();
  runApp(MyApp());
}