Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振-在类中创建共享首选项的实例_Flutter_Dart_Sharedpreferences - Fatal编程技术网

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

Flutter 颤振-在类中创建共享首选项的实例,flutter,dart,sharedpreferences,Flutter,Dart,Sharedpreferences,我有一门课叫ThemeUtil import'package:shared_preferences/shared_preferences.dart'; 类中微子{ 共享引用优先权; bool初始化=false; ThemeUtil(){ SharedReferences.getInstance()。然后((val){ prefs=val; 初始化=真; }); } bool getBrightness(){ 如果(已初始化){ 试一试{ 返回prefs.getBool(“暗”)??false;

我有一门课叫ThemeUtil

import'package:shared_preferences/shared_preferences.dart';
类中微子{
共享引用优先权;
bool初始化=false;
ThemeUtil(){
SharedReferences.getInstance()。然后((val){
prefs=val;
初始化=真;
});
}
bool getBrightness(){
如果(已初始化){
试一试{
返回prefs.getBool(“暗”)??false;
}捕获(错误){
返回false;
}
}否则{
返回null;
}
}
正确性(黑色){
试一试{
prefs.setBool(“暗”字,_暗);
}捕获(错误){
返回;
}
}
}

但我的问题是,当我在main.dart中使用它时,它总是返回false,这会导致白色主题,因为MEUTIL中的共享优先级尚未创建。有人知道如何解决这个问题吗?

您面临的问题称为访问类实例。每次访问utils类时,您都在创建该类的另一个类实例,在该类的构造函数中,您不断异步生成新的SharedReferences实例。这就是为什么你总是得到错误的值。我的建议是创建singleton Utils类,在该类中您总是访问已分配的Pref

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

  LocalStorage._privateConstructor() {
    SharedPreferences.getInstance().then((prefs) {
      _prefs = prefs;
    });
  }
}
现在,请确保在应用程序发布时初始化此单例:

void main() {
  LocalStorage();
  runApp(MyApp());
}
初始创建SharedReferences对象后,您可以通过调用以下命令在应用程序中的任何位置同步访问其内容:

LocalStorage().getBrightness();

你也可以发布main.dart文件,在那里调用MEUTIL吗?向我们展示你的main.dart代码也许可以帮助你。我按照你说的做了,然后使用了_dark=LocalStorage().prefs.getBool(“dark”);但是它说NoSuchMethodError:方法“getBool”是在null上调用的。接收者:nullNooo,你不应该访问本地存储本身。您需要调用metnod bool isDarkModeOn(),它将负责从本地存储获取bool。通过这种方式,您可以将用于存储的字符串标记保留在此单个文件中。因此,只需创建一个名为LocalStrorage.dart的文件,然后在启动我的应用程序之前调用它,然后在我的应用程序中像平常一样使用MEUTIL是否正确?因为LocalStorage().getBrightness();有点让我困惑。我只是在我的应用程序之前运行LocalStorage发现似乎我再也无法存储任何东西了。如果你像上面的答案那样调用存储,它将按预期工作。当需要存储/读取值时,在创建getter时将其称为LocalStorage().brigthness。或者调用LocalStorage().setBrightness(亮度);这是使用单例对象及其方法的正常方式。。。