Rules changed
Ошибка на миллиард долларов, реализация паттерна Dependency Injection и интеграция анимаций из After Effects — вот повестка сегодняшнего дайджеста. Присаживайтесь поудобнее, наливайте горячий напиток и приступайте к чтению!
Null safety
1965 год. Сэр Чарльз Энтони Ричард Хоар не устоял перед соблазном добавить нулевые ссылки в разрабатываемый им ALGOL W и тем самым открыл ящик Пандоры. Спустя 44 года в своём докладе на QCon в Лондоне он назовёт это «ошибкой на миллиард долларов». Это не преувеличение и не бравада. Если посчитать, сколько суммарно денег было потрачено на исправление ошибок связанных с нулевыми ссылками, вероятно значение будет в несколько раз больше.
Dart с версии 2.12 декларировал поддержку защиты от непреднамеренного доступа к установленным в null переменным. Её надо было явным образом указывать в pubspec.yaml. Это позволяло предотвратить потенциальные ошибки в рантайме. Но вместе с этим были и механизмы игнорирования этой защиты и запуска кода без null safety. Увы, но некоторые разработчики активно этим пользовались.
В этом году выйдет третья версия языка, в которой защита будет включена всегда, без возможности отключения. Этот шаг станет важнейшим этапом, чтобы называть Dart полностью null safety языком. TypeScript, C# и Kotlin по разным причинам не могут этим похвастаться. С Dart 3 мы будем точно знать, когда переменная не может иметь значение null, а значит появится возможность оптимизации текущей кодовой базы.
Некоторые из гигантов автомобильной промышленности, такие как BMW AG, уже отреагировали на это нововведение. Так, приложение MyBMW, созданное тремя сотнями разработчиков, уже переработано, хотя это и потребовало значительных усилий. Теперь кодовая база меньше подвержена ошибкам.
DI без фигни
Паттерн Dependency injection (DI) крут, но его объяснение на разных ресурсах оставляет желать лучшего. Авторы статей пускаются в пространные объяснения и это усложняет понимание простой, на самом деле, вещи. На просторах Medium есть старая, но прекрасная статья. Вот пара примеров кода, которые объясняют DI за пять минут:
class Car {
private Wheel wheel = Wheel()
drive() {
wheel.spin()
}
}
Отличный класс, казалось бы, никаких нареканий нет. Но давайте подумаем — можем ли мы вместо колеса поставить mock и протестировать машину изолированно? А что если есть пластиковое и металлическое колесо — получается, что в таком коде мы не можем их поменять местами, не затрагивая сам автомобиль. А вот альтернативная реализация того же кода с DI:
class Car() {
// database instance
final Wheel _wheel;
// Constructor
Car(this._wheel);
drive() {
wheel.spin()
}
}
Автомобилю теперь не надо заботиться, чтобы было установлено конкретное колесо. Он лишь сообщает, что у него есть место для установки колеса. А уж какое оно будет — его не касается.
Flutter имеет два серьезных нюанса, которые усложняют применение DI. Первый — если в Dart можно использовать dart:mirrors, то для Flutter эта библиотека недоступна. Это сделано, потому что производительность сильно упадёт, а применяемые методы оптимизации не смогут с этим справиться. Второй — виджеты по своей природе представляют собой вложенные сущности. Спускать зависимости через множество уровней вниз по дереву зачастую бессмысленно.
В качестве примера можно упомянуть библиотеку Inject. Она уже не поддерживается, но хорошо демонстрирует, как преодолеть оба этих нюанса. Сейчас же для генерации DI стоит использовать библиотеку injectable.
Анимация с Lottie
Давно закончились времена, когда сайты были наполнены Flash-анимацией. В начале миллениума существовал тренд на мигающие баннеры, прыгающие кнопки и даже целые мультфильмы. Разработчики Flash замахнулись не просто на некий способ создания анимации и доставки сжатого видеоконтента. Они пытались сделать из него платформу создания интерактивных веб-сайтов без оглядки на существующие стандарты. Но этому не суждено было сбыться, а дыры в безопасности и появление HTML5 забили длинный гвоздь в крышку гроба.
В итоге Flash окончательно умер, а сама потребность в анимации никуда не делась. Просто теперь она приняла другую форму и стала создаваться иначе. Теперь анимации создают в таких приложениях, как Adobe After Effects. Но штатные возможности этого пакета не предусматривают экспорт в HTML. Проблема легко решается расширением Bodymovin, и на выходе мы получаем JSON с необходимой анимацией.
Теперь можно добавить её в Flutter-приложение при помощи библиотеки Lottie. Это неофициальная доработка аналогичной библиотеки Lottie-android, разрабатываемой и поддерживаемой Airbnb. Вот самый простой способ, как с помощью неё загрузить JSON с анимацией и включить бесконечное воспроизведение:
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView(
children: [
// Load a Lottie file from your assets
Lottie.asset('assets/LottieLogo1.json'),
// Load a Lottie file from a remote url
Lottie.network(
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/A.json'),
// Load an animation and its images from a zip file
Lottie.asset('assets/lottiefiles/angel.zip'),
],
),
),
);
}
}
Если указать кастомный AnimationController, появляется возможность полностью контролировать процесс воспроизведения. Но меньше слов и больше дела — вот тут есть примеры встраивания самых разных анимаций из After Effects.
Митапы
Flutter Meetup
17 мая 2023
Год только начался, а у нас уже запланирован Flutter Meetup, который пройдёт 17 мая 2023. Программа мероприятия формируется, но регистрация уже открыта. Кстати, вы уже можете подать доклад прямо в режиме онлайн.
Интересуетесь нашими мероприятиями? В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи прошедших митапов. Тем для кого выступать в новинку, мы оказываем всяческую поддержку и помогаем оформить экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.
Вакансии
Evrone
Мы открыты для новых Flutter-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.