【问题标题】:SharedPreferences working on android emulator but not on real deviceSharedPreferences 在 android 模拟器上工作,但不在真实设备上
【发布时间】:2021-01-16 21:17:47
【问题描述】:

正如标题中所说,我在 SharedPreferences 中存储了一些布尔值和字符串。它就像模拟器的魅力一样,当我在我的真实设备上安装我的应用程序时,bool 和 Strings 并没有被删除。我在模拟器上使用 api 29,在我的设备上使用 30,可以吗? (我刚刚检查过,在我的真实手机上调试时它工作了!!但是当我使用构建任务中的 apk 文件安装应用程序时仍然没有......) 有任何想法吗?我认为我的代码在这里不会很相关,但如果需要我可以添加它! 谢谢你的帮助! 此外,该应用程序在调试时(几乎 5 次)要重得多,而且流畅度要低得多,有什么想法吗?可能是因为 SharedPrefs?

代码编辑:

Switch(
    value: appsLoad.instagram ?? false,
    onChanged: (value) {
       setState(() {
       appsLoad.instagram = value;
       sharedPref.save("user", appsLoad);
       });
     },
),

这是我保存值的方式,sharePref.save 指的是

save(String key, value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, json.encode(value) ?? false);
}

我使用了很多this 网站作为sharedPreferences。

【问题讨论】:

  • 谢谢:但我没有使用 initState,只是使用常规的 setState
  • 一些代码肯定会有所帮助。关于性能,预计在调试模式下应用会慢很多。
  • @danypata 我编辑了,够了吗?
  • 去掉final关键字怎么样?

标签: android flutter sharedpreferences


【解决方案1】:

如果您阅读了 setState 评论部分

一般建议只使用setState 方法 用于包装对状态的实际更改,而不是任何计算 这可能与更改有关。例如,这里有一个 [build] 函数使用的值递增,然后 更改被写入磁盘,但只有增量包含在 setState:

Future<void> _incrementCounter() async {
  setState(() {
    _counter++;
  });
  Directory directory = await getApplicationDocumentsDirectory();
  final String dirName = directory.path;
  await File('$dir/counter.txt').writeAsString('$_counter');
}

按照示例,您不应该在 setState 中调用未来

Switch(
    value: appsLoad.instagram ?? false,
    onChanged: (value) async {
       setState(() {
         appsLoad.instagram = value;
       });
       await sharedPref.save("user", appsLoad);
     },
),

请注意,模拟器的运行速度不如设备快(配置文件/调试模式比真实的慢),这就是为什么在模拟器中您无法察觉此类错误

【讨论】:

  • 没有改变,值没有保存:/但感谢帮助!
  • 您在哪里阅读保存的密钥首选项?
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2017-11-14
  • 2021-10-07
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多