You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编码时无法处理嵌套的自定义对象:

  1. listActivities的toJson方法中,直接将dataAktifitas(PengunjungModel列表)放入Map,但PengunjungModel未实现toJson方法,无法被jsonEncode解析。
  2. 嵌套的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:54:54