Dart Records — «Золотое детище Dart 3.0»?
С запуском Flutter 3.10.0 был официально представлен Dart 3.0 с множеством захватывающих функций. Многочисленные разработчики Flutter уже были в восторге от того, чтобы попробовать его, что вызвало большое ожидание. Лично я не испытывал такого восторга от функции с момента появления расширений Dart (которые, кстати, остаются одной из моих любимых функций Dart).
Имея так много возможностей для выбора, я хотел бы сосредоточиться на записях в этой статье. Эта функция обязательно заставит вас почувствовать себя увереннее, так как позволит вам добиться большего с помощью значительно меньшего количества кода. По своей сути Dart Records позволяет вам объединять несколько объектов и извлекать их как единый связанный объект. Просто представьте себе возможность одновременного приготовления двух или более различных рецептов, используя одну и ту же кастрюлю. Это именно та сверхспособность, которую Dart Records дарует вам.
Вы можете начать использовать записи дротика в своем коде самым простым способом.
(int,int) record1 = (4,6); print(record1.$1);//4 print(record1.$2);//6
В приведенном выше коде показан простой способ объявления записей в Dart. Этот метод показывает записи, объявленные как позиционные аргументы. Вот почему вам нужно ссылаться на эту позицию, когда вам нужно объявить объект на своем месте ($1 для первой позиции, $2 для второй позиции). Чтобы объявить объекты как именованные аргументы, вам нужно будет заключить их в фигурные скобки, а затем перейти к именам переменных.
Приведенный выше код в качестве именованных переменных становится:
({int num1,int num2}) record2 = (num1:4,num2:6); print(record2.num1);//4 print(record2.num2);//6
Записи могут иметь разные типы полей и могут сравниваться. Это означает, что вы можете объявить запись с более чем одним типом данных, а также использовать оператор равенства, чтобы проверить, содержат ли две записи одно и то же значение. Для этого обе записи должны иметь одинаковые именованные или позиционные аргументы.
({int num1, int num2}) record3 = (num1: 5, num2:6); ({int num1, int num2}) record4 = (num1: 5, num2:6); print(record3 == record4);//true (int,int) record5 = (2,3); (int,int) record6 = (3,2); print(record5 == record6);//false
Хотя записи5 и записи6 имеют одинаковые номера, тот факт, что их позиции поменялись местами, означает, что две записи не равны. Однако перестановка позиций записи3 и записи4 не будет иметь такого же эффекта, пока не будут изменены имена переменных, потому что в то время как первая использует позиционные аргументы, последняя использует именованные аргументы, и в результате, пока имена указывают на одинаковые значения, их позиции не имеют значения.
Обратите внимание, что вы можете увеличить количество объектов, содержащихся в одной записи, до любого желаемого значения.
Несколько возвратов
Это настоящий MVP, который заставил меня кричать. Если вы раньше работали со сложными API, вы согласитесь со мной, что необходимость писать разные функции для обработки разных частей одного и того же API может быть настоящей головной болью. Благодаря функциям многократного возврата записей Dart вы можете делать все с помощью одной функции. Хорошо… давайте исследуем.
Чтобы проверить это, вам понадобится API с несколькими возвращаемыми значениями. Возможно, тот, который возвращает объект, содержащий список и другие объекты. Guardian API предлагает то, с чем вы можете работать. Однако ради этой статьи я собираюсь использовать фиктивные данные.
{ "summary":{ "total_users": 3, "avg_age": 33 }, "data":[ {"name": "Maro","age": 20} {"name": "Luke","age": 40} {"name": "Jones","age": 33} ] }
С приведенными выше данными вам, вероятно, потребуется построить экран, показывающий сводку данных, показанных вместе со списком пользователей на том же экране. Ваша функция будет выглядеть примерно так:
Future<(Summary,List<User>)> getUsersAndSummary(){ ... return (summary, usersList); }
Чтобы использовать данные из функции, поскольку приведенный выше код содержит именованные аргументы,
await getUsersAndSummary().$1;//Summary data await getUsersASummary().$2;//UsersList
Благодаря этому вы можете легко получить несколько элементов, возвращаемых из вашей функции, и легко работать с данными без необходимости управлять кодом в разных функциях.
Используемый пример показывает два элемента для облегчения понимания. Вы можете решить работать с большим количеством элементов в зависимости от сложности вашего API или данных.
Спасибо, что дочитали до конца. Держите пальцы скрещенными в следующей статье о другой интересной функции Dart 3.
Удачного кодирования. 🎉🎉