Dart - язык программирования, используемый в основном для написания кроссплатформенных приложений на Flutter.
Kotlin - язык программирования, используемый как в бэкэнде, приложениях, так и, с недавнего времени, вфронтэнде и кросплатформенных приложениях.
После работы с Kotlin Dart кажется совершенно неудобным. Это так и есть. В Dart отсутствует множество стандартных решений, которые присутствуют в остальных языках программирования.
NullSafety
Это первое, что бросается в глаза. В Дарт она появилась посреди уже созданного языка. Из-за чего работает это не совсем корректно и сделано это не совсем удобно.
В качестве сравнение можно посмотреть данное изображение.
В котлине нет тернарного оператора. Вместо этого можно удобным образом работать с nullable значениями. В Дарте же сделано это следующим образом.
Но почему же работает это не совсем корректно?
Здесь реализована DependencyInjection - на котлин и дарт. Мы просто берем класс T и кладем его в список. Первое, что заметно - в котлин класс Т считается nullable. В Dart такого нет. Второе - это то, что даже возвращая nullable тип в Dart DI.find() в CameraHistoryViewModel Repositroy считается не nullable и компилятор не пишет об ошибке. Из-за этого класс CameraHistoryVIewModel отлелит на процессе получения этого класса.
В котлине же эьто предусмотрено и у нас не получится верунть не nullable тип с функции find()
Работа со Iterable
В дарте есть поддержка null-safety, однако нельзя получить из списка getOrNull - для этого придется подключать кастомные сторонние библиотеки. В котлине же любые популярные операции со списками уже существуют.
Работа со Enum
В котлин можно записывать в енумы любые дополнительные классы
В дарте такое делать, разумеется, нельзя. Приходится делать следующие вещи:
Мы пишем Wrapper и через extention получаем его значение.
Впроче, и работа с extension'нами сделана тут неудобно. В котлине мы просто пишем класс и после точки функцию - дарт это неумело скопировал и вот, что вышло.
Динамическая типизация
Дарт заявляет, что у него есть динамическая типизация. Тем не менее, они забыли, что у них есть null-safety и в этой динамической типизации могут оказаться nullable значения
Тем не менее, в котлине мы тоже можем сделать динамическую типизацию с помощью класса Any. Там, кстати, не будут храниться nullable значения, если мы сами этого не укажем.
Из-за динамической типизации в дарте нельзя делать перегрузку функций, что очень сильно усложняет и уменьшает читаемость кода
Паттерн наблюдатель
В дарте есть классы ChangeNotifier и StreamController - их можно использовать для создания аналога LiveData, как в андроид. Разумеется, есть куча сторонних библиотек, таких как GetX, Provider, Riverpod.. Однако они могут давать то, что в принципе и не нужно.
В kotlin-Android с этим всё в порядке - есть официальная библиотека, там есть LiveData, которая поддерживается. Кроме того, если разработчик захочет перейдти на Compose с XML - ему даже не придется менять ViewModel - потому что для LiveData есть расширение, которое превращает ее в State.
Рефлексия и аннотации
В драте присутствует рефлексия, однако она полностью отсутсвует во Flutter - вы не сможете получить значения приватных полей, прочитать packages и их аннотации - всё это буде невозомжно. Придется исползовать кодогенерацию.
Из-за этого и отсутсвует возможность создания нормального аналога ROOM, Retrofit, Dagger т др.