Flutter:Unhandled 异常:类型 'List<dynamic>' 不是类型 'List<String>' 的子类型

Flutter:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<String>'

我有一个 json 字符串,我正试图将其保存到共享首选项中。除了这个列表

,我已经设法保存了所有其他的
{
"roles":[

      "ROLE_USER",

      "ROLE_MODERATOR",

      "ROLE_ADMIN"

   ],
}

这是我的json

 {

   "id":44,

   "username":"user@gmail.com",

   "email":"user@gmail.gom",

   "roles":[

      "ROLE_USER",

      "ROLE_MODERATOR",

      "ROLE_ADMIN"

   ],

   "userid":"439cea61-602b-4b1f-a32b-41487775ba00",

   "surname":"user",

   "firstname":"user1",

   "telephoneno":"2113456",

   "whatsappno":"2113456",

   "active":1,

   "studyrole":"TRAINEE",

   "tokenType":"Bearer",

   "accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJybXVtb0BtZ2ljLnVtYXJ5bGFuZC5lZHUiLCJpYXQiOjE2MTEwNzk0NDcsImV4cCI6MTYxMTE2NTg0N30.EFX48OAD2MRtg3jCBvvH-Sna4jG8P5FX_LCbyBw38-UX4M85y6l15ISxlF02qK7rhzddiN9KZ8IIvLxhd0mZUA"

}

到目前为止我做到了什么

final http.Response response = await http.post(
    url,
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'username': username,
      'password': password,
      'appversion': appversion,
      'latitude': latitude,
      'longitude': longitude,
      'imeI': imeI,
    }),
  );
  print(response.body);
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var parse = jsonDecode(response.body);

    await prefs.setString('username', parse["username"]);
      await prefs.setString('accessToken', parse["accessToken"]);
      await prefs.setString('surname', parse["surname"]);
      await prefs.setString('firstname', parse["firstname"]);
      await prefs.setInt('id', parse["id"]);
      await prefs.setBool('active', parse["active"] == 1);
      await prefs.setString('userid', parse["userid"]);

我如何尝试将列表保存在共享首选项中

 await prefs.setStringList('roles', parse['roles']);

每当我尝试保存 json 列表时,我都会遇到错误

Unhandled Exception: type 'List' is not a subtype of type 'List'

如何提取角色并将它们作为单个项目保存在共享首选项中。

此外,在保存它们之后,如何从共享首选项中检索像 ROLE_USER 这样的用户的个人角色?

可能你错过了演员表,试试这个

await prefs.setStringList('roles', parse['roles'].cast<String>());

根据你的第二个问题(按字段搜索用户位置)

这样做有点棘手,因为共享首选项是 key/value 存储,而不是关系数据库。我强烈建议使用数据库,否则你会面临太多的复杂性。

为什么?您想在共享首选项中存储用户列表(我假设它是用户对象),但您共享的代码范围是针对单个用户的,确实需要用户列表。要存储列表,需要将其编码为 json 字符串,而要检索为列表,需要从 json 字符串进行解码。