В этом уроке разобрано как можно использовать в своих проектах moko библиотеки и вносить в них изменения.
Для работы потребуется:
xcode-select --install
);Для начала склонируем какой-либо проект с moko библиотеками. Например - moko-template. Его не требуется донастраивать, можно просто склонировать и сразу запускать.
git clone https://github.com/icerockdev/moko-template.git
Далее убедимся что проект корректно компилируется.
pod install
в дирректории ios-app
, а после завершения открываем ios-app.xcworkspace
и жмем Run.После этого определяем какую библиотеку будем модифицировать. Для примера выберем moko-mvvm
и в качестве цели модификации выберем "добавить в LiveData вывод в лог информацию о добавлении нового observable и о удалении". Так как в приложении уже есть использование вьюмоделей и лайвдат - мы сможем легко проверить реализацию.
Для внесения изменений в библиотеку потребуется:
После открытия проекта через Android Studio
внесем нужные изменения в библиотеку. Для этого в модуле mvvm
нужно будет внести изменения для android и iOS реализаций LiveData:
Находим файл src/androidMain/kotlin/dev/icerock/moko/mvvm/livedata/LiveData.kt
. Обновляем код:
actual fun addObserver(observer: (T) -> Unit) {
println("livedata $this addObserver $observer")
val archObserver = Observer<T> { value ->
if (value is T) observer(value)
}
observers[observer] = archObserver
archLiveData.observeForever(archObserver)
}
actual fun removeObserver(observer: (T) -> Unit) {
println("livedata $this removeObserver $observer")
val archObserver = observers.remove(observer) ?: return
archLiveData.removeObserver(archObserver)
}
Находим файл src/iosMain/kotlin/dev/icerock/moko/mvvm/livedata/LiveData.kt
. Обновляем код:
actual fun addObserver(observer: (T) -> Unit) {
println("livedata $this addObserver $observer")
observer(value)
observers.add(observer)
}
actual fun removeObserver(observer: (T) -> Unit) {
println("livedata $this removeObserver $observer")
observers.remove(observer)
}
Теперь, когда изменения в библиотеку внесены, нужно опубликовать эти изменения. Для проверки корректности мы можем опубликовать изменения локально, в mavenLocal
. Для этого нужно вызвать gradle task :mvvm:publishToMavenLocal
. Подсказка о том как развернуть локально moko библиотеку указана в разделе Set Up Locally в README.
После успешного завершения задачи мы можем использовать опубликованную версию библиотеки в других проектах на данном локальном хосте.
Для подключения библиотеки из локального maven нужно внести изменения в конфигурацию проекта: root build.gradle.kts
allprojects {
repositories {
mavenLocal() // <-- добавляем эту строку, она означает что сначала нужно искать зависимости в локальном репозитории
google()
jcenter()
maven { url = uri("https://kotlin.bintray.com/kotlin") }
maven { url = uri("https://kotlin.bintray.com/kotlinx") }
maven { url = uri("https://dl.bintray.com/icerockdev/moko") }
maven { url = uri("https://kotlin.bintray.com/ktor") }
maven { url = uri("https://dl.bintray.com/aakira/maven") }
}
// workaround for https://youtrack.jetbrains.com/issue/KT-27170
configurations.create("compileClasspath")
}
После добавления mavenLocal
репозитория можно выполнять компиляцию проекта и мы увидим что теперь в логи пишутся сообщения, добавленные нами в moko-mvvm
.