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

如何在Dart中扩展List<T>?自定义List构造器实现方案

解决Dart中自定义List构造器的问题

你遇到的错误是因为Dart的List是抽象类,且仅提供工厂构造函数,没有生成式构造函数,直接继承List的类如果包含生成式构造(哪怕是默认的无参构造)就会触发这个报错。下面给你几种可行的实现方式,满足你简洁解析JSON列表的需求:

方案一:给List添加静态扩展方法

利用Dart的扩展(Extension)特性,给List<Foo>添加静态的from方法,配合你定义的FooList别名直接使用:

typedef JsonMap = Map<String, dynamic>;
typedef JsonList = List<JsonMap>;
typedef FooList = List<Foo>;

class Foo {
  final String foo;

  Foo(this.foo);

  factory Foo.fromJson(JsonMap json) {
    return Foo(json['foo']);
  }

  JsonMap toJson() {
    return {'foo': foo};
  }
}

// 添加扩展
extension FooListExtension on List<Foo> {
  static FooList from(List<JsonMap> jsonList) {
    return jsonList.map((e) => Foo.fromJson(e)).toList();
  }
}

void main() {
  final jsonList = [
    {'foo': 'bar'},
    {'foo': 'baz'},
  ];

  final foosBetter = FooList.from(jsonList);
  print(foosBetter); // 输出:[Instance of 'Foo', Instance of 'Foo']
}

方案二:创建工具类封装转换逻辑

如果不想用扩展,也可以直接写一个工具类,通过静态方法提供转换入口:

typedef JsonMap = Map<String, dynamic>;
typedef JsonList = List<JsonMap>;

class Foo {
  final String foo;

  Foo(this.foo);

  factory Foo.fromJson(JsonMap json) {
    return Foo(json['foo']);
  }

  JsonMap toJson() {
    return {'foo': foo};
  }
}

// 工具类
class FooList {
  static List<Foo> from(List<JsonMap> jsonList) {
    return jsonList.map((e) => Foo.fromJson(e)).toList();
  }
}

void main() {
  final jsonList = [
    {'foo': 'bar'},
    {'foo': 'baz'},
  ];

  final foosBetter = FooList.from(jsonList);
  print(foosBetter);
}

这个方案里FooList不需要继承List,只是作为一个命名空间提供转换方法,返回的依然是标准的List<Foo>对象,完全满足你的使用需求。

方案三:给JSON列表添加转换方法

换个思路,直接给Iterable<JsonMap>扩展一个转FooList的方法,写法同样简洁:

typedef JsonMap = Map<String, dynamic>;
typedef JsonList = List<JsonMap>;
typedef FooList = List<Foo>;

class Foo {
  final String foo;

  Foo(this.foo);

  factory Foo.fromJson(JsonMap json) {
    return Foo(json['foo']);
  }

  JsonMap toJson() {
    return {'foo': foo};
  }
}

extension JsonListExtension on Iterable<JsonMap> {
  FooList toFooList() {
    return map((e) => Foo.fromJson(e)).toList();
  }
}

void main() {
  final jsonList = [
    {'foo': 'bar'},
    {'foo': 'baz'},
  ];

  final foosBetter = jsonList.toFooList();
  print(foosBetter);
}

这种方式更符合Dart的链式调用风格,代码可读性也很强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:43:09