Giter Club home page Giter Club logo

kmm-arch-petsearch's Introduction

KMM-Arch-PetSearch

PetSearch is an effort to explore and showcase the Kotlin-Multiplatform possibilities.
100% Jetpack Compose, 100% SwiftUI. This project is all about learning.
With that said, author has realised that,
"The more you know, the more you realize you don't know." - Aristotle


Android Screenshots

iOS Screenshots

Project Architecture

PetSearch has blended the following coding practices and techniques to create a flavor of its own.

  • Clean Architecture
  • MVI (Redux inspired)
  • SOLID
  • Feature-wise and Layer-wise Modularized code (Android and Shared)
  • Shared ViewModel with SavedStateHandle (Android and iOS)
  • ViewModel Navigation with args (Android and iOS)

Project Setup

PetFinder Api

  • Generate PetFinder ApiKey and Secret from here.
  • Create apikey.properties in root dir
  • Add the following in properties file
    API_KEY=<YOUR_API_KEY>
    API_SECRET=<YOUR_API_SECRET>
    
  • Run ./gradlew generateBuildKonfig

Android

  • Java 11
  • You require Android Studio Dolphin
  • Install Kmm Plugin. Checkout this setup guide.
  • Create keystore.properties in root dir and add the following lines in the file. Values can be anything as long as you're not generating a signed APK
    STORE_FILE=<YOUR_STORE_FILE>
    STORE_PASSWORD=<YOUR_STORE_PASSWORD>
    KEY_ALIAS=<YOUR_KEY_ALIAS>
    KEY_PASSWORD=<YOUR_KEY_PASSWORD>
    

Opening iOS Project

  • Navigate to ios directory & open .xcworkspace & not .xcodeproj

Code Quality

Tools Check command Fix command
lint ./gradlew lint -
detekt ./gradlew detekt -
ktlint ./gradlew ktlintCheck ./gradlew ktlintFormat
spotless ./gradlew spotlessCheck ./gradlew spotlessApply

Tests

Kotest Plugin doesn't support running common tests in Multiplatform project via green run icons in editor. Only way to run common tests is via Gradle command ./gradlew check


Libraries Used

Android

Kmm - Shared

iOS


Inspiration

Following projects have played a huge role in development of KMM-Arch-PetSearch. I am grateful to authors of projects below for sharing such highly valuable material.


License

MIT license. See the LICENSE file for more information.

kmm-arch-petsearch's People

Contributors

msa1422 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

kmm-arch-petsearch's Issues

Form with validation sample

Hi! First of all I want to thanks for this project I find it very usefull to learn KMM.

I'm doing a project that includes form witch should be validated. At this point I think it is very laborious to event add single field to the form.
For that I need to add two fileds to both *RenderState and *State data classes - one for field value, second for error message. Then update *SateMapper, add new data class for this field as implementation of *Action and then handle it in onNewAction function in *Updater where new field value is validated and then properly handled. It works, but it is also very laborious to do. Do you have any idea how to implement it in a smart way?

Another problem that I'm facing is how to handle data that is not know at the moment? For example database ID, which will be known only after form saves its conent into DB.

Value of type 'MessageDeque' has no member 'invokeNative'

I created sample project like your project. After run ios app in ContentView.swift:
**

Screenshot 1402-02-06 at 13 05 47

**

Value of type 'MessageDeque' has no member 'invokeNative'

shared gradle :

@file:Suppress("DSL_SCOPE_VIOLATION")

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    id("com.android.library")
    kotlin("plugin.serialization").version("1.8.20")
    id("com.google.devtools.ksp").version("1.8.10-1.0.9")
    id("com.rickclephas.kmp.nativecoroutines").version("1.0.0-ALPHA-5")
    id("dev.icerock.mobile.multiplatform-resources").version("0.21.1")
}


kotlin {
    android {
        compilations.all {
            kotlinOptions {
                jvmTarget = "1.8"
            }
        }
    }
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        version = "1.0"
        ios.deploymentTarget = "14.1"
        podfile = project.file("../iosImpFinance/Podfile")
        framework {
            baseName = "sharedImpFinance"

            export("dev.icerock.moko:resources:0.21.1")
            export("dev.icerock.moko:graphics:0.9.0") // toUIColor here
        }
    }
    
    sourceSets {
        val ktorVersion = "2.2.4"
        val commonMain by getting {
            dependencies {
                //core
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")

                //util
                implementation("com.squareup.okio:okio:3.3.0")
                implementation("io.insert-koin:koin-core:3.4.0")
                api("io.github.kuuuurt:multiplatform-paging:0.6.2")
                api("co.touchlab:kermit:1.2.2")
                implementation("com.benasher44:uuid:0.7.0")
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")

                //ktor
                implementation("io.ktor:ktor-client-core:$ktorVersion")
                implementation("io.ktor:ktor-client-logging:$ktorVersion")
                implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
                implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")

                implementation("com.russhwolf:multiplatform-settings:1.0.0")
                implementation("com.russhwolf:multiplatform-settings-coroutines:1.0.0")

                implementation("com.russhwolf:multiplatform-settings-no-arg:1.0.0")

                //resource
                api("dev.icerock.moko:resources:0.21.1")
                //api("dev.icerock.moko:resources-compose:0.20.1") // for compose multiplatform
                //testImplementation("dev.icerock.moko:resources-test:0.21.1")
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
                implementation("io.ktor:ktor-client-android:$ktorVersion")
                implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
                implementation("io.insert-koin:koin-android:3.4.0")
            }
        }
        val androidUnitTest by getting
        val iosX64Main by getting
        val iosArm64Main by getting
        val iosSimulatorArm64Main by getting
        val iosMain by creating {
            dependsOn(commonMain)
            iosX64Main.dependsOn(this)
            iosArm64Main.dependsOn(this)
            iosSimulatorArm64Main.dependsOn(this)

            dependencies {
                implementation("io.ktor:ktor-client-darwin:$ktorVersion")
            }
        }
        val iosX64Test by getting
        val iosArm64Test by getting
        val iosSimulatorArm64Test by getting
        val iosTest by creating {
            dependsOn(commonTest)
            iosX64Test.dependsOn(this)
            iosArm64Test.dependsOn(this)
            iosSimulatorArm64Test.dependsOn(this)
        }
    }
}

