I was developing an KotlinMultiplatform App which implement diferents libraries as NavigationComponent, ktor to networks call, and slqDelight to store local data.
So the error I'm getting in the tag is the following:
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: java.lang.RuntimeException: Exception inflating com.jshvarts.kmp.android:navigation/nav_graph line 23
Caused by: java.lang.IllegalArgumentException: com.jshvarts.kmp.model.UnsplashPhoto is not Serializable or Parcelable.
Regarding this line is the argument which I'd like to pass between screens:
nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name="com.jshvarts.kmp.android.home.HomeFragment"
android:label="HomeFragment"
tools:layout="@layout/home_fragment">
<action
android:id="@+id/action_navigate_from_home_to_detail"
app:destination="@+id/detailFragment">
</action>
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name="com.jshvarts.kmp.android.detail.DetailFragment"
android:label="DetailFragment"
tools:layout="@layout/fragment_detail">
<argument
android:name="photo"
app:argType="com.jshvarts.kmp.model.UnsplashPhoto"
/>
</fragment>
</navigation>
And regarding my model class:
UnsplashPhoto.kt
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UnsplashPhoto(
@SerialName("id") val id: String?,
@SerialName("description") var description: String?,
@SerialName("urls") val urls: UnsplashPhotoUrls,
@SerialName("user") val user: UnsplashUser
)
@Serializable
data class UnsplashPhotoUrls(
@SerialName("raw") val raw: String,
@SerialName("full") val full: String,
@SerialName("regular") val regular: String,
@SerialName("small") val small: String,
@SerialName("thumb") val thumb: String
)
private val defaultUsername = "username"
@Serializable
data class UnsplashUser(
@SerialName("name") val name: String,
@SerialName("username") val username: String = defaultUsername,
@SerialName("attributionUrl") val attributionUrl:String = "https://unsplash.com/$defaultUsername?utm_source=ImageSearchApp&utm_medium=referral"
)
and finally my build.gradle.kts files of shared, android, and proyect module:
build.gradle.kts(androidApp)
plugins {
//kotlin(multiplatform)
id("com.android.application")
kotlin("android")
kotlin("kapt")
id("kotlinx-serialization")
id("androidx.navigation.safeargs.kotlin")
}
android {
compileSdkVersion(Versions.compileSdk)
compileOptions{
sourceCompatibility = org.gradle.api.JavaVersion.VERSION_1_8
targetCompatibility = org.gradle.api.JavaVersion.VERSION_1_8
}
kotlinOptions{
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
kapt{
generateStubs = true
correctErrorTypes = true
}
buildFeatures{
dataBinding = true
viewBinding = true
}
defaultConfig {
applicationId = "com.jshvarts.kmp.android"
minSdkVersion(Versions.minSdk)
targetSdkVersion(Versions.targetSdk)
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
packagingOptions {
exclude("META-INF/*.kotlin_module")
}
}
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(kotlin("stdlib-jdk8", Versions.kotlin))
implementation(Coroutines.android)
implementation(AndroidX.appCompat)
implementation(AndroidX.constraintLayout)
implementation(AndroidX.recyclerView)
implementation(AndroidX.lifecycleExtensions)
implementation(AndroidX.lifecycleViewModelKtx)
implementation(material)
implementation(AndroidX.swipeToRefreshLayout)
implementation(timber)
implementation(picasso)
implementation(AndroidX.navigation)
implementation(AndroidX.navigation_ui)
implementation(Serialization.runtime)
//Dependency for googlePay
implementation("com.google.android.gms:play-services-wallet:16.0.1")
kapt(databinding)
implementation(glide){
exclude( "com.android.support")
}
kapt(glide)
implementation(project(":shared"))
}
build.gradle.kts(shared)
plugins {
id("com.android.library")
kotlin("multiplatform")
id("kotlinx-serialization")
id("org.jetbrains.kotlin.native.cocoapods")
id("com.squareup.sqldelight")
}
// CocoaPods requires the podspec to have a version.
version = "1.0"
android {
compileSdkVersion(Versions.compileSdk)
buildToolsVersion(Versions.androidBuildTools)
defaultConfig {
minSdkVersion(Versions.minSdk)
targetSdkVersion(Versions.targetSdk)
versionCode = 1
versionName = "1.0"
}
}
version = "1.0"
dependencies {
implementation("com.google.firebase:firebase-crashlytics-buildtools:2.8.1")
}
kotlin {
targets {
val sdkName: String? = System.getenv("SDK_NAME")
val isiOSDevice = sdkName.orEmpty().startsWith("iphoneos")
if (isiOSDevice) {
iosArm64("iOS")
} else {
iosX64("iOS")
}
android()
}
cocoapods {
// Configure fields required by CocoaPods.
summary = "Description for a Kotlin/Native module"
homepage = "Link to a Kotlin/Native module homepage"
}
sourceSets {
all {
languageSettings.apply {
useExperimentalAnnotation("kotlinx.coroutines.ExperimentalCoroutinesApi")
}
}
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
implementation(Coroutines.Core.core)
implementation(Ktor.Core.common)
implementation(Ktor.Json.common)
implementation(Ktor.Logging.common)
implementation(Ktor.Serialization.common)
implementation(SqlDelight.runtime)
implementation(Serialization.runtime)
//implementation("org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlin}")
//implementation("org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlin}")
//implementation ("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1")
}
}
val commonTest by getting {
dependencies {
implementation(Ktor.Mock.jvm)
}
}
val androidMain by getting {
dependencies {
implementation(kotlin("stdlib"))
implementation(Coroutines.Core.core)
implementation(Ktor.android)
implementation(Ktor.Core.jvm)
implementation(Ktor.Json.jvm)
implementation(Ktor.Logging.jvm)
implementation(Ktor.Logging.slf4j)
implementation(Ktor.Mock.jvm)
implementation(Ktor.Serialization.jvm)
implementation(Serialization.runtime)
implementation(SqlDelight.android)
}
}
val androidTest by getting {
dependencies {
implementation(kotlin("test-junit"))
implementation(Ktor.Mock.common)
}
}
val iOSMain by getting {
dependencies {
implementation(Coroutines.Core.core)
implementation(Ktor.ios)
implementation(Ktor.Core.common)
implementation(Ktor.Json.common)
implementation(Ktor.Logging.common)
implementation(Ktor.Serialization.jvm)
// implementation(Serialization.runtimeNative)
implementation(SqlDelight.runtime)
implementation(Ktor.Mock.common)
}
}
val iOSTest by getting {
dependencies {
implementation(Ktor.Mock.native)
}
}
}
}
sqldelight {
database("PetsDatabase") {
packageName = "com.jshvarts.kmp.db"
sourceFolders = listOf("sqldelight")
}
}
build.gradle.kts(project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath("com.android.tools.build:gradle:4.0.0")
classpath(kotlin("gradle-plugin", version = Versions.kotlin))
classpath(kotlin("serialization", version = Versions.kotlin))
classpath("com.squareup.sqldelight:gradle-plugin:${Versions.sqldelight}")
classpath("com.github.ben-manes:gradle-versions-plugin:0.28.0")
classpath ("androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.navigation}")
//classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")
//classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")
//classpath("org.jetbrains.kotlin:kotlin-parcelize-runtime:${Versions.kotlin}")
}
}
allprojects {
repositories {
google()
mavenCentral()
jcenter()
}
}
//TODO("Probar bajando a kotlin version 1.3.72, y habilitando el android-extensions")
plugins {
//kotlin("jvm") version "${Versions.kotlin}"
id("org.jlleitschuh.gradle.ktlint") version "9.2.1"
id ("com.github.ben-manes.versions") version "0.28.0"
//kotlin("android") version "${Versions.kotlin}" apply false
//id("org.jetbrains.kotlin.plugin.parcelize") version "${Versions.kotlin}"
}
apply(from = "quality/lint.gradle")
So I guess i can't create a Serializable object like this, or i have some library incompablity which made my Serialization objects unreadable, but how should I do?
Thank in advance !
[EDIT]
Added the build.gradle.kts(androidApp)
plugins {
//kotlin(multiplatform)
id("com.android.application")
kotlin("android")
kotlin("kapt")
id("kotlinx-serialization")
id("androidx.navigation.safeargs.kotlin")
}
android {
compileSdkVersion(Versions.compileSdk)
compileOptions{
sourceCompatibility = org.gradle.api.JavaVersion.VERSION_1_8
targetCompatibility = org.gradle.api.JavaVersion.VERSION_1_8
}
kotlinOptions{
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
kapt{
generateStubs = true
correctErrorTypes = true
}
buildFeatures{
dataBinding = true
viewBinding = true
}
defaultConfig {
applicationId = "com.jshvarts.kmp.android"
minSdkVersion(Versions.minSdk)
targetSdkVersion(Versions.targetSdk)
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
packagingOptions {
exclude("META-INF/*.kotlin_module")
}
}
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(kotlin("stdlib-jdk8", Versions.kotlin))
implementation(Coroutines.android)
implementation(AndroidX.appCompat)
implementation(AndroidX.constraintLayout)
implementation(AndroidX.recyclerView)
implementation(AndroidX.lifecycleExtensions)
implementation(AndroidX.lifecycleViewModelKtx)
implementation(material)
implementation(AndroidX.swipeToRefreshLayout)
implementation(timber)
implementation(picasso)
implementation(AndroidX.navigation)
implementation(AndroidX.navigation_ui)
implementation(Serialization.runtime)
//Dependency for googlePay
implementation("com.google.android.gms:play-services-wallet:16.0.1")
kapt(databinding)
implementation(glide){
exclude( "com.android.support")
}
kapt(glide)
implementation(project(":shared"))
}