You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AppCode позволяет разрабатывать и Kotlin и Swift код одновременно. [Видео с демонстрацией](https://www.youtube.com/watch?v=ELfcPdWP_CY)
26
-
27
23
## Конфликты имен на iOS
28
24
29
25
- В iOS у всех объектов есть поле `description` (работает также как Kotlin `toString`) и поэтому при использовании в Kotlin свойств с таким названием будет появляться в iOS дополнительное поле `_description` - которое и будет свойством от Kotlin
-`trySend` же возвращает `Boolean`: `true` - если добавить новое значение удалось, `false` - если не удается добавить из-за превышения объема буфера значений. Это значит что если в очереди уже есть какие-то события, которые не успел получить UI, то новое просто будет утерено. Поэтому всегда следует использовать `send`.
362
362
363
363
## Дополнительно
364
-
Для работы с событиями и состояниями у нас в компании используются возможности библиотеки [moko-mvvm](https://github.com/icerockdev/moko-mvvm). С ее помощью происходят привязки, как односторонняя, так и двусторонняя. Событиями занимается класс EventsDispatcher.
364
+
Для работы с событиями и состояниями у нас в компании используются возможности библиотеки [moko-mvvm](https://github.com/icerockdev/moko-mvvm). С ее помощью происходят привязки, как односторонняя, так и двусторонняя.
365
+
366
+
Ранее событиями занимался класс EventsDispatcher. Подход с использованием EventsDispatcher считается устаревшим и в новых проектах мы его не используем. Ниже справочная информация на случай, если встретитесь с ним.
367
+
368
+
`EventDispatcher` - это класс с одной единственной задачей - гарантировать доставку события и вызов его обработчика на UI, после сигнала от `ViewModel`.
369
+
370
+
Во `ViewModel` объявляется интерфейс с методами, реализация которых ей нужна на платформе, например, метод для перехода на какой-нибудь экран:
371
+
372
+
```kotlin
373
+
interfaceEventsListener {
374
+
funrouteToMainPage()
375
+
}
376
+
```
377
+
378
+
Далее, все что остается сделать, чтобы вызвать событие на `UI` - это получить во `ViewModel` объект `eventsDispatcher` и, когда пора переходить на главный экран, послать платформе это событие простым вызовом метода:
За счет интерфейса обе платформы знают, какой набор действий должны поддерживать.
438
+
Если во `ViewModel` нужно будет добавить еще одно событие, и мы забудем реализовать его на какой-нибудь из платформ, компилятор выделит, что отсутствует реализация метода интерфейса.
439
+
440
+
:::warning
441
+
442
+
В `dispatchEvent` нельзя передавать лямбду из общего кода, например, для установки действия по кнопке в [AlertDialog](https://developer.android.com/reference/android/app/AlertDialog). Нельзя этого делать потому, что на Android мы не сможем ее никуда сохранить, поэтому при пересоздании экрана она пропадет.
443
+
Если вам нужно установить чему-либо на платформе действие - делайте соответствующий метод во `ViewModel`.
Copy file name to clipboardExpand all lines: onboarding/moko.md
+14-5Lines changed: 14 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,10 +4,19 @@ sidebar_position: 5
4
4
5
5
# MOKO библиотеки
6
6
7
+
MOKO - это разработанные в компании мультиплатформенные open-source библиотеки, которые позволяют нам решать типовые задачи проще и быстрее.
7
8
Все наши проекты строятся с использованием библиотек MOKO, поэтому нужно поближе познакомиться с MOKO библиотеками.
8
9
9
-
- Материалы [о MOKO в целом](../learning/libraries/moko)
10
-
- Материалы [о MOKO resources](../learning/libraries/moko/moko-resources)
11
-
- Материалы [о MOKO MVVM](../learning/libraries/moko/moko-mvvm)
12
-
- Материалы [о MOKO units](../learning/libraries/moko/moko-units)
13
-
- Материалы [о MOKO paging](../learning/libraries/moko/moko-paging)
10
+
В каждом репозитории MOKO-библиотеки находятся:
11
+
-`README` с инструкцией по подключению и описанием использования библиотеки
12
+
-`sample-проект` с практическим применением библиотеки. Вы можете склонировать себе репозиторий библиотеки и запустить `sample-app`
13
+
-`Issues` - список обнаруженных ошибок в работе библиотеки, а также предложения по обновлению библиотеки. Если вы заметите ошибку в работе какой-либо MOKO-библиотеки или у вас есть предложение по изменению существующей - зафиксируйте свои мысли в `issue`
14
+
15
+
Посмотрите обзорную презентацию из материалов [о MOKO в целом](../learning/libraries/moko).
- использованием классов-оберток [CFlow и CStateFlow](https://kmm.icerock.dev/university/icerock-basics/mvvm#flow-c-moko-kswift) из [MOKO MVVM](../learning/libraries/moko/moko-mvvm)
20
+
- использованием [mvvm-state](https://kmm.icerock.dev/university/lists/moko-paging#moko-mvvm-state) из MOKO MVVM
21
+
- зачем нужна библиотека [МОКО Network](https://kmm.icerock.dev/learning/libraries/moko/moko-network)
22
+
- видео [о MOKO paging](https://kmm.icerock.dev/learning/libraries/moko/moko-paging), конкретные примеры текущего применения стоит смотреть в текущих проектах.
- `androidMain` - директория, содержащая файл `AndroidManifest.xml`, в котором объявляется идентификатор (уникальный!) для модуля `mpp-library` для Android-приложения;
574
+
- `androidMain` - директория, содержащая платформенный di модуль. Ранее в проектах здесь находился файл `AndroidManifest.xml`, в котором объявлялся уникальный идентификатор для модуля `mpp-library` для Android-приложения. В новых проектах этого файла нет, т.к. id сейчас прописывается в рамках build.gradle.kts модуля;
575
575
- `api` - директория, содержащая файл для генерации методов взаимодействия с API;
576
576
- директория `commonMain` содержит директорию `kotlin`, в которой как раз и пишется вся бизнес-логика приложения; в директории `resources` находятся ресурсы, попавшие в проект через [moko-resources](https://github.com/icerockdev/moko-resources);
577
577
- `commonTest` - директория, в которой находится исходный код тестов для общей библиотеки;
Copy file name to clipboardExpand all lines: university/1-android-basics/app-logic.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -44,4 +44,4 @@ CodeLab [Get data from the internet](https://developer.android.com/codelabs/basi
44
44
45
45
Разные классы приложения должны между собой связываться. Чтобы связанность классов не стала слишком жесткой, что усложнит поддержку кода, используют паттерн Dependency Injection.
46
46
47
-
Подробнее позволит разобраться статья [Dependency Injection](https://developer.android.com/training/dependency-injection) и CodeLab [Using Hilt in your Android app](https://developer.android.com/codelabs/android-hilt).
47
+
Подробнее позволит разобраться статья [Dependency Injection](https://developer.android.com/training/dependency-injection) и [Koin in Android app tutorial](https://insert-koin.io/docs/quickstart/android/).
Copy file name to clipboardExpand all lines: university/1-android-basics/user-interface.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -110,6 +110,10 @@ sidebar_position: 4
110
110
111
111
А также многое про удобство можно прочитать на сайте [material.io](https://material.io/design) - разделы Interaction и Communication очень детально и наглядно объясняют как можно создавать комфортное использование приложения. Многие принципы применимы не только на android, но и на любой системе с UI.
112
112
113
+
## Изменения конфигурации
114
+
115
+
Некоторые конфигурации мобильных устройств могут измениться во время работы приложения. Это могут быть, например, ориентация экрана при повороте устройства пользователем, увеличение пользователем размера шрифта, смена локализации, смена темного режима на светлый и наоборот. В процессе создания приложения нужно помнить о необходимости обработки изменений конфигурации. Прочитайте [документацию Google](https://developer.android.com/guide/topics/resources/runtime-changes) про обработку смены конфигурации.
116
+
113
117
## Practice time
114
118
115
119
Сделать приложение по [дизайну](https://www.figma.com/file/07E2agIcfVsAZBMoq91ccL/android-ui-education).
@@ -123,3 +127,4 @@ sidebar_position: 4
123
127
1. На фрагменте `ContactsFragment` расположить `RecyclerView` отрисовывающий множество элементов - разные контакты
124
128
1. На фрагменте `ContactFragment` с помощью `ConstraintLayout` сверстать UI экрана просмотра контакта
125
129
1. С помощью Android Navigation Component сделать переходы между списком и просмотром контакта
130
+
1. Удостовериться в том, что приложение корректно обрабатывает смену конфигурации: локализации, темы, ориентации экрана, увеличение шрифта
Copy file name to clipboardExpand all lines: university/3-kotlin-multiplatform-mobile/kmm-intro.md
+7-6Lines changed: 7 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,20 +2,21 @@
2
2
sidebar_position: 0
3
3
---
4
4
5
-
# Введение в KMM
5
+
# Введение в KMP
6
6
7
-
Kotlin Multiplatform Mobile - это технология, позволяющая использовать единую базу кода для бизнес-логики приложений. Для каждой платформы код нужно писать только там, где это необходимо, например, для реализации пользовательского интерфейса или при работе с API конкретной платформы.
7
+
Kotlin Multiplatform - это технология, позволяющая использовать единую базу кода для бизнес-логики приложений. Для каждой платформы код нужно писать только там, где это необходимо, например, для реализации пользовательского интерфейса или при работе с API конкретной платформы.
8
8
9
9
После прохождения этого раздела вы узнаете следующее
10
-
- Для чего нужен Kotlin Multiplatform Mobile
10
+
- Для чего нужен Kotlin Multiplatform
11
11
- Что такое `expect/actual`
12
12
- Работа с сетью используя Ktor
13
13
- Сериализация данных при помощи Kotlin Serialization
14
-
- Как настроить gradle для работы с KMM
14
+
- Как настроить gradle для работы с KMP
15
15
- Что такое multiplatform-settings и как их использовать
16
+
- Как использовать библиотеку Koin для внедрения зависимостей в KMP
16
17
- Что такое multiplatform библиотеки и их отличия от других библиотек
17
-
- Где искать и как выбирать kmm библиотеки
18
+
- Где искать и как выбирать KMP библиотеки
18
19
19
20
:::info
20
21
Если вы уже знакомы со всем этим, можете переходить к [практическому заданию](practice)
[Koin](https://github.com/InsertKoinIO/koin) - это мультиплатформенная библиотека для внедрения зависимостей.<br/>Ранее в разделе Основы разработки Android приложений в Логике приложений/Dependency Injection вы уже проходили тьюториал по подключению Koin в Android.
8
+
9
+
[Официальная документация Koin](https://insert-koin.io), к ней следует обращаться за поиском информации по конкретному вопросу.
10
+
11
+
Рекомендуем ознакомиться со следующими разделами:
12
+
1. Раздел Setup
13
+
1. Раздел Core&Tests
14
+
1. Раздел Android
15
+
1.[Раздел Dependency Injection in Ktor](https://insert-koin.io/docs/reference/koin-ktor/ktor)
16
+
17
+
## Практическое задание
18
+
Выполните действия по тьюториалу [Koin для KMP Dependency Injection](https://insert-koin.io/docs/reference/koin-mp/kmp).
0 commit comments