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

Flutter报错:工厂构造函数无法访问实例成员,求修复及序列化指导

Flutter错误修复与JSON序列化指导

一、"Instance members can't be accessed from a factory constructor" 错误修复

错误原因

  1. 子类Food和Beverage重复声明了父类MyCard的所有成员(name、desc等)并添加@override,导致实例成员在工厂构造函数中被错误引用,违反Dart语法规则。
  2. @JsonSerializable()注解被错误放置在Food类的构造函数上,而非类定义顶部。

修复步骤

  • 删除Food和Beverage中所有重复声明的父类成员,直接继承使用MyCard的成员。
  • 将@JsonSerializable()注解移到类定义的最上方。

二、JSON序列化代码修正与规范

现有问题

  1. 手动编写_$FoodFromJson和_$FoodToJson方法,这类代码应由json_serializable自动生成,手动维护易出错。
  2. 父类MyCard未配置完整序列化逻辑,缺少toJson方法和标准工厂构造函数。
  3. 子类序列化未正确关联父类字段处理逻辑。

规范流程与修复代码

1. 依赖配置(确保pubspec.yaml包含)

dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0

2. 修复后的完整代码

import 'package:json_annotation/json_annotation.dart';

// 关联自动生成的序列化代码文件
part 'my_card.g.dart';

@JsonSerializable()
class MyCard {
  String name;
  String desc;
  String image;
  String flav;
  double price;

  MyCard(this.name, this.desc, this.image, this.flav, this.price);

  // 父类序列化构造函数,由build_runner生成实现
  factory MyCard.fromJson(Map<String, dynamic> json) => _$MyCardFromJson(json);

  // 父类反序列化方法,由build_runner生成实现
  Map<String, dynamic> toJson() => _$MyCardToJson(this);
}

@JsonSerializable()
class Food extends MyCard {
  Food({
    required super.name,
    required super.desc,
    required super.image,
    required super.flav,
    required super.price,
  }) : super(name, desc, image, flav, price);

  // 子类序列化构造函数,自动处理父类字段
  factory Food.fromJson(Map<String, dynamic> json) => _$FoodFromJson(json);

  @override
  Map<String, dynamic> toJson() => _$FoodToJson(this);

  static var foodList = [
    Food(
      name: 'Fraise Cream',
      desc:
          'We have been loading up on the stone fruit and berries at the market. We have no self control to these summer gems. We have gross we can out of hand, our  Strawberry...',
      price: 2.50,
      image: 'assets/images/food1.png',
      flav: 'Strawberry Flovour Sweet Ice Cream',
    ),
    Food(
      name: 'Mandarine',
      desc:
          'We have been loading up on the stone fruit and berries at the market. We have no self control to these summer gems. We have gross we can out of hand, our  Strawberry...',
      price: 3.50,
      image: 'assets/images/food2.png',
      flav: 'Caramel Flovour Sweet Ice Cream',
    )
  ];
}

@JsonSerializable()
class Beverage extends MyCard {
  Beverage({
    required super.name,
    required super.desc,
    required super.image,
    required super.flav,
    required super.price,
  }) : super(name, desc, image, flav, price);

  factory Beverage.fromJson(Map<String, dynamic> json) => _$BeverageFromJson(json);

  @override
  Map<String, dynamic> toJson() => _$BeverageToJson(this);

  static var beverageList = [
    Beverage(
      name: 'test',
      desc: 'We have test',
      image: 'assets/images/food1.png',
      price: 3.0,
      flav: 'Strawberry test',
    ),
  ];
}

3. 生成序列化代码

在终端执行以下命令,自动生成.g.dart文件:

flutter pub run build_runner build

关键说明

  • 使用part 'my_card.g.dart';关联自动生成的代码文件,无需手动编写序列化核心逻辑。
  • 父类和子类都添加@JsonSerializable()注解,确保所有字段被正确序列化/反序列化。
  • 子类构造函数通过super关键字传递参数给父类,避免代码冗余。

内容的提问来源于stack exchange,提问作者Ake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:05:49