easyCodeRu
easyCodeRu
  • 190
  • 340 110
Android Compose TDD: практика для новичков: задача номер 1 Hello World! ZeroToHeroAndroidTDD N30
Как стать андроид разработчиком? Решая реальные задачи на практике! В этом нам поможет TDD: задачи в виде юай тестов. Написал код, запустил тест: все правильно если тест прошел. Проще некуда!
Бесплатный курс для новичков (и не только) на Compose!
весь плейлист курса
th-cam.com/play/PLQRyeBV1rkk19C0IydNk-OMTRQi18katz.html
Репозиторий на гитхаб
github.com/JohnnySC/ZeroToHeroAndroidTDD
Вся информация в телеграм канале
t.me/easyCodeRu
По всем вопросам пишите в телеграм
t.me/JohnnySC
มุมมอง: 42

วีดีโอ

Лучший курс по Android! Содержание. Как пройдет курс: шаг за шагом. Старт 1 августа! Стань экспертом
มุมมอง 82716 ชั่วโมงที่ผ่านมา
1 августа старт нового крутого курса "С 0 в эксперты Андроид". Чему вы научитесь, какие приобретете навыки, шаг за шагом от новичка к эксперту разработки в андроид. Мой гитхаб github.com/johnnysc Вся информация в телеграм канале t.me/easyCodeRu По всем вопросам пишите в телеграм t.me/JohnnySC
MediaService, MotionLayout Music App Демонстрация музыкального приложения со второго интенсива
มุมมอง 426วันที่ผ่านมา
Чему можно научиться за 3 месяца если учиться по 5 дней в неделю и по 5 часов в онлайне в группе из 5 человек? Да почти что всему необходимому: MVVM, TDD, Ui-Test Espresso, Retrofit2, Room, Foreground service. Хочешь научиться разработке андроид? Записывайся на новый курс! Старт 1 августа th-cam.com/video/u0ExUEYQrdw/w-d-xo.html Соц.сеть за 4 недели на первом интенсиве th-cam.com/video/sX7cZWsT...
Как обойти множественное наследование в Kotlin и Java. Агрегация и композиция
มุมมอง 66521 วันที่ผ่านมา
Предположим нужно наследоваться от многих абстрактных классов в котлин или в джаве. Как можно решить эту задачу? Давайте посмотрим на агрегацию и композицию телеграм канал t.me/easyCodeRu
Новый курс с 1 августа! С 0 в эксперты андроид разработки. TDD, MVVM, Clean architecture, Compose
มุมมอง 749หลายเดือนก่อน
1 августа стартует новый курс который включит в себя все теоретические знания из курса 999 и всю практику из интенсива. Курс будет длиться минимум полгода и как максимум год. Курс для новичков любого уровня, также подойдет и опытным кто хочет подтянуть знания и навыки в андроид разработке. Kotlin для детей, курс с нуля th-cam.com/play/PLQRyeBV1rkk0EDuIl1TvUEBlUPSeTm0GZ.html Курс по андроид разр...
UiTest Espresso Page objects TDD День 2. Мой новый проект CustomView ViewModel MVVM Retrofit Room
มุมมอง 445หลายเดือนก่อน
плейлист th-cam.com/play/PLQRyeBV1rkk1y3aBLd8fxDkoKjiDr0-tU.html Первая серия th-cam.com/video/Wgjy16IPNzA/w-d-xo.html Следите за этим проектом в телеграмм канале! t.me/easyCodeRu
Мой новый проект CustomView ViewModel MVVM Retrofit Room TDD UiTest Espresso
มุมมอง 972หลายเดือนก่อน
Решил начать новый проект используя новый подход с кастомвью и вьюмодельками. Итеративный подход к разработке приложения: сначала я сделаю одну фичу, после буду добавлять новые и так как буду придерживаться ООП то так я проверю расширяемость написанного кода. Плейлист этого проекта th-cam.com/play/PLQRyeBV1rkk1y3aBLd8fxDkoKjiDr0-tU.html Следите за этим проектом в телеграмм канале! t.me/easyCodeRu
Кодревью опенсорс проекта или как выглядят 10 лет тех.долга
มุมมอง 2.3K2 หลายเดือนก่อน
Вчера в телеграм канале я спросил подписчиков какое паблик видео они хотят чтоб я сделал и мне прислали ссылку на опенсорс проект и пожелание покодревьюить. И вот что из этого вышло. ссылка на проект github.com/HabitRPG/habitica-android мой гитхаб аккаунт github.com/johnnysc Ссылка на телеграм канал t.me/easyCodeRu
extension Fun DRY
มุมมอง 5132 หลายเดือนก่อน
extension Fun DRY
Юай тест в многомодульном проекте и хилт: что это зачем и как делать? Hilt + Espresso + MultiModule
มุมมอง 4922 หลายเดือนก่อน
Исходники на гитхабе github.com/JohnnySC/AnimeQuote Первая часть: Многомодульность th-cam.com/video/imYS8YWG4H8/w-d-xo.html Вторая часть: добавляем Hilt th-cam.com/video/SpEKFKa-byM/w-d-xo.html Третья часть: мапинг данных между модулями th-cam.com/video/HP4lXrhp-ug/w-d-xo.html Ссылка на телеграм канал t.me/easyCodeRu Курс по андроид для детей th-cam.com/play/PLQRyeBV1rkk19C0IydNk-OMTRQi18katz.html
Kotlin с нуля: Курс для детей. Серия 2: Read Line
มุมมอง 1.2K3 หลายเดือนก่อน
Плейлист этого курса th-cam.com/play/PLQRyeBV1rkk0EDuIl1TvUEBlUPSeTm0GZ.html Официальный сайт языка Котлин kotlinlang.org Ссылка на телеграм канал t.me/easyCodeRu Курс по андроид для детей th-cam.com/play/PLQRyeBV1rkk19C0IydNk-OMTRQi18katz.html Гарвардский курс по основам программирования CS50 на русском th-cam.com/play/PLawfWYMUziZqyUL5QDLVbe3j5BKWj42E5.html таймкоды 0:00 Recap (ранее в сериал...
Соц.сеть за 4 недели на интенсиве. Демонстрация приложения. Firebase Realtime Database Android App
มุมมอง 6803 หลายเดือนก่อน
На интенсиве за последние 4 недели группа новичков написала проект аля соц.сеть с некоторым количеством фичей. В этом видео демонстрируется работа некоторых из них. Записывайтесь на вторую группу интенсива! Старт 22 апреля! (или позже) Ссылка на телеграм канал t.me/easyCodeRu Личка в телеграме: t.me/JohnnySC первый день интенсива: как прошел th-cam.com/video/Nmf228GDIWY/w-d-xo.html что под капо...
Kotlin с нуля: Курс для детей. Серия 1: Hello World!
มุมมอง 2.6K3 หลายเดือนก่อน
Плейлист этого курса th-cam.com/play/PLQRyeBV1rkk0EDuIl1TvUEBlUPSeTm0GZ.html Официальный сайт языка Котлин kotlinlang.org Ссылка на телеграм канал t.me/easyCodeRu Курс по андроид для детей th-cam.com/play/PLQRyeBV1rkk19C0IydNk-OMTRQi18katz.html Гарвардский курс по основам программирования CS50 на русском th-cam.com/play/PLawfWYMUziZqyUL5QDLVbe3j5BKWj42E5.html таймкоды 01:09 Почему Котлин 5:48 П...
Интенсив, итоги первой группы за 3 месяца. Фидбек участников
มุมมอง 4393 หลายเดือนก่อน
15 января 2024 года мы начали интенсив : 5 дней в неделю по 5 часов подряд заниматься андроид разработкой на протяжении 3 месяцев. Какие у нас итоги? Сделано 7 проектов, 1 соц.сеть на файрйбейз, изучена база по андроид, архитектура MVVM, многомодульность, Room, Retrofit2, корутины, Espresso, UiTests TDD, Junit4, Hilt, Jetpack WorkManager, CustomView, process recreate, fragmentManager Вторая гру...
Spannable TextView Clickable and Bold. Check your English level Android App in 1 hour
มุมมอง 6353 หลายเดือนก่อน
Как выделить участок текста внутри TextView? А как сделать участки текста кликабельным? А самое главное зачем это все делать? Показываю на простом примере теста на знание английского языка. Бесплатный курс по андроид с нуля для детей th-cam.com/play/PLQRyeBV1rkk19C0IydNk-OMTRQi18katz.html github.com/JohnnySC/ZeroToHeroAndroidTDD Телеграм канал t.me/easyCodeRu
Соц.сеть за 5 дней?! Firebase realtime database Android app. Интенсив, день 50-ый.
มุมมอง 4164 หลายเดือนก่อน
Соц.сеть за 5 дней?! Firebase realtime database Android app. Интенсив, день 50-ый.
Мапим данные из domain в ui модуль в многомодульном проекте. Дженерик типизированный маппер.
มุมมอง 9584 หลายเดือนก่อน
Мапим данные из domain в ui модуль в многомодульном проекте. Дженерик типизированный маппер.
Hilt в многомодульный проект. Пособие по внедрению зависимостей для новичков. DI Inject dependencies
มุมมอง 1.7K5 หลายเดือนก่อน
Hilt в многомодульный проект. Пособие по внедрению зависимостей для новичков. DI Inject dependencies
Многомодульность: что это такое? Объяснение для новичков. MVVM Retrofit Git. Чистая архитектура
มุมมอง 2.4K5 หลายเดือนก่อน
Многомодульность: что это такое? Объяснение для новичков. MVVM Retrofit Git. Чистая архитектура
Многомодульность для юай тестов. Эксперимент! Android Espresso MultiModule application.
มุมมอง 3995 หลายเดือนก่อน
Многомодульность для юай тестов. Эксперимент! Android Espresso MultiModule application.
Джуниоры за 18 дней? Первичные итоги с андроид интенсива
มุมมอง 7605 หลายเดือนก่อน
Джуниоры за 18 дней? Первичные итоги с андроид интенсива
Compose Navigation Codelab проходим кодлаб от гугла по навигации в компоуз
มุมมอง 9796 หลายเดือนก่อน
Compose Navigation Codelab проходим кодлаб от гугла по навигации в компоуз
Первый день интенсива - 5 часов подряд!. Как прошло и что было. UI-Tests, Espresso, XML, GIT
มุมมอง 7206 หลายเดือนก่อน
Первый день интенсива - 5 часов подряд!. Как прошло и что было. UI-Tests, Espresso, XML, GIT
Из 1С в Андроид разработчики? Кодревью кода на котлин. Тесты есть, но и от багов это не избавило
มุมมอง 1.9K6 หลายเดือนก่อน
Из 1С в Андроид разработчики? Кодревью кода на котлин. Тесты есть, но и от багов это не избавило
TDD реальная история внедрения в проект. Почему вам тоже нужно переходить на TDD в 2024 году
มุมมอง 8407 หลายเดือนก่อน
TDD реальная история внедрения в проект. Почему вам тоже нужно переходить на TDD в 2024 году
Итоги 2023 года: 240 видео за год, старт курса 999 и многое другое!
มุมมอง 5597 หลายเดือนก่อน
Итоги 2023 года: 240 видео за год, старт курса 999 и многое другое!
Android интенсив: анонс на 2024 год. Научись PRO разработке андроид в группе со мной онлайн
มุมมอง 8897 หลายเดือนก่อน
Android интенсив: анонс на 2024 год. Научись PRO разработке андроид в группе со мной онлайн
ROOM 1-to-many MVVM TDD CRUD ZeroToHeroAndroidTDD Task029
มุมมอง 5817 หลายเดือนก่อน
ROOM 1-to-many MVVM TDD CRUD ZeroToHeroAndroidTDD Task029
ROOM CRUD TDD Android MVVM ZeroToHeroAndroidTDD Task 28 курс для новичков
มุมมอง 4978 หลายเดือนก่อน
ROOM CRUD TDD Android MVVM ZeroToHeroAndroidTDD Task 28 курс для новичков
Room Tests Android MVVM Delete And Read by ID ZeroToHeroAndroidTDD Task027 Курс для новичков
มุมมอง 4078 หลายเดือนก่อน
Room Tests Android MVVM Delete And Read by ID ZeroToHeroAndroidTDD Task027 Курс для новичков

ความคิดเห็น

  • @Tolgetmen
    @Tolgetmen 6 นาทีที่ผ่านมา

    Оп, а вот и Compose уже

  • @user-wr2sm3zl8v
    @user-wr2sm3zl8v 25 นาทีที่ผ่านมา

    Топ контент

  • @Android-for-little-and-stupid
    @Android-for-little-and-stupid 5 วันที่ผ่านมา

    @easycode с минимальными знаниями java\kotlin не стоит лезть?

    • @easyCodeRu
      @easyCodeRu 5 วันที่ผ่านมา

      да почему же: можно! на первых порах можно будет подтянуть котлин и когда уже будет активный кодинг то будет нестрашно. курс же для новичков

  • @mancy_cry_9148
    @mancy_cry_9148 6 วันที่ผ่านมา

    Это. Просто. Охеренно!

  • @danilkyrgyzbaev1438
    @danilkyrgyzbaev1438 6 วันที่ผ่านมา

    крутой чел

  • @easyCodeRu
    @easyCodeRu 6 วันที่ผ่านมา

    Кстати забыл сказать что одному из участников я подарю макбук!

  • @ligorni
    @ligorni 6 วันที่ผ่านมา

    Цена?

    • @easyCodeRu
      @easyCodeRu 6 วันที่ผ่านมา

      в телеграм t.me/JohnnySC

    • @user-tb4nb7pg8e
      @user-tb4nb7pg8e 6 วันที่ผ่านมา

      @@easyCodeRu Как интересно. Реклама здесь, а ценник узнать в телеге.🤣🤣 Что за тайна🤔? Здесь ответь. Не пользуюсь телегой

    • @easyCodeRu
      @easyCodeRu 6 วันที่ผ่านมา

      Придётся пользоваться телеграмом потому что оттуда будет доступ к видео из курса.

  • @kinohometv1985
    @kinohometv1985 12 วันที่ผ่านมา

    Наконец то компоуз🎉

    • @easyCodeRu
      @easyCodeRu 12 วันที่ผ่านมา

      Видео опубликовано 12 февраля 2024 года))

  • @leojoshiro
    @leojoshiro 12 วันที่ผ่านมา

    лучше не бывает все по полочкам, 100 из 10 я свое решение все таки оставлю, в видео тоже самое и лучшее, понятное и более компактное решение, но в моем понимании если есть вьюшка значит у нее есть хоть одно состояние минимум, а подход со (UiState)стейтом можно расширить в будушем но это уже вне задачи, все таки можно решать с разнымы подходами class MainActivity : AppCompatActivity() { private var uiState: UiState = UiState.Init private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) if (savedInstanceState == null) { update() } binding.actionButton.setOnClickListener { val text = binding.inputEditText.text.toString() if (text.trim().isEmpty()) { return@setOnClickListener } uiState = UiState.CreateTextToList(text) update() } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val textList = ArrayList<String>() binding.contentLayout.children.forEach { view -> (view as? TextView)?.text?.let { text -> textList.add(text.toString()) } } uiState = UiState.Save(textList) outState.putSerializable(KEY, uiState) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) (savedInstanceState.getSerializable(KEY) as? UiState)?.let { uiState = it update() } } private fun update() { uiState.apply( binding.inputEditText, binding.actionButton, binding.contentLayout ) } companion object { private const val KEY = "uiStateKey" } } interface UiState : Serializable { fun apply(textInputEditText: TextInputEditText, button: Button, linearLayout: LinearLayout) interface Abstract { fun restore(linearLayout: LinearLayout, text: String) } abstract class Base : Abstract, UiState { override fun restore(linearLayout: LinearLayout, text: String) { val textView = TextView(linearLayout.context) textView.text = text linearLayout.addView(textView) } } object Init : Base() { override fun apply(textInputEditText: TextInputEditText, button: Button, linearLayout: LinearLayout) { textInputEditText.setText("") linearLayout.removeAllViews() } } data class CreateTextToList( private val text: String, ) : Base() { override fun apply(textInputEditText: TextInputEditText, button: Button, linearLayout: LinearLayout) { textInputEditText.setText("") restore(linearLayout, text) } } data class Save( val textList: ArrayList<String>, ) : Base() { override fun apply(textInputEditText: TextInputEditText, button: Button, linearLayout: LinearLayout) { textList.forEach { text -> restore(linearLayout, text) } } } }

  • @leojoshiro
    @leojoshiro 13 วันที่ผ่านมา

    мое неболтшре решение class MainActivity : AppCompatActivity() { private var uiState: UiState = UiState.Init("Hello World!") private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) if (savedInstanceState == null) { updateUiState() } binding.inputEditText.doAfterTextChanged { val text = it.toString() if (text.isEmpty()) { return@doAfterTextChanged } uiState = UiState.ChangeInputEditText(text) updateUiState() } binding.actionButton.setOnClickListener { val text = binding.inputEditText.text.toString() uiState = UiState.SaveTextToTextView(text) updateUiState() } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putSerializable(UI_STATE_KEY, uiState) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { savedInstanceState.getSerializable(UI_STATE_KEY, UiState::class.java)?.let { uiState: UiState -> this.uiState = uiState } } else { (savedInstanceState.getSerializable(UI_STATE_KEY) as? UiState)?.let { uiState: UiState -> this.uiState = uiState } } updateUiState() } private fun updateUiState() { uiState.apply( binding.titleTextView, binding.inputEditText, binding.actionButton ) } companion object { private const val UI_STATE_KEY = "uiStateKey" } } interface UiState : Serializable { fun apply(textView: TextView, inputEditText: TextInputEditText, button: Button) data class Init(private val text: String) : UiState { override fun apply(textView: TextView, inputEditText: TextInputEditText, button: Button) { inputEditText.setText("") textView.text = "Hello World!" button.isEnabled = false } } data class ChangeInputEditText(private val text: String) : UiState { override fun apply(textView: TextView, inputEditText: TextInputEditText, button: Button) { button.isEnabled = text == "min" } } data class SaveTextToTextView(private val text: String) : UiState { override fun apply(textView: TextView, inputEditText: TextInputEditText, button: Button) { inputEditText.setText("") textView.text = text button.isEnabled = false } } }

  • @alexeytushnolob4845
    @alexeytushnolob4845 13 วันที่ผ่านมา

    собеседника погромче бы, слишком тихо слышно. Проект интересный

    • @easyCodeRu
      @easyCodeRu 13 วันที่ผ่านมา

      Спасибо! Казалось что со звуком все ок

  • @pavlo_herasymchuk
    @pavlo_herasymchuk 13 วันที่ผ่านมา

    Так интересно когда сам написал практически тоже самое, но сделал wrapper для bundle, adapter абстрактным классом с дефолтной реализацией, как и viewholder, так же делал публичные методы через интерфейсы, а не просто написал в классе. Правда незнаю пока зачем сколько абстраций, но пусть будут

    • @easyCodeRu
      @easyCodeRu 13 วันที่ผ่านมา

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

  • @user-wr2sm3zl8v
    @user-wr2sm3zl8v 13 วันที่ผ่านมา

    Проект очень интересный

  • @user-mk9cs8pj6c
    @user-mk9cs8pj6c 13 วันที่ผ่านมา

    спасибо за видео, как всегда полезно и интересно!)

    • @easyCodeRu
      @easyCodeRu 13 วันที่ผ่านมา

      спасибо за комент! участвуй в новом курсе!

    • @user-wr2sm3zl8v
      @user-wr2sm3zl8v 13 วันที่ผ่านมา

      Топ контент

  • @leojoshiro
    @leojoshiro 14 วันที่ผ่านมา

    мне подход с этим UiState'ом понравился и решаю все задачаи с таким походом и onSave и onRstore, все круто пока что, теперь надо успеть до 30 до нового курса class MainActivity : AppCompatActivity() { private var uiState: UiState = UiState.Init override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val progressBar = findViewById<ProgressBar>(R.id.progressBar) val actionButton = findViewById<Button>(R.id.actionButton) val textView = findViewById<TextView>(R.id.titleTextView) uiState.apply(textView, actionButton, progressBar) actionButton.setOnClickListener { uiState = UiState.Loading uiState.apply(textView, actionButton, progressBar) it.postDelayed({ uiState = UiState.Loaded uiState.apply(textView, actionButton, progressBar) }, 3000) } } } interface UiState : Serializable { fun apply(textView: TextView, button: Button, progressBar: ProgressBar) object Init : UiState { override fun apply(textView: TextView, button: Button, progressBar: ProgressBar) { textView.isVisible = false button.isEnabled = true progressBar.isVisible = false } } object Loading : UiState { override fun apply(textView: TextView, button: Button, progressBar: ProgressBar) { textView.isVisible = false button.isEnabled = false progressBar.isVisible = true } } object Loaded : UiState { override fun apply(textView: TextView, button: Button, progressBar: ProgressBar) { textView.isVisible = true button.isEnabled = true progressBar.isVisible = false } } }

    • @easyCodeRu
      @easyCodeRu 14 วันที่ผ่านมา

      да не обязательно успевать до 1 августа все проходить, даже после старта нового курса будет время пройти все

  • @motorInlive
    @motorInlive 16 วันที่ผ่านมา

    Спасибо большое за труды))

  • @aliaksandrbohush5257
    @aliaksandrbohush5257 17 วันที่ผ่านมา

    Это видео можно было прекрасно закончить объяснением, что такое делегаты в Котлин и сократить получившегося спаггети монстра. Кстати, почему именно фасад? Фасад же, вроде бы прячет, набор методов за собой и для потребителя предоставляет более упрощенное АПИ.

    • @easyCodeRu
      @easyCodeRu 16 วันที่ผ่านมา

      Самый интересный вопрос века: почему люди которые знают как лучше сделать не делают этого?

    • @aliaksandrbohush5257
      @aliaksandrbohush5257 16 วันที่ผ่านมา

      @@easyCodeRu Ролик хороший, интересный

  • @sonar_devices
    @sonar_devices 18 วันที่ผ่านมา

    Прикольная идея

  • @kotlin-compose-tutorials
    @kotlin-compose-tutorials 19 วันที่ผ่านมา

    Первый учитель прогаоммиоования, который применяет TDD в процессе обучения) Браво!

    • @easyCodeRu
      @easyCodeRu 19 วันที่ผ่านมา

      А где в этом видео TDD ?))

  • @PneumaGun
    @PneumaGun 20 วันที่ผ่านมา

    Спасибо Вам большое за такое видео! Как раз нахожусь в ситуации "не могу не" и тут такой классный материал попался

    • @easyCodeRu
      @easyCodeRu 20 วันที่ผ่านมา

      Ещё больше информации в телеграмм канале t.me/easyCodeRu

  • @dream_line70
    @dream_line70 25 วันที่ผ่านมา

    Апостроф это ) 56:01

    • @easyCodeRu
      @easyCodeRu 25 วันที่ผ่านมา

      В нужный момент забываешь даже такие слова! Спасибо!

  • @ivantitov9353
    @ivantitov9353 25 วันที่ผ่านมา

    А если допустим у нас будет 2 абстрактные ViewModels. То будет ли нормальной практикой в конструктор третьей ViewModel принимать 2 предыдущие ViewModel? Каким образом лучше создавать такую ViewModel? ViewModelProvider.Factory должна создавать 2 другие viewModels и передавать их в конструктор для создания третьей? Также было бы интересно посмотреть на подобную реализацию (viewModel in viewModel) с использованием DI библиотеки по типу Hilt.

    • @easyCodeRu
      @easyCodeRu 25 วันที่ผ่านมา

      кстати я использую такой подход в своем самом свежем проекте: назвал это вм как фасад над другими вм. По хилту не скажу сейчас, но скорей всего можно. Конкретно с абстрактными вьюмодельками думаю стоит порефакторить чуток чтоб уйти от наследования гугловой вм

  • @leojoshiro
    @leojoshiro 25 วันที่ผ่านมา

    Хотелось бы увидеть 3день CustomView+MVVM, если можно конечно до новогого курса

    • @easyCodeRu
      @easyCodeRu 25 วันที่ผ่านมา

      а что там такого интересного?

    • @leojoshiro
      @leojoshiro 25 วันที่ผ่านมา

      @@easyCodeRu там все интересно

    • @easyCodeRu
      @easyCodeRu 25 วันที่ผ่านมา

      Бери премиум доступ тогда)

  • @pavlo_herasymchuk
    @pavlo_herasymchuk 25 วันที่ผ่านมา

    Думал что тут будут какие-то фокусы с дженериками, но в итоге пришли к тому, что юзаем интерфейсы. Хоть и знал такое решение, но возможно другим будет полезно, опять таки приятно что бесплатно . Хотя не уверен что везде подойдёт это решение.

    • @easyCodeRu
      @easyCodeRu 25 วันที่ผ่านมา

      не вижу случая чтоб кому либо не подходило такое простое решение

  • @pavlo_herasymchuk
    @pavlo_herasymchuk 26 วันที่ผ่านมา

    Задача легкая, но думаю что сам тест неправильный, если предполагалось что юзер должен ввести минимум 3 любых символа. Ведь я в коде могу проверять не длину строки, а является ли введенная строка "min". Ну а так спасибо за бесплатный контент

    • @pavlo_herasymchuk
      @pavlo_herasymchuk 26 วันที่ผ่านมา

      Увидел что кто-то в комментариях уже писал по этому поводу

    • @easyCodeRu
      @easyCodeRu 26 วันที่ผ่านมา

      тест не неправильный, а простой) в более "душном" варианте должно было быть так : коллекция из стрингов и для каждой из них тест проходит и еще одна коллекция стрингов (менее 3 символов) где тест не проходит

  • @Slava-Osipov
    @Slava-Osipov 27 วันที่ผ่านมา

    It was so useful, ty

  • @user-rw8zs7vz9u
    @user-rw8zs7vz9u 29 วันที่ผ่านมา

    Есть ли препроммотр какой то части уроков, чтобы оценить подачу, продолжительность уроков, программу курса и прочие интересующие моменты?

    • @easyCodeRu
      @easyCodeRu 29 วันที่ผ่านมา

      Для этого курса все видео будут сделаны новые. Сейчас на канале есть почти 190 паблик видео и по ним можно примерно понять подачу. Программа курса изложена в телеграм канале, продолжительность объявлена в самом видео (короткие новые видео плюс старые длинные). По всем остальным вопросам велкам в телеграм @easyCodeRu

  • @daishu1
    @daishu1 หลายเดือนก่อน

    Очень интересное и полезное видео, спасибо

  • @leviynn
    @leviynn หลายเดือนก่อน

    Мощно, мощно однако

  • @tomvenom
    @tomvenom หลายเดือนก่อน

    какая цена? (дорого ли ? )

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      в телеграмм. Но нет, не дороже и даже близко не столько сколько нынче просят "популярные" курсы

  • @fliker2309
    @fliker2309 หลายเดือนก่อน

    Вот и эфир!

  • @leviynn
    @leviynn หลายเดือนก่อน

    Жду не дождусь эфира 🙌

  • @kadehar
    @kadehar หลายเดือนก่อน

    Было бы очень интересно ещё увидеть реализацию Screenplay pattern (где у нас есть Actor, который может выполнять некий Action) в качестве альтернативы Page Objects от тебя. Думаю, для UI тестов в Android на Kotlin получилось бы интересно (видел только для Web тестов в одной из библиотек для Java подобное).

  • @martinborns
    @martinborns หลายเดือนก่อน

    Интересно было посмотреть!

  • @leojoshiro
    @leojoshiro หลายเดือนก่อน

    у тебя невероятный опыт, круто

  • @user-rw8zs7vz9u
    @user-rw8zs7vz9u หลายเดือนก่อน

    Это не многомодульность, это чистая архитектура с 3 пакетами. По отдельности они не будут собираться

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Во что должен собираться отдельно дата модуль?

    • @user-rw8zs7vz9u
      @user-rw8zs7vz9u หลายเดือนก่อน

      @@easyCodeRu ни во что, потому что это не модуль а пакет, а ты преподносишь это как многомодульность

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Хм. А я думал что нажимая создать новый модуль создаётся новый модуль

    • @user-rw8zs7vz9u
      @user-rw8zs7vz9u หลายเดือนก่อน

      @@easyCodeRu почему ты думаешь что ты создаёшь модуль? То что говоришь про data, domain, presentation это все пакеты, они так и создаются new package

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      посмотри пожалуйста еще раз внимательно, я же нажимаю создать модуль, а не пакет : make new module

  • @xdoshik
    @xdoshik หลายเดือนก่อน

    Знаю шарп и, как я считал, почти выучил Котлин на базовом уровне. Осталось выполнить все пункты из видео...

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      сложное позади!

  • @morakdim5927
    @morakdim5927 หลายเดือนก่อน

    Ооо, попадался мне как-то vaio в руки. Дрова на него ставить - это отдельный был квест😂

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Охотно верю Сам настрадался с ним

  • @cockswell9076
    @cockswell9076 หลายเดือนก่อน

    Extension fun не превращается в статик. Он превращается в статик, в случае если екстеншн написан в файле кт, в твоем случае это будет просто протектед функция

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      экстеншн это статика и неважно какой модификатор доступа написан же: точно так же как и в джава можно писать статики с видимостью private и другое

    • @cockswell9076
      @cockswell9076 หลายเดือนก่อน

      Попробуй декомпильнуть свой код, там должна быть обычная функция, экстеншн - это по факту сахар, а на самом деле он выглядит как обычная функция с аргментом(тем что мы расширяем). Я сейчас не имею возможности декомпильнуть код, т.к у меня только телефон. Но насколько я помню, классовый экстеншн при декомпиле дает обычную функцию, а статик функция появляется только если она за классом ​@@easyCodeRu

  • @dmitry_tsyvtsyn
    @dmitry_tsyvtsyn หลายเดือนก่อน

    Привет, у меня есть прикольный проект с самописной навигацией на вьюхах и нетривиальной кастомной вьюшкой, думаю круто было бы разобрать этот репозиторий DmitryTsyvtsyn / AlgoSortingAnimations

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Алго в названии репо: насторожило

    • @dmitry_tsyvtsyn
      @dmitry_tsyvtsyn หลายเดือนก่อน

      @@easyCodeRu сокращение от Algorithms

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      неожиданно! а я думал Алголь

  • @max96169
    @max96169 หลายเดือนก่อน

    Мне кажется или easyCodeRu во всех своих видео нарушает принципы KISS и YAGNI?

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Да

    • @max96169
      @max96169 หลายเดือนก่อน

      @@easyCodeRu Ну тогда это смело)

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Да

  • @karamba6936
    @karamba6936 หลายเดือนก่อน

    Если нигде не отображаются все цитаты, а только избранные, то не надо отмечать их сердечком. Уместнее было бы поставить там крестик как знак удаления из списка.

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      ну на главном экране сердечко пустое сначала после уже заполненное. и если я юзаю эту иконку, то почему бы и не на экране избранных. Почему не крестик, потому что юзер может убрать из избранных и если передумал вернуть

  • @karamba6936
    @karamba6936 หลายเดือนก่อน

    А зачем для выбора языка интернет?

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      у апи дипла есть список всех языков на которые можно переводить, я не буду хардкодить список руками, а получу его ручкой

  • @user-ve1kl5er3v
    @user-ve1kl5er3v หลายเดือนก่อน

    Спасибо за видео! Всё максимально понятно и интересно. Про DiffUtil понравилось. Правда меня раздражает, что ui тест падает если текст в item будет не маленьким и все элементы не влезут на экран, заходя за клавиатуру, ну или просто экран не большой. Тогда тест падает с ошибкой: "java.lang.NullPointerException at ru.easycode.zerotoheroandroidtdd.RecyclerViewMatcher$atPosition$1.matchesSafely(RecyclerViewMatcher.kt:47) at ru.easycode.zerotoheroandroidtdd.RecyclerViewMatcher$atPosition$1.matchesSafely(RecyclerViewMatcher.kt:11)" Код такой же, если сделать текст меньше или взять эмулятор с дисплеем побольше, то всё нормально проходит. Это довольно подбешивает, так как не понятно что не так, ведь код в порядке. В связи с этим вопрос. Как нужно писать ui тесты, чтобы подобного не происходило? Ведь если придерживаться подхода tdd с ui и unit тестами на проде и прогонять их на пайплайне, он будет падать, просто потому что ему так захочется, хотя функционал работает верно. То есть это будет не верным показателем работоспособности. Ещё интересно, почему не используешь ListAdapter? Там вроде меньше кода писать, а суть +- одна

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Надо изучить проблему просто Разобраться в чем суть ошибки и все. Вроде как надо чтобы ширина была match_parent

  • @vitalijuskolinko9011
    @vitalijuskolinko9011 หลายเดือนก่อน

    Спасибо за видео! Такого говнокода я ещё не видел в своей жизни ))) Мне хватило увидеть что творится в MainActivity и частично в ViewModel'e, и я понял, что нет смысла тратить больше времени и смотреть полностью видео до конца как ты разносишь В Пух и прах этот говнокод ))) Откуда у тебя столько терпения? :D

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      да в принципе ты прав. Мне сегодня достаточно посмотреть на 1 вьюмодельку чтоб понять что все плохо в коде. А терпение: не знаю, я же работаю с людьми, без него никуда

  • @dmitriyobidin6049
    @dmitriyobidin6049 หลายเดือนก่อน

    Интересно, если в Ниссане есть android tech lead, а есть ли там ios tech lead? :)

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      автомотив на андроид, так что скорей всего нет

  • @karamba6936
    @karamba6936 หลายเดือนก่อน

    а у меня в логах эта линия со смертью процесса не появляется. Кстати еще savedstatehandle есть.

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Перепроверить нужно количество фоновых процессов. Используй эмулятор

  • @SanyaNapalm
    @SanyaNapalm หลายเดือนก่อน

    Я про фриззтекст узнал из твоих уроков относительно недавно. В основном, при изучении Андроида, в обучающих роликах говорится типа "при повороте у эдиттекст есть полезная особенность, он сохраняет набранный текст". Кстати, эту особенность нельзя отключить. Это видно из кода в видео, да и я взял и поробовал вставить в едитекст android:freezesText="false"... не отключается.

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      а ты попробуй отнаследоваться и там переопределить

    • @SanyaNapalm
      @SanyaNapalm หลายเดือนก่อน

      @@easyCodeRu попробовал, не получилось. Теперь переопределенный едиттекст не сохраняет текст при ни при каких условиях. Я и переопределял, метод getFreezesText() и оставлял как есть... не сохраняет

  • @user-dc8us2ci4n
    @user-dc8us2ci4n หลายเดือนก่อน

    Контент полезный, но братух, окей? от этих слов паразитов да желание слушать дальше мгновенно пропадает, окей? Так и хочется сказать нет б… не окей, окей? Да?

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      Есть у меня такая штука как интенсив где на протяжении 5 часов я объясняю как писать код. И чтобы понимать что ребята понимают меня я время от времени спрашиваю типа : все ясно? Вот тут вот так, ок? Так что, братух, не держи зла, окей?

  • @karamba6936
    @karamba6936 หลายเดือนก่อน

    11:58 У него там isValid в тру в начале валидатора скидывается. У него процедурное мышление, он не понимает как живут экземпляры класса во времени и хранят состояние.

    • @easyCodeRu
      @easyCodeRu หลายเดือนก่อน

      все так, все так