Flutter本地存储报错:无法将listActivities实例转为可编码对象
问题重现
尝试向多层级对象列表listAktifitas指定索引添加PengunjungModel对象并存储到本地,实现代码如下:
pushObjectWisata(selectedIndex, selectedObjectId) async { PengunjungModel dataObjectWisata = listObjectWisata .firstWhere((element) => element.id == selectedObjectId); listAktifitas[selectedIndex].dataAktifitas!.add(dataObjectWisata); await saveListAktifitas(listAktifitas); }
运行时触发错误:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Converting object to an encodable object failed: Instance of 'listActivities'
涉及的模型定义:
listActivities 模型
class listActivities { String? namaAktifitas; int? statusAktifitas; int? countActivity; String? thumbnail; List<PengunjungModel>? dataAktifitas; listActivities({ this.namaAktifitas, this.statusAktifitas, this.countActivity, this.thumbnail, this.dataAktifitas, }); factory listActivities.fromJson(Map<String, dynamic> json) => listActivities( namaAktifitas: json['namaAktifitas'].toString(), countActivity: json['countActivity'], statusAktifitas: json['statusAktifitas'], thumbnail: json['thumbnail'].toString(), dataAktifitas: List<PengunjungModel>.generate( json['dataAktifitas'].length, (index) => PengunjungModel.fromJson( json['dataAktifitas'][index] ?? <String, dynamic>{}), ), ); static List<listActivities> fromJsonList(dynamic jsonList) { final listAktifitas = <listActivities>[]; if (jsonList == null) return listAktifitas; if (jsonList is List<dynamic>) { for (final json in jsonList) { listAktifitas.add( listActivities.fromJson(json), ); } } return listAktifitas; } factory listActivities.fromRawJson(String str) => listActivities.fromJson(jsonDecode(str)); String toRawJson() => jsonEncode(toJson()); Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['namaAktifitas'] = namaAktifitas; data['statusAktifitas'] = statusAktifitas; data['countActivity'] = countActivity; data['thumbnail'] = thumbnail; data['dataAktifitas'] = dataAktifitas; return data; } }
PengunjungModel 模型
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:sbh_v2/model/pariwisata/foto.dart'; import 'package:sbh_v2/model/pariwisata/kategori_pengunjung.dart'; class PengunjungModel { String? title; int? id; String? harga_terendah; String? harga_tertinggi; String? deskripsi; String? jam_buka; String? jam_tutup; String? alamat; String? fasilitas; double? lat; double? lng; List<Foto>? list_foto = <Foto>[]; KategoriPengunjung? kategoriPengunjung; PengunjungModel( {this.id, this.title, this.harga_terendah, this.harga_tertinggi, this.deskripsi, this.alamat, this.list_foto, this.jam_tutup, this.jam_buka, this.fasilitas, this.lat, this.lng, this.kategoriPengunjung}); factory PengunjungModel.fromJson(Map<String, dynamic> json) => PengunjungModel( id: json['id'], title: json['title'] ?? "-", alamat: json['alamat'] ?? "-", jam_buka: json['jam_buka'] ?? "-", jam_tutup: json['jam_tutup'] ?? "-", fasilitas: json['fasilitas'], lat: double.parse(json['lat'] ?? '0'), lng: double.parse(json['lng'] ?? '0'), harga_terendah: json['harga_terendah'] ?? "", harga_tertinggi: json['harga_tertinggi'] ?? "", deskripsi: json['deskripsi'] ?? "-", list_foto: List<Foto>.generate( json['foto'].length, (index) => Foto.formJson( json['foto'][index] ?? <String, dynamic>{}, ), ), kategoriPengunjung: KategoriPengunjung.fromJson( json['kategori_layanan_pengunjung'] ?? <String, dynamic>{}), ); factory PengunjungModel.fromRawJson(String str) => PengunjungModel.fromJson(jsonDecode(str)); }
错误原因
报错核心是JSON编码时无法处理嵌套的自定义对象:
listActivities的toJson方法中,直接将dataAktifitas(PengunjungModel列表)放入Map,但PengunjungModel未实现toJson方法,无法被jsonEncode解析。- 嵌套的
Foto和KategoriPengunjung类如果也没有实现toJson,同样会导致编码失败。
解决方案
需要给所有自定义模型添加toJson方法,确保所有嵌套对象都能转换为可编码的Map<String, dynamic>。
1. 给PengunjungModel添加toJson方法
class PengunjungModel { // ... 原有属性、构造函数、fromJson方法不变 ... Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['id'] = id; data['title'] = title; data['harga_terendah'] = harga_terendah; data['harga_tertinggi'] = harga_tertinggi; data['deskripsi'] = deskripsi; data['jam_buka'] = jam_buka; data['jam_tutup'] = jam_tutup; data['alamat'] = alamat; data['fasilitas'] = fasilitas; data['lat'] = lat; data['lng'] = lng; // 将list_foto转换为json列表 data['foto'] = list_foto?.map((foto) => foto.toJson()).toList(); // 将kategoriPengunjung转换为json data['kategori_layanan_pengunjung'] = kategoriPengunjung?.toJson(); return data; } String toRawJson() => jsonEncode(toJson()); }
2. 给Foto类添加toJson方法
根据Foto的实际属性补充字段:
class Foto { // ... 原有属性、fromJson方法 ... Map<String, dynamic> toJson() { final data = <String, dynamic>{}; // 示例:假设Foto有url字段 // data['url'] = url; return data; } }
3. 给KategoriPengunjung类添加toJson方法
根据实际属性补充字段:
class KategoriPengunjung { // ... 原有属性、fromJson方法 ... Map<String, dynamic> toJson() { final data = <String, dynamic>{}; // 示例:假设KategoriPengunjung有nama字段 // data['nama'] = nama; return data; } }
4. 修正listActivities的toJson方法
确保dataAktifitas列表中的每个PengunjungModel都被转换为json:
class listActivities { // ... 原有属性、构造函数、fromJson方法不变 ... Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['namaAktifitas'] = namaAktifitas; data['statusAktifitas'] = statusAktifitas; data['countActivity'] = countActivity; data['thumbnail'] = thumbnail; // 将dataAktifitas转换为json列表 data['dataAktifitas'] = dataAktifitas?.map((pengunjung) => pengunjung.toJson()).toList(); return data; } }
可选:修正类名符合Dart规范
Dart中类名应使用大驼峰命名法,建议将listActivities改为ListActivities,避免潜在的命名冲突和代码可读性问题。
内容的提问来源于stack exchange,提问作者spardano
相关产品推荐
相关产品推荐

