Dart VS Kotlin

 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 т др.