【问题标题】:Flutter : How to use SharedPreference to get List<String>?Flutter:如何使用 SharedPreference 来获取 List<String>?
【发布时间】:2021-07-15 05:14:34
【问题描述】:

我在我的页面中创建了一个 initState,并在每次打开此页面时调用 callData 以获取 favId(类型:列表)。但是,当应用程序启动时,我的编译器会显示此错误消息:

_TypeError (type 'List<String>' is not a subtype of type 'String')

这是我的 getData 函数:

getData(favId) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    return pref.getStringList(favId);
  }

这也是我的 saveData 的功能:

void saveData() async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    pref.setStringList("id", favId);
  }

如何解决此问题,并且每次在应用程序中打开此页面时都可以调用 getData? 谢谢你:)

【问题讨论】:

  • 请不要把 Dart 当作 JavaScript,仅仅因为你可以。 Dart 是一种正确的编程语言,使用类型而不是自动默认的“动态”。类型系统将帮助您处理正确的错误消息,因此您可以自己找出问题所在。
  • @nvoigt 好的,谢谢你的建议 :)

标签: flutter dart


【解决方案1】:

"id"是一个String,你需要将一个List&lt;String&gt;存入setStringList

如果您想将项目添加到列表中,请执行以下步骤:

List<String> ids = await getData(favId);
ids.add("id");
saveData(ids, favId);

然后将saveData() 更改为

void saveData(ids, favId) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    pref.setStringList(ids, favId);
}

getData()

List<String> getData(favId) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    return pref.getStringList(favId);
}

【讨论】:

【解决方案2】:

如果您想在 SharedPreferences 中保存和检索 List,您可以使用相同的键来保存和检索值。

这是一个简单的例子,

const favKey = 'favoriteKey';

要保存数据,

void saveData(String favKey, List<String> favorites) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    pref.setStringList(favKey,favorites);
  }

要检索数据,

getData(String favKey) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    return pref.getStringList(favKey);
  }

注意:使用 SharedPreference 设置和获取数据需要使用相同的键。

【讨论】:

  • wowww,现在我可以保存和获取数据了:D。但是,为什么按收藏按钮后才得到数据呢?不是在页面打开的时候?
  • favId = getData(); 在 initState 方法中执行此操作。
  • favId = getData() 插入initState 时出现错误。这是错误:type 'Future&lt;dynamic&gt;' is not a subtype of type 'List&lt;String'
  • 然后您可以在 initState 和 initState 之外定义另一个函数,例如 getIds(),您可以定义 getIds() async { favId=getData();}
  • void initState() {super.initState(); getIds();} getIds() async {favId = getData();}
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2020-10-20
  • 2019-08-08
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多