El objetivo principal de esta biblioteca es tener una definición de clase en su código común que especifique cómo se debe construir el panel de depuración. Usando esta definición, la biblioteca genera:
La lista de datos de vista creada por el caso de uso se puede pasar a un modelo de vista Builtin que maneja las interacciones del usuario. Tiene la opción de usar la interfaz de usuario predeterminada que viene con la biblioteca o construir la suya.
La biblioteca se publica para el repositorio de Mirego Maven, así que asegúrese de tenerla incluida en su bloque Settings.gradle.kts dependencyResolutionManagement .
dependencyResolutionManagement {
repositories {
// ...
maven( " https://s3.amazonaws.com/mirego-maven/public " )
}
}En su archivo build.gradle.kts de nivel superior, agregue la referencia al complemento KSP:
plugins {
// ...
id( " com.google.devtools.ksp " ) version " 1.9.21-1.0.15 " apply false
}En el archivo Build.gradle.kts de su módulo común, agregue la referencia al complemento KSP:
plugins {
// ...
id( " com.google.devtools.ksp " )
} También agregue las dependencias core y annotations junto con el directorio fuente generado por 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 " )
}No olvide exportar la dependencia central al marco iOS:
kotlin {
cocoapods {
framework {
// ...
export( " com.mirego.trikot:viewmodels-declarative-flow:x.y.z " )
export( " com.mirego.debugpanel:core:x.y.z " )
}
}
}También debe agregar la referencia del compilador al bloque de dependencias:
dependencies {
add( " kspCommonMainMetadata " , " com.mirego.debugpanel:compiler:x.y.z " )
} La interfaz de usuario de muestra se resuelve automáticamente desde el módulo común, ya que incluimos la biblioteca con la función api() .
Si tiene algunos problemas con un archivo duplicado META-INF/versions/9/previous-compilation-data.bin durante la compilación, puede agregarlo a los recursos excluidos dentro del archivo build.gradle.kts de la aplicación de Android::
android {
packaging {
resources {
excludes + = listOf (
" META-INF/versions/9/previous-compilation-data.bin "
)
}
}
}Si desea utilizar la UI de muestra en iOS, incluya el Pod en el Podfile de la aplicación:
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
En el módulo de su común, cree una clase con la anotación @debugpanel. Puede encontrar los diferentes componentes disponibles en la tabla a continuación.
@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
) Una vez que se realiza la configuración, puede ejecutar la tarea de Gradle de kspCommonMainMetadata para generar los archivos específicos para su proyecto.
Ahora debería tener MyProjectDebugPanelUseCase.kt , MyProjectDebugPanelUseCaseImpl.kt , MyProjectDebugPanelRepository.kt y MyProjectDebugPanelRepositoryImpl.kt disponible en su classpath.
Todo lo que necesita hacer ahora es instanciar las implementaciones:
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 */ )
)
} Puede controlar la visibilidad de cada componente en el parámetro de componentsVisibility de la función createViewData() .
Ejemplo:
useCase.createViewData(
/* ... */
componentsVisibility = flowOf(
MyProjectDebugPanelComponentsVisibility (
button1 = false ,
button2 = true ,
)
)
) En este caso, button1 se ocultará y button2 será visible.
| Nombre | Tipo de datos persistido | Configuración |
|---|---|---|
| Debugpaneltoggle | Boolean | Valor Boolean inicial |
| Debugpanellabel | - | Flow<String> |
| DebugpanelTextfield | String | Valor String inicial |
| Debugpanelbutton | - | Inicial () -> Unit |
| Desbordante | String | Valor String inicial que representa el identificador de elemento seleccionado |
| Debugpaneldatepicker | Long | Valor Long inicial que representa la época en milisegundos |
| Enumer | String | Valor inicial de enum |
El panel de depuración está configurado utilizando la anotación @DebugPanel(val prefix: String, val packageName: String) .
prefix se incluye en el caso de uso generado y las clases de repositorio.packageName es donde se emitirán los archivos dentro de la carpeta generated . Por defecto, los valores se guardan en la configuración utilizando su nombre de campo como identificador. Sin embargo, este comportamiento puede anularse utilizando la anotación @Identifier(val value: String) .
Por ejemplo, esto es útil en el caso en el que desea reemplazar un antiguo panel de depuración con este y mantener las teclas originales.
Ejemplo:
@Identifier( " PREVIEW_MODE " )
val preview : DebugPanelToggle Por defecto, los componentes se muestran junto a una etiqueta con el nombre del campo como valor. Puede usar la anotación @DisplayName(val value: String) para dar a los componentes una etiqueta más significativa.
Ejemplo:
@DisplayName( " Preview Mode " )
val preview : DebugPanelToggle Puede usar la anotación @DebugProperty(val name: String) para generar un componente que esté vinculado a una propiedad de clase.
Por ejemplo, puede tener un repositorio con una propiedad String o Flow<String> , y colocando la anotación en el campo, la biblioteca generará una propiedad delegada.
Luego puede exponer este campo delegado en la interfaz y la persona que llama recibirá su valor interno o el del panel de depuración (en el caso de que se anule).
Tenga en cuenta que esta anotación solo se puede usar con los tipos: String , Boolean , Enum , Flow<String> , Flow<Boolean> y Flow<Enum> .
Ejemplo:
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
}Llamador:
val repository : Repository = RepositoryImpl ()
repository.value.map {
println ( " Repository value: $it " )
} Esto imprimirá
Repository value: String value o Repository value: Overridden value Dependiendo si Overridden value se ha ingresado dentro del campo de texto generado.
El repositorio generado viene con un método resetSettings() al que puede llamar para borrar los valores del componente persistido. Tenga en cuenta que los modelos de vista del panel de depuración no están vinculados a estos valores, por lo que deberá salir de la pantalla del panel de depuración o matar la aplicación para asegurarse de que los valores se restablezcan correctamente (consulte RootViewModelImpl.kt en la carpeta de aplicación de muestra).
El caso de uso generado y las implementaciones de repositorio tienen el modificador open , lo que significa que puede extenderlos para agregar más funcionalidades si lo necesita.
Si su proyecto tiene una biblioteca de inyección de dependencia como Koin y tiene sus propias clases extendidas, puede anotarlas con @Factory o @Single .
Si no necesita anular estas clases, puede ponerlas manualmente en los módulos de inyección de dependencias.
El panel de depuración es © 2013-2023 Mirego y puede distribuirse libremente bajo la nueva licencia BSD. Vea el archivo LICENSE.md .
Mirego es un equipo de personas apasionadas que creen que el trabajo es un lugar donde puedes innovar y divertirte. Somos un equipo de personas talentosas que imaginan y construyen hermosas aplicaciones web y móviles. Nos unimos para compartir ideas y cambiar el mundo.
También nos encanta el software de código abierto e intentamos retribuir a la comunidad tanto como podamos.