На чем писал до Dart?

Ответ

До перехода на Flutter и Dart я в основном занимался нативной Android-разработкой на Kotlin и немного кросс-платформенной разработкой на React Native (JavaScript/TypeScript).

Мой опыт с Kotlin:

// Пример работы с корутинами для асинхронности в Android
class UserRepository(private val apiService: ApiService) {
    suspend fun fetchUser(userId: String): Result<User> = withContext(Dispatchers.IO) {
        try {
            val response = apiService.getUser(userId)
            Result.success(response.toDomain())
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
}

Почему я выбрал Flutter/Dart:

  1. Единая кодовая база: После опыта с React Native я оценил более стабильную и производительную кодовую базу Flutter.
  2. Сходство с Kotlin: Dart, особенно с включенным null safety, показался мне очень похожим на Kotlin по выразительности и строгости типов, что упростило переход.
  3. UI как код: Подход Flutter, где интерфейс полностью описывается кодом (в отличие от XML-разметки в Android), дал мне больше контроля и предсказуемости в отрисовке.
  4. Горячая перезагрузка (Hot Reload): Скорость разработки UI в Flutter несравнимо выше, чем в нативной Android-разработке.

Ответ 18+ 🔞

Да ты посмотри, какой у нас тут профиль подъехал! Ну что ж, рассказывай, как жизнь кидала с одного фреймворка на другой.

Раньше-то я, можно сказать, в нативном болоте сидел, на Kotlin под Android ковырялся. Чистый, годный такой код, всё по-взрослому. А потом, блядь, решил глянуть, что там за трава зеленее на стороне кросс-платформы — зацепился за React Native на JavaScript/TypeScript. Ну, знаешь, как обычно: попробовал, плюнул, потому что на каждом шагу сюрпризы, как будто ходишь по охуенно тонкому льду — то треснет, то провалишься.

Вот смотри, как я раньше на Котлине асинхронность эту самую, блядь, организовывал, через корутины:

// Пример работы с корутинами для асинхронности в Android
class UserRepository(private val apiService: ApiService) {
    suspend fun fetchUser(userId: String): Result<User> = withContext(Dispatchers.IO) {
        try {
            val response = apiService.getUser(userId)
            Result.success(response.toDomain())
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
}

Красота же, ёпта! Всё чётко, строго, ошибки ловятся. Но потом пришёл Flutter, и я, сука, сам от себя охуел, насколько всё заходит проще.

Ну а почему я в итоге на Flutter с Dart подсел, рассказываю:

  1. Одна кодовая база на всё. После этих плясок с бубном в React Native, где доверия, блядь, ноль к стабильности, Flutter показался мне тихой гаванью. Написал один раз — и оно реально работает на двух платформах, а не прикидывается.
  2. Дарт — это ж брат-близнец Котлина! Я, когда начал писать, волнение, блядь, почувствовал — такой родной синтаксис. Null safety включил — и вообще красота, та же строгость и выразительность. Переход был как перелезть через низкий забор, а не через стену с колючкой.
  3. UI как код — это пизда рулю. Ты меня пойми: после этих вечных танцев с XML-разметкой в Android, где ты в трёх файлах правки вносишь, чтобы кнопку подвинуть, подход Flutter — просто песня. Всё в одном месте, всё контролируешь, всё предсказуемо. Никаких сюрпризов.
  4. Горячая перезагрузка (Hot Reload). Вот это, блядь, главный кайф! В нативной разработке, чтобы поменять отступ и посмотреть, надо было ждать сборку целую вечность, терпения, блядь, ноль. А тут — хук-бабах, сохранил файл, и интерфейс обновился за секунду. Скорость прототипирования просто овердохуищная.

Короче, пересел и не жалею. Как будто с раздолбанной "девятки" пересел на новую машину — и едет лучше, и багов меньше, и кайфа больше.