lesnitsky / flutter_localstorage

📦 LocalStorage for Flutter
MIT License
298 stars 65 forks source link

Unhandled Exception: Converting object to an encodable object failed: Instance of 'ListMapView<String>' #41

Closed philos3 closed 4 years ago

philos3 commented 4 years ago

DATA JSON

{"current_integral":"0","super_vip":"0","nick_name":"XXX","email":"XXXXXXX@qq.com","mobile":"XXXXXXX","id":"190","user_name":"XXXXXXX","sex":"1","birthday":1367856000000,"user_header":"/Uploads/header/2020-05-07/5eb3b3d3420e6.jpg","user_session":"190","type":2,"uuid":["CB:6A:47:75:D9:D9"],"uuids":[{"id":"18","name":"1.0","version":"Boot v1.0.0","bind":"1","user_id":"190","uuid":"CB:6A:47:75:D9:D9"}]}

Exception

Unhandled Exception: Converting object to an encodable object failed: Instance of 'ListMapView' E/flutter (26935): # 0 _JsonStringifier.writeObject (dart:convert/json.dart:649:7) E/flutter (26935): # 1 _JsonStringifier.writeMap (dart:convert/json.dart:730:7) E/flutter (26935): # 2 _JsonStringifier.writeJsonValue (dart:convert/json.dart:685:21) E/flutter (26935): # 3 _JsonStringifier.writeObject (dart:convert/json.dart:640:9) E/flutter (26935): # 4 _JsonStringStringifier.printOn (dart:convert/json.dart:836:17) E/flutter (26935): # 5 _JsonStringStringifier.stringify (dart:convert/json.dart:821:5) E/flutter (26935): # 6 JsonEncoder.convert (dart:convert/json.dart:257:30) E/flutter (26935): # 7 JsonCodec.encode (dart:convert/json.dart:168:45) E/flutter (26935): # 8 LocalStorage.setItem (package:localstorage/localstorage.dart:79:14)

Example

StorageManager.localStorage.setItem(kUser, user.toJson());

class User {

String current_integral; //超级会员(0不是,1是) String super_vip; String nick_name=''; String email; String mobile; String id; String user_name; //性别【0女,1男】 String sex; int birthday; String user_header; String img_url; String user_session; int type=1;// List uuids; List uuid = [];

List<Object> collectIds;

User.fromJsonMap(Map<String, dynamic> map):

// collectIds = map["collectIds"], current_integral = map["current_integral"], super_vip = map["super_vip"], nick_name = map["nick_name"], email = map["email"], mobile = map["mobile"], id = map["id"], user_name = map["user_name"], sex = map["sex"], birthday = map["birthday"], user_header = map["user_header"], img_url = map["img_url"], user_session = map["user_session"], type = map["type"], uuid = map["uuid"].cast(), uuids = map["uuids"] == null || map["uuids"] == "" ?null :map["uuids"].cast();

Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();

// data['collectIds'] = collectIds; data['current_integral'] = current_integral; data['super_vip'] = super_vip; data['nick_name'] = nick_name; data['email'] = email; data['mobile'] = mobile; data['id'] = id; data['user_name'] = user_name; data['sex'] = sex; data['birthday'] = birthday; data['user_header'] = user_header; data['img_url'] = img_url; data['user_session'] = user_session; data['type'] = type; data['uuid'] = uuid.asMap(); data['uuids'] = uuids != null ? (uuids.map((items){ return items.toJson(); }) ):[]; return data; } }

class UUID {

String id;
String name;
String version;
String bind;
String user_id;
String uuid;

UUID.fromJsonMap(Map<String, dynamic> map):
            id = map["id"],
            name = map["name"],
            version = map["version"],
            bind = map["bind"],
            user_id = map["user_id"],
            uuid = map["uuid"];

Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = id;
    data['name'] = name;
    data['version'] = version;
    data['bind'] = bind;
    data['user_id'] = user_id;
    data['uuid'] = uuid;
    return data;
}

@override

String toString() { return "{'id': '$id','name': '$name', 'version': '$version', 'bind': '$bind', 'user_id': '$user_id', 'uuid': '$uuid'}"; } }

philos3 commented 4 years ago

StorageManager.localStorage.setItem(kUser, user.toString()); to save as a String is OK

lesnitsky commented 4 years ago

Converting object to an encodable object failed: Instance of 'ListMapView' this suggests that your toJson() implementation returned an entity which json.encode isn't able to encode, so you need to pass a custom encoder. I recommend using json_serializable to generate toJson/fromJson methods

philos3 commented 4 years ago

Converting object to an encodable object failed: Instance of 'ListMapView' this suggests that your toJson() implementation returned an entity which json.encode isn't able to encode, so you need to pass a custom encoder. I recommend using json_serializable to generate toJson/fromJson methods

It is any example code to pass a custom encoder. Can you point out where is the problem in my code, this code is similar to json_serializable

philos3 commented 4 years ago

It is my problem,I had fixed this bug with this code,thanks for help.

uuids = (map["uuids"] == null || map["uuids"] == "") ? [] :(map["uuids"] as List).map( (item){ return UUIDData.fromJsonMap(item); }).toList();