Важное различие между методами from
и of
заключается в том, что последние имеют аннотации типов, а первые - нет.Так как дженерики дротиков усовершенствованы, а дартс 2 строго типизированы, это является ключом к тому, чтобы обеспечить правильное построение List/Map
:
List<String> foo = new List.from(<int>[1, 2, 3]); // okay until runtime.
List<String> bar = new List.of(<int>[1, 2, 3]); // analysis error
и гарантировать, что типы выводятся правильно:
var foo = new List.from(<int>[1, 2, 3]); // List<dynamic>
var bar = new List.of(<int>[1, 2, 3]); // List<int>
В Dart 1 типы были полностью необязательными, поэтому многие API были нетипизированы или частично напечатаны.List.from
и Map.from
являются хорошими примерами, поскольку переданные в них Iterable/Map
не имеют параметра типа.Иногда Дарт может выяснить, каким должен быть тип этого объекта, но иногда он просто заканчивался как List<dynamic>
или Map<dynamic, dynamic>
.
В Дарт 2 тип dynamic
был изменен с того, чтобы быть верхним(Object) и нижний (null) тип, чтобы быть только верхним типом.Таким образом, если вы случайно создали List<dynamic>
в Dart 1, вы все равно можете передать его методу, который требует List<String>
.Но в Dart 2 List<dynamic>
почти совпадает с List<Object>
, поэтому это не получится.
Если вы используете Dart 2, вы всегда должны использовать типизированную версию этих API.Почему старые все еще существуют, и какие планы там?Я действительно не знаю.Я предполагаю, что они будут постепенно сокращаться вместе с остальной частью Дротика 1.