如何编码和解码对象列表以便稍后将它们存储在 sharedpreferences 中?

How to encode and decode a list of objects to later store them in sharedpreferences?

我的代码:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:multi_select_flutter/multi_select_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Item {
  final int id;
  final String name;

  Item({
    this.id,
    this.name,
  });

  Item.fromJson(Map<String, dynamic> json)
    : id = json['i'],
      name = json['n'];

  Map<String, dynamic> toJson() {
    return {
      'i' : id,
      'n' : name,
    };
  }
}

class ProfileScreen extends StatefulWidget {
  @override
  _ProfileScreenState createState() => _ProfileScreenState();
}

class _ProfileScreenState extends State<ProfileScreen> {
  List<Item> selectedDogSizes = [];

  @override
  void initState() {
    getData("dogSizes");
  }

  getData(String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var myList;
    setState(() {
      myList = prefs.getString(key);
    });
    selectedDogSizes = jsonDecode(myList) ?? [];
  }

  setData(List<Item> items, String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var myList = jsonEncode(items);
    prefs.setString(key, myList);
  }

  List<Item> dogSizes = [
    Item(id: 1, name: "Small"),
    Item(id: 2, name: "Medium"),
    Item(id: 3, name: "Big"),
  ];

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        MultiSelectChipField<Item>(
          items: dogSizes
              .map((item) => MultiSelectItem<Item>(item, item.name))
              .toList(),
          initialValue: selectedDogSizes,
          icon: Icon(Icons.check),
          onTap: (values) {
            selectedDogSizes = values;
            setData(selectedDogSizes, "dogSizes");
          },
        ),
      ],
    );
  }
}

我正在尝试存储用户是否选择了其中一个选项。为此,我使用了一个对象列表 'Items',每次更改所选元素的列表时,我都会尝试对列表进行编码并存储它。

E/flutter (10651): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Item>'
E/flutter (10651): #0      _ProfileScreenState.getData (package:woofdates/screens/profileScreen.dart:47:5)
E/flutter (10651): <asynchronous suspension>
E/flutter (10651): #1      _ProfileScreenState.initState (package:woofdates/screens/profileScreen.dart:38:5)
E/flutter (10651): #2      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter (10651): #3      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter (10651): #4      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter (10651): #5      Element.updateChild (package:flutter/src/widgets/framework.dart:3324:20)
E/flutter (10651): #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #7      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #8      StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #10     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #11     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #12     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #13     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #14     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #15     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #16     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #17     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #18     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5647:32)
E/flutter (10651): #19     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6246:17)
E/flutter (10651): #20     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #22     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #23     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #24     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #25     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #26     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #27     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #28     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #31     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #33     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #35     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #36     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #37     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #38     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #39     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
E/flutter (10651): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #41     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
E/flutter (10651): #42     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #43     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #44     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #45     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #46     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #47     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #48     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #49     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #50     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #51     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #54     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #55     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #56     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #57     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #58     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #59     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
E/flutter (10651): #60     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #61     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #62     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #63     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #64     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
E/flutter (10651): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
E/flutter (10651): #66     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (10651): #67     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter (10651): #68     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (10651): #69     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2730:33)
E/flutter (10651): #70     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:913:20)
E/flutter (10651): #71     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
E/flutter (10651): #72     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
E/flutter (10651): #73     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
E/flutter (10651): #74     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
E/flutter (10651): #75     _rootRun (dart:async/zone.dart:1190:13)
E/flutter (10651): #76     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (10651): #77     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (10651): #78     _invoke (dart:ui/hooks.dart:251:10)
E/flutter (10651): #79     _drawFrame (dart:ui/hooks.dart:209:3)
E/flutter (10651): 

我也尝试过使用包 json_serializable,结果出现了同样的错误。 我也可以将它作为一个 id 整数列表,然后将其编码为 json,但我也不知道如何从多个对象中获取整数。

像这样解码:

getData(String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var myList;
    setState(() {
      myList = prefs.getString(key);
    });
    var decodedString= jsonDecode(myList) ?? [];
     selectedDogSizes  = (decodedString as List).map((i) => Item.fromJson(i)).toList();
  }

然后:

 onTap: (values) {
            selectedDogSizes = values;
            setData(selectedDogSizes, "dogSizes");
            getData("dogSizes");
            setState((){});
          },