尝试从 sharedPreferences 检索地图时出现颤振错误

Posted

技术标签:

【中文标题】尝试从 sharedPreferences 检索地图时出现颤振错误【英文标题】:flutter error while trying to retrieve a Map from sharedPreferences 【发布时间】:2021-10-22 03:19:06 【问题描述】:

我正在尝试使用sharedPreferences.setString('key', json.encode(myMap)) 检索保存在sharedPreferences 中的Map<String, List<Result>>。方法toJson()fromJson() 已经存在于MyObj 类中。 当我尝试使用json.decode(sharedPreferences.getString('key')) 检索此地图时,我收到错误Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<String, List<Result>>'

我该如何解决这个问题?

结果类:

class Result 
  final String position;
  final String points;
  final Driver driver

  Result(this.position, this.points, this.driver);

  factory Result.fromJson(Map<String, dynamic> json) 
    return Result(
      position: json['position'],
      points: json['points'],
      driver: Driver.fromJson(json['Driver']),
    );
  

  Map<String, dynamic> toJson() 
    return 
      'position': position,
      'points': points,
      'driver': driver,
    ;
  

sharedPreferences中获取Map的方法:

Future<Map<String, List<Result>>> fetchResult() async 
    SharedPreferences sharedPreferences = await getSharedPreferencesInstance();
    Map<String, List<Result>> results = Map<String, List<Result>>();
    if (sharedPreferences.getString('results') != null) 
      results = Map<String, dynamic>.from(json.decode(sharedPreferences.getString('results')));
      return results;
     else 
        final response = await dio.get(Constants.resultUrl('2021', (i + 1).toString()));
        final data = response.data;
        List<Result> singleResult = [];
        for(...)
            for (int j = 0; j <= 19; j++) 
                    singleResult.add(Result.fromJson(
                        data['Test']['Table']['Races'][0]['Results'][j]));
                  
                
                results[data['Test']['Table']['Races'][i]['name']] =
                    singleResult;
        
        sharedPreferences.setString('results', json.encode(results));
        return results;
       else 
        throw Exception("Fail!");
      
    
  

新错误:

E/flutter ( 4645): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: NoSuchMethodError: The method '[]' was called on null.
E/flutter ( 4645): Receiver: null
E/flutter ( 4645): Tried calling: []("firstName")

firstName 是 Driver 类中的一个字符串。

驱动类:

class Driver 
  final String firstName;
  final String secondName;
  final String dateOfBirth;
  final String nationality;

  Driver(
      this.firstName,
      this.secondName,
      this.dateOfBirth,
      this.nationality);

  factory Driver.fromJson(Map<String, dynamic> json) 
    return Driver(
      firstName: json['firstName'],
      secondName: json['secondName'],
      dateOfBirth: json['dateOfBirth'],
      nationality: json['nationality'],
    );
  

  Map<String, dynamic> toJson() 
    return 
      'firstName': firstName,
      'secondName': secondName,
      'dateOfBirth': dateOfBirth,
      'nationality': nationality,
    ;
  

【问题讨论】:

您好,请在您的帖子中添加一些相关代码。 :) 代码添加到问题中 【参考方案1】:

更改此代码:

results = Map<String, dynamic>.from(json.decode(sharedPreferences.getString('results')));
return results;

到这里:

final decodedJson = Map<String, List<dynamic>>.from(json.decode(sharedPreferences.getString('results')));

for (var entry in decodedJson.entries) 
  final resultList = <Result>[];
  for (var eachResult in entry.value) 
    resultList.add(Result.fromJson(eachResult));
  
  results[entry.key] = resultList;


return results;

新错误的解决方法: 您在 Result.fromJson() 构造函数中拼错了 json 参数的键。 它应该是Driver.fromJson(json['driver']) 而不是Driver.fromJson(json['Driver'])

【讨论】:

好吧,它似乎工作。现在我有一个新错误,(我用新错误更新了问题),它与驱动程序类有关。 添加您的驱动程序类和问题中出现错误的代码 你在哪里打电话firstName 我认为是 Result.fromJson() 包含驱动程序:Driver.fromJson() 我已经编辑了我的答案。如果您的错误发生,请告诉我。

以上是关于尝试从 sharedPreferences 检索地图时出现颤振错误的主要内容,如果未能解决你的问题,请参考以下文章

无法从SharedPreferences检索数据?

尝试使用 SharedPreferences 存储和检索应用程序数据,但它没有返回所需的数据

我可以使用一个按钮将数据保存在 sharedPreferences 中,然后使用另一个按钮来检索它吗?

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

如何在 SharedPreferences 中保存和检索日期

使用 SharedPreferences 保存字节数组