Основная цель этой библиотеки - иметь определение класса в вашем общем коде, в котором указывается, как должна быть создана панель отладки. Используя это определение, библиотека генерирует:
Список данных View, созданный в соответствии с вариантом использования, может быть передан в модель встроенного представления, которая обрабатывает взаимодействие с пользователем. У вас есть выбор либо использовать пользовательский интерфейс по умолчанию, который поставляется с библиотекой, либо создать свой собственный.
Библиотека опубликована в публичном репозитории Mirego Maven, поэтому убедитесь, что у вас есть его включение в ваши dependencyResolutionManagement .
dependencyResolutionManagement {
repositories {
// ...
maven( " https://s3.amazonaws.com/mirego-maven/public " )
}
}В файле вашего верхнего уровня build.gradle.kts добавьте ссылку на плагин KSP:
plugins {
// ...
id( " com.google.devtools.ksp " ) version " 1.9.21-1.0.15 " apply false
}В файл вашего общего модуля build.gradle.kts добавьте ссылку на плагин KSP:
plugins {
// ...
id( " com.google.devtools.ksp " )
} Также добавьте зависимости от core и annotations вместе с каталогом, сгенерированным KSP:
val commonMain by getting {
dependencies {
// ...
api( " com.mirego.trikot:viewmodels-declarative-flow:x.y.z " )
api( " com.mirego.debugpanel:core:x.y.z " )
implementation( " com.mirego.debugpanel:annotations:x.y.z " )
}
kotlin.srcDir( " build/generated/ksp/metadata/commonMain/kotlin " )
}Не забудьте экспортировать основную зависимость в среду iOS:
kotlin {
cocoapods {
framework {
// ...
export( " com.mirego.trikot:viewmodels-declarative-flow:x.y.z " )
export( " com.mirego.debugpanel:core:x.y.z " )
}
}
}Вам также необходимо добавить ссылку компилятора в блок зависимостей:
dependencies {
add( " kspCommonMainMetadata " , " com.mirego.debugpanel:compiler:x.y.z " )
} Образец пользовательского интерфейса разрешается автоматически из общего модуля, поскольку мы включаем библиотеку с функцией api() .
Если у вас есть некоторые проблемы с дублированным файлом META-INF/versions/9/previous-compilation-data.bin во время компиляции, вы можете добавить его в исключенные ресурсы в файле Android App Build.gradle.kts:
android {
packaging {
resources {
excludes + = listOf (
" META-INF/versions/9/previous-compilation-data.bin "
)
}
}
}Если вы хотите использовать пример пользовательского интерфейса на iOS, включите POD в Podfile приложения:
pod 'Trikot/viewmodels.declarative.SwiftUI.flow', :git => '[email protected]:mirego/trikot.git', :tag => 'x.y.z', :inhibit_warnings => true
pod 'DebugPanel', :git => '[email protected]:mirego/debug-panel.git', :tag => 'x.y.z', :inhibit_warnings => true
В модуле вашего Common создайте класс с аннотацией @debugpanel. Вы можете найти различные компоненты, которые доступны в таблице ниже.
@DebugPanel(prefix = " MyProject " , packageName = " com.myproject.app.generated " )
data class DebugPanelConfig (
val toggle : DebugPanelToggle ,
val label : DebugPanelLabel ,
val textField : DebugPanelTextField ,
val button : DebugPanelButton ,
val picker : DebugPanelPicker ,
val datePicker : DebugPanelDatePicker ,
val enumPicker : SomeEnum
) После того, как конфигурация будет выполнена, вы можете запустить задачу kspCommonMainMetadata Gradle, чтобы создать конкретные файлы для вашего проекта.
Теперь вы должны иметь MyProjectDebugPanelUseCase.kt , MyProjectDebugPanelUseCaseImpl.kt , MyProjectDebugPanelRepository.kt и MyProjectDebugPanelRepositoryImpl.kt доступны в вашем классе.
Все, что вам нужно сделать сейчас, это создавать реализации:
private val repository : MyProjectDebugPanelRepository = MyProjectDebugPanelRepositoryImpl ()
private val useCase : MyProjectDebugPanelUseCase = MyProjectDebugPanelUseCaseImpl (repository)
/* ... */
class ParentViewModelImpl (
coroutineScope : CoroutineScope ,
useCase : MyProjectDebugPanelUseCase
) : ParentViewModel, VMDViewModelImpl(coroutineScope) {
override val debugPanel = DebugPanelViewModelImpl (
coroutineScope,
useCase,
useCase.createViewData( /* Configure the components here */ )
)
} Вы можете управлять видимостью каждого компонентов в параметре componentsVisibility функции createViewData() .
Пример:
useCase.createViewData(
/* ... */
componentsVisibility = flowOf(
MyProjectDebugPanelComponentsVisibility (
button1 = false ,
button2 = true ,
)
)
) В этом случае button1 будет скрыта, а button2 будет видна.
| Имя | Сохранился тип данных | Конфигурация |
|---|---|---|
| DELAGPANELTOGGLE | Boolean | Начальное Boolean значение |
| DebugPanellabel | - | Flow<String> |
| DebugPanelTextfield | String | Начальное значение String |
| Debugpanelbutton | - | Initial () -> Unit |
| DebuugPanelPicker | String | Начальное значение String , представляющее идентификатор выбранного элемента |
| DebugPanelDatePicker | Long | Начальное Long значение, представляющее эпоху в миллисекундах |
| Перевозить | String | Начальное значение перечисления |
Панель отладки настроена с использованием аннотации @DebugPanel(val prefix: String, val packageName: String) .
prefix включен в сгенерированный вариант использования и классы репозитория.packageName - это то место, где файлы будут выходить внутри generated папки. По умолчанию значения сохраняются в настройках, используя имя их поля в качестве идентификатора. Однако это поведение может быть переопределено с использованием аннотации @Identifier(val value: String) .
Для Exemple это полезно в случае, когда вы хотели бы заменить старую панель отладки на это и сохранить оригинальные ключи.
Пример:
@Identifier( " PREVIEW_MODE " )
val preview : DebugPanelToggle По умолчанию компоненты отображаются рядом с меткой с именем поля в качестве значения. Вы можете использовать аннотацию @DisplayName(val value: String) чтобы дать компонентам более значимую метку.
Пример:
@DisplayName( " Preview Mode " )
val preview : DebugPanelToggle Вы можете использовать аннотацию @DebugProperty(val name: String) для создания компонента, который связан с свойством класса.
Например, вы можете иметь репозиторий со свойством String или Flow<String> , и, поместив аннотацию в поле, библиотека генерирует свойство делегата.
Затем вы можете разоблачить это поле делегата в интерфейсе, и абонент либо получит ваше внутреннее значение, либо из панели отладки (в случае, когда оно переопределено).
Обратите внимание, что эта аннотация может использоваться только с типами: String , Boolean , Enum , Flow<String> , Flow<Boolean> и Flow<Enum> .
Пример:
Repository.kt
interface Repository {
val value : Flow < String >
} RepositoryImpl.kt
class RepositoryImpl : Repository {
@Identifier( " custom_value_identifier " )
@DebugProperty( " value " )
val internalValue = flowOf( " String value " )
override val value by RepositoryImplValueDelegate
}Вызывающий абонент:
val repository : Repository = RepositoryImpl ()
repository.value.map {
println ( " Repository value: $it " )
} Это либо печатает
Repository value: String value или Repository value: Overridden value в зависимости от того, если Overridden value вводилось в сгенерированном текстовом поле.
Сгенерированный репозиторий поставляется с методом resetSettings() , который вы можете вызвать, чтобы очистить сохраняемые значения компонентов. Пожалуйста, имейте в виду, что модели представления панели отладки не связаны с этими значениями, поэтому вам нужно будет либо выйти из экрана панели отладки, либо убить приложение, чтобы убедиться, что значения сброшены правильно (см. RootViewModelImpl.kt в примере папки приложения).
Сгенерированный вариант использования и реализации репозитория имеют open модификатор, что означает, что вы можете расширить их, чтобы добавить больше функциональных возможностей, если вам нужно.
Если в вашем проекте есть библиотека инъекций зависимости, такая как Koin, и у вас есть свои расширенные классы, вы можете аннотировать их либо @Factory , либо @Single .
Если вам не нужно переопределять эти классы, вы можете просто поместить их вручную в модули инъекций зависимостей.
Панель отладки-© 2013-2023 Mirego и может свободно распределяться по новой лицензии BSD. Смотрите файл LICENSE.md .
Mirego - это команда страстных людей, которые считают, что работа - это место, где вы можете вводить новшества и веселиться. Мы команда талантливых людей, которые воображают и создают красивые веб -и мобильные приложения. Мы собираемся вместе, чтобы поделиться идеями и изменить мир.
Мы также любим программное обеспечение с открытым исходным кодом и стараемся вернуть сообществу столько, сколько можем.