Вы можете достичь этого при первом подходе, но у вас есть две проблемы с фрагментом:
Сначала проверьте, что оператор распространения реализован в итерируемом, поэтому строку Foo a = Foo();
следует заменить на несколько итерируемых список, например.
Вторая проблема, ошибка компиляции на Foo b = { ...a };
, заключается в том, что Dart использует {}
как для наборов, так и для карт, поэтому вы должны указать тип, добавив один или два параметра типа в <>
.
Проверьте этот пример:
var a = <Foo>[];
var b = <String>[];
var c = <Foo>{...a}; // works, a is Foo list
var d = <Foo>{...b}; // compile time error, 'String' can't be assigned to the set type 'Foo'.
Поскольку мы используем только 1 аргумент в var d = <Foo>{...b};
Дарт знает, что нам нужен набор.
ОБНОВЛЕНИЕ:
Для этого случая вы не можете использовать оператор спреда. Оператор Spread был введен для облегчения работы с коллекциями, а коллекции имеют тип, заданный параметрами generics. Поэтому, если ваш класс не реализует Iterable, вы не можете вызвать ... для данного экземпляра. Вы получите ошибку времени компиляции:
Spread elements in list or set literals must implement 'Iterable'
С другой стороны, как вы упоминаете, второй подход «не дает вам» безопасности типов, потому что вы используете Dynami c. И также ТОЛЬКО компилировать, потому что вы объявляете Map<String, dynamic> a = { 'aNumber': 2, 'aString': 'lorem' };
, который является картой и реализует Iterable (вы можете использовать ... a).
Для вашей текущей проблемы вам нужно найти другое решение, возможно, пользовательское функция класса Foo, которая возвращает Map и заботится о типах, а затем использует оператор распространения на этой карте.
Надеюсь, это поможет!