От автора: это мое личное восприятие того, как Dart быстро превратился из языка, на котором я должен был научиться создавать что-то с помощью Flutter, в язык, которым я люблю пользоваться каждый день.
Когда вы начинаете с работать Flutter, вы часто слышите, что Dart похож на JavaScript. Ну, это в принципе так… за исключением тех случаев, когда это не так. Я подумал, что было бы полезно выделить некоторые тонкие отличия между Dart JavaScript, чтобы упростить задачу разработчикам, когда им нужно будет переключаться с одного языка на другой.
Условия должны иметь статический тип ‘bool’
В дополнение к типам, Dart вообще более строгий язык. В JavaScript вы можете использовать любое «истинное» значение в условном выражении. Например:
var name = 'Joe'; if (name) { // делаем что-то...
Если вы попробуете эквивалентный код в Dart, вы увидите предупреждение “Conditions must have a static type of ‘bool’”. Причина в том, что Dart требует, чтобы условие было bool true, а не просто «истинным» значением. Вы можете исправить код, изменив его на:
if (name.length > 0)
Но предпочтительный подход заключается в следующем:
if (name.isNotEmpty)
В связи с этим в Dart нет тройных символов равно (===). В качестве отступления, я увидел этот отличный совет в Twitter — использовать тот же analysis_options.yaml, что и команда Flutter. Это очень помогло освоить с лучшие практики Dart в целом.
Где console.log?
Хотя я постоянно пытаюсь научиться полагаться на отладчик, старые привычки тяжело умирают. Вместо console.log вы можете использовать print. Dart поддерживает интерполяцию строк, так что там, где в JavaScript вы можете написать:
console.log('Name is %s', name);
в Dart используйте:
print('Name is $name');
Если вам нужно получить доступ к свойствам переменной или вызвать функции, вы можете заключить ее в фигурные скобки.
print('Length is ${name.length}');
Параметры функции
Это одна из областей, в которых, мне кажется, JavaScript и Dart отличаются сильнее всего. Dart предоставляет гораздо более мощную реализацию, но для адаптации может потребоваться некоторое время.
Этот ответ на StackOverflow от Сета Лэдда отлично объясняет различия. В общем в Dart вы можете передать параметры в заданных позициях:
getFullName('John', 'Doe');
Или вы можете передать их по имени:
getFullName(firstName: 'John', lastName: 'Doe');
Для конструкторов вы можете использовать this.fieldName, чтобы сообщить Dart, что переданное значение должно быть присвоено свойству.
Contact(this.firstName);
Обработка массивов
Массивы в основном обрабатываются одинаково, но есть несколько отличий, на которые стоит обратить внимание. Ключевым отличием является то, что вы добавляете элемент в массив, вызывая add, а не push.
Dart предоставляет вспомогательные методы first и firstWhere, которые, как вы могли догадаться, возвращают первый элемент в массиве. Менее очевидно, что по умолчанию, если совпадение не найдено, методы выдают ошибку. Вы можете обработать этот случай, указав значение для orElse, которое будет возвращено, если элемент не найден.
Final и Const
На то, чтобы разобраться с эти, у меня ушло какое-то время. Я думаю, что этот пост лучше всего объясняет различия, которые я обнаружил. Ключевое различие между final и const заключается в том, что final описывает переменную, а const описывает само значение. Окончательная переменная может быть установлена только один раз, но значение, на которое она указывает, может быть изменено, значение const заморожено и не может быть изменено.
Еще один хороший совет относительно использования файла Flutter analysis_options — используйте конструкторяы const, где это возможно, при создании виджетов. Это может оказать большое влияние на производительность приложения, позволяя платформе кэшировать виджеты.
Толстая стрелка
«Толстая стрелка» или => может использоваться для однострочных функций. Например, вместо:
someField: () { return true; },
Вы можете написать:
someField: () => true,
Вроде бы небольшая разница, но она определенно может оказать положительное влияние на читаемость кода.
Заключение
Подводя итог, стоит упомянуть еще несколько моментов.
Чтобы преобразовать значение (например) в double, вы можете использовать double.parse или double.tryParse. Первый выдаст ошибку, если не проходит, а второй нет.
Вы можете использовать нулевые операторы (например, contact? .FirstName), чтобы упростить обработку нулевых значений.
Автор: Hillel Coren
Источник: https://medium.com/
Редакция: Команда webformyself.