在Flutter中接收Future数据(SharedPreferences)时出现问题

时间:2019-08-07 15:06:38

标签: flutter sharedpreferences future

我正在尝试将Switch的值保存在SharedPreferences中。这是我的代码:

  bool isDarkTheme;
  static const String KEY_DARK_THEME = "dark";

  void setTheme(bool value) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    isDarkTheme = value;
    pref.setBool(KEY_DARK_THEME, isDarkTheme);
    print("DARKSet? $isDarkTheme");
  }

  void getTheme() async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    isDarkTheme = sharedPreferences.getBool(KEY_DARK_THEME);
    print("dark? $isDarkTheme");
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("MYINIT");
    getTheme();
  }

在Build方法中...

  @override
  Widget build(BuildContext context) {
    print("BUILD $isDarkTheme");
    ...
    ...
    ListTile(
      title: Text("Dark Theme"),
      trailing: Switch(
      value: isDarkTheme ?? false,
      onChanged: (val) {
        setState(() {
          setTheme(val);
        });
      },
      ),
    ),
    ...
    ...
 }

尽管我在调试控制台中获得了正确的值,但是Switch窗口小部件并未相应更改。我发现在从build()获取值之前运行了SharedPrefernces方法,结果是Switch小部件没有从SharedPreferences获取值。如何解决接收Future值的问题?

2 个答案:

答案 0 :(得分:2)

您有两个选择

1)。我认为当您从SharedPreference获得价值时,您只需调用setState()方法

<div class="grid-container">
  <div class="item1">
    <div class="object">
    </div>
  </div>
  <div class="item2">
    <h2>Title</h2>
  </div>
  <div class="item3">
    <p style="margin: 0px;">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    </p>
    <p>
      Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </p>
  </div>
</div>

2)您可以将Provider用于StateManagement,这样,当isDarkTheme值更改时,将调用notifyListener,并且您的构建方法将重新构建,并且您会看到更改

答案 1 :(得分:0)

您的主要问题是,无论何时要存储或检索值,您都在检索SharedPreferences实例,此外您还使用了它的两个实例(pref和{{ 1}}):

使用单独的函数检索单个sharedPreferences实例:

SharedPreferences

然后修改 SharedPreferences pref ; Future loadPreferences() async { pref = await SharedPreferences.getInstance(); } getTheme

setTheme

此外,在初始化期间调用 void setTheme(bool value) async { isDarkTheme = value; pref.setBool(KEY_DARK_THEME, isDarkTheme); print("DARKSet? $isDarkTheme"); } void getTheme() async { isDarkTheme = pref.getBool(KEY_DARK_THEME); print("dark? $isDarkTheme"); } ,因此在调用loadPreferences时将加载pref

build