如何在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
相关产品推荐
相关产品推荐

