【问题标题】:How to solve SharedPreferences not working in flutter如何解决 SharedPreferences 无法正常工作的问题
【发布时间】:2020-02-28 16:54:20
【问题描述】:

我正在使用 SharedPreferences 来保存来自 API 的响应。我想在我的应用程序离线或切换到另一个选项卡时使用,数据不会再次重新加载。但它不起作用。它仅在我在线时有效。但是如果我在线我切换页面数据将再次重新加载。如果我离线数据将不会出来。

【问题讨论】:

  • 你能发布你的示例 json 数据吗?
  • 感谢您的回复,{"current_page": 1, "data": [ { "id": 1, "title": "Germa","image": "image url"} , { "id": 2, "title": "Jepun", "image": "image url"} ], "first_page_url": "https://API_URL?page=1", "from": 1, "last_page ": 30, "last_page_url": "https://API_URLpage=30", "next_page_url": "https://API_URL?page=2" }

标签: flutter


【解决方案1】:

从代码中,我看到当你在线时你会得到数据并被解析,但是当你离线时你在 try-catch 块中做所有的事情,所以当你离线时有套接字发生在您尚未处理的 catch 块中的异常。

SharedPreferences prefs = await SharedPreferences.getInstance();
        String myDataValue = prefs.getString('myData');
        final project = pagesDataFromJson(myDataValue);

如果你在 catch 中调用它,你也许可以在离线时获取数据。

但这只是一个修复检查这个链接,它会告诉你互联网是否存在: https://pub.dev/packages/data_connection_checker

或者你可以参考这个视频:

https://www.youtube.com/watch?v=u_Xyqo6lhFE

所以它不会从 prefrences 加载数据,因为当你得到异常时,它会直接进入 catch 而不离开下面的代码。

【讨论】:

  • 感谢您的回复,如果我离线,我会收到有关 CacheManager 的错误:无法从 URL 下载文件,并且将仅重复加载第 1 页数据
  • 是的,这是因为您处于离线状态并且您正在尝试发出网络请求,如果没有显示虚拟图像,我建议您使用上述软件包检查互联网连接。
  • 但为什么它只显示第 1 页数据?当我离线时,第 1 页中的标题仍然显示。但它总是重复并只重复第 1 页
  • 没找到你?你能简要介绍一下
  • 刚刚明白你在说什么,你使用分页的原因,它只加载了一页数据,现在没有连接,所以下一页数据不会来。
【解决方案2】:

最后把数据转进去:

Future<PagesData> sendPagesDataRequest(int page) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();

  try {
    // your codes ...
  } finally {
    String myDataValue = prefs.getString('myData');
    return pagesDataFromJson(myDataValue);
  }
}

【讨论】:

  • 我试试这个,但它会显示 CacheManager: Failed to download file from URL and will repeat load the page 1 data only.
【解决方案3】:

从 API 获取数据

Future<String> fetchPagesData(int page) {
  String url = Uri.encodeFull("https://API_URL?page=$page");
  return http.get(url).body;
}

设置SharedPreferences数据

Future<String> setPagesData(int page, String value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('myData$page', value);
}

获取SharedPreferences数据

Future<PagesData> getPagesData(int page) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getString('myData$page');
}

离线时捕捉

Future<PagesData> sendPagesDataRequest(int page) async {
  try {
    fetchPagesData(page).then((value) => setPagesData(page, value));
//   } on SocketException {
// no network connection   
  } catch (e) {}

  return getPagesData(page);
}

【讨论】:

  • 在 getPagesData 中出现错误:无法从方法“getPagesData”返回类型为“String”的值,因为它的返回类型为“Future”。
  • 只能异步获取值。见stackoverflow.com/questions/60450415/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2017-01-04
相关资源
最近更新 更多