Как создать собственный конструктор списка в Dart? Я пытался расширить список, но, похоже, это не сработало.
Класс FooList не может расширять List, поскольку List имеет только фабричные конструкторы (без генеративных конструкторов), а «FooList» имеет хотя бы один генеративный конструктор
Вот контекст:
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};
}
}
Моя цель — fromJson
проанализировать список JsonMap
typedef FooList = List<Foo>;
void main() {
final jsonList = [
{'foo': 'bar'},
{'foo': 'baz'},
];
final foos = jsonList.map((e) => Foo.fromJson(e)).toList(); // I don't like this, too verbose
print(foosBetter);
}
В традиционной разработке Dart все вышеперечисленное допустимо, но кажется многословным. Что-то вроде этого будет идеальным.
final foosBetter = FooList.from(jsonList); // I like this better, but this is obviously not working
Поэтому я попытался вместо объявления FooList
простого псевдонима:
abstract class FooList extends List<Foo> {
FooList.from(List<JsonMap> jsonList) {
addAll(jsonList.map((e) => Foo.fromJson(e)));
}
}
Что приводит к ошибке, указанной выше.
Список в дартсе — это интерфейс, поэтому его нельзя просто расширить.
Вы можете расширить реализацию List, например DelegatingList из коллекции пакетов.
import 'package:collection/collection.dart';
abstract class FooList extends DelegatingList<Foo> {
FooList.from(List<JsonMap> jsonList)
: super(jsonList.map(Foo.fromJson).toList());
}
Или расширить из ListBase.
import 'dart:collection';
abstract class FooList extends ListBase<Foo> {
FooList.from(List<JsonMap> jsonList) {
addAll(jsonList.map(Foo.fromJson));
}
}
Или вы можете создать тип расширения в списке.
extension type FooList(List<Foo> list) implements List<Foo> {
FooList.from(List<JsonMap> jsonList)
: this(jsonList.map(Foo.fromJson).toList());
}
Или вы можете реализовать интерфейс List, но для этого потребуется предоставить определения для всех методов List.
Я использую 3.3.1, моя IDE для Android-студии, похоже, не знает об этом
Начиная с версии 3.3: medium.com/dartlang/dart-3-3-325bf2bf6c13
ваш pubspece.yaml
установил SDK минимум на 3.3? sdk: '>=3.3.0 <4.0.0'
О, я понял, я изменил pubsec на среду: sdk: ^3.3.0
Большое спасибо! Новые возможности Dart — это круто
Ух ты, я увидел там твое редактирование! Не думаю, что я когда-либо использовал `dart:collection'.
Какая версия Dart поддерживает тип расширения?