android {
    namespace = "---"
    compileSdk = 33
    defaultConfig {
        minSdk = 24
        targetSdk = 33
    }
}


multiplatformResources {
    multiplatformResourcesPackage = "---"
    multiplatformResourcesClassName = "MR"
    disableStaticFrameworkWarning = true
    //multiplatformResourcesVisibility = MRVisibility.Internal // optional, default Public
    //iosBaseLocalizationRegion = "en" // optional, default "en"
    //multiplatformResourcesSourceSet = "commonClientMain"  // optional, default "commonMain"

}

Moko Duplicate resources

Hi I launched your project without any changes on Android Studio Flamingo | 2022.2.1 and it happen that I got this issue:

` Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':petsearch-shared:resources:packageDebugResources'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:142)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:140)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: com.android.build.gradle.tasks.ResourceException: [font/inter_black] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_black.ttf [font/inter_black] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_black.ttf: Error: Duplicate resources
[font/inter_regular] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_regular.ttf [font/inter_regular] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_regular.ttf: Error: Duplicate resources
[font/inter_semibold] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_semibold.ttf [font/inter_semibold] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_semibold.ttf: Error: Duplicate resources
[color/background_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/background_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/surface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/surface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/onSurface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/onSurface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/background_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/background_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/surface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/surface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/onSurface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/onSurface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[string/about] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/about] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/app_name] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/app_name] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/attributes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/attributes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/characteristics] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/characteristics] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/declawed] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/declawed] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/house_trained] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/house_trained] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/loading] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/loading] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/no] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/no] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/spacial_needs] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/spacial_needs] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/spay_neuter] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/spay_neuter] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/vaccinated] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/vaccinated] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/yes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/yes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
at com.android.build.gradle.tasks.MergeResources.doFullTaskAction(MergeResources.kt:294)
at com.android.build.gradle.tasks.MergeResources.doTaskAction(MergeResources.kt:323)
at com.android.build.gradle.internal.tasks.NewIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:69)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
at com.android.build.gradle.internal.tasks.NewIncrementalTask.taskAction(NewIncrementalTask.kt:46)
at jdk.internal.reflect.GeneratedMethodAccessor1080.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:236)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:221)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:204)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:187)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:165)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:124)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:80)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:58)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:181)
at org.gradle.internal.execution.steps.BuildCacheStep.executeAndStoreInCache(BuildCacheStep.java:154)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$4(BuildCacheStep.java:121)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$5(BuildCacheStep.java:121)
at org.gradle.internal.Try$Success.map(Try.java:164)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithCache(BuildCacheStep.java:81)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$0(BuildCacheStep.java:70)
at org.gradle.internal.Either$Left.fold(Either.java:115)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:69)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:47)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:102)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:254)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:91)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:56)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:281)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:139)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: [font/inter_black] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_black.ttf [font/inter_black] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_black.ttf: Error: Duplicate resources
[font/inter_regular] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_regular.ttf [font/inter_regular] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_regular.ttf: Error: Duplicate resources
[font/inter_semibold] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_semibold.ttf [font/inter_semibold] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\font\inter_semibold.ttf: Error: Duplicate resources
[color/background_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/background_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/surface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/surface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/onSurface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/onSurface_light] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/background_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/background_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/surface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/surface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[color/onSurface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml [color/onSurface_dark] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\colors.xml: Error: Duplicate resources
[string/about] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/about] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/app_name] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/app_name] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/attributes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/attributes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/characteristics] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/characteristics] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/declawed] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/declawed] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/house_trained] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/house_trained] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/loading] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/loading] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/no] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/no] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/spacial_needs] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/spacial_needs] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/spay_neuter] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/spay_neuter] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/vaccinated] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/vaccinated] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
[string/yes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml [string/yes] D:\IdeaProjects\KMM-Arch-PetSearch\petsearch-shared\resources\build\generated\moko\androidMain\res\values\multiplatform_strings.xml: Error: Duplicate resources
at com.android.ide.common.resources.DataSet.checkItems(DataSet.java:512)
at com.android.ide.common.resources.DataSet.loadFromFiles(DataSet.java:273)
at com.android.ide.common.resources.DataSet.loadFromFiles(DataSet.java:243)
at com.android.build.gradle.tasks.MergeResources$doFullTaskAction$1$1$1.invoke(MergeResources.kt:244)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
at com.android.build.gradle.tasks.MergeResources.doFullTaskAction(MergeResources.kt:238)
... 125 more

`

I found out that removing those lines

  sourceSets["main"].apply {
        assets.srcDir(File(buildDir, "generated/moko/androidMain/assets"))
        res.srcDir(File(buildDir, "generated/moko/androidMain/res"))
    }

will fix the issue.

obraz

Is this known issue?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.