Yellow Clock
Yellow Clock

Reputation: 465

kotlin:Internal Error occurred while analyzing this expression

I am using navigation safeargs for passing arguments from one Fragment to another . However , after I rebuild the project ,I could not parse the augument I had sent .I got an error below:

Internal Error occurred while analyzing this expression:
org.jetbrains.kotlin.descriptors.InvalidModuleException: Accessing invalid module descriptor <production sources for module FavDishKT.app> is a module[ModuleDescriptorImpl@10578057]
    at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.assertValid(ModuleDescriptorImpl.kt:62)
    at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.getPackage(ModuleDescriptorImpl.kt:84)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeFactory.createScopesForFile(FileScopeFactory.kt:62)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeFactory.createScopesForFile$default(FileScopeFactory.kt:61)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl$cache$1.invoke(FileScopeProvider.kt:48)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl$cache$1.invoke(FileScopeProvider.kt:46)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:651)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl.getFileScopes(FileScopeProvider.kt:53)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProvider$DefaultImpls.getFileResolutionScope(FileScopeProvider.kt:30)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl.getFileResolutionScope(FileScopeProvider.kt:40)
    at org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl.getResolutionScopeForDeclaration(DeclarationScopeProviderImpl.java:60)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.getOuterScope(LazyClassDescriptor.java:353)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport$scopeForClassHeaderResolution$1.invoke(ClassResolutionScopesSupport.kt:44)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport$scopeForClassHeaderResolution$1.invoke(ClassResolutionScopesSupport.kt:43)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageM...

My configures: build.gradle(project:FavDishKT)

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
        ext.kotlin_version = "1.5.0"
        repositories {
            google()
            mavenCentral()
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.2.1"
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            def nav_version = "2.3.2"
            classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            mavenCentral()
            jcenter() // Warning: this repository is going to shut down soon
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

**build.gradle(Module:FavDishKT.app)**
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    // For more details visit https://developer.android.com/guide/navigation/navigation-pass-data#Safe-args
    id 'androidx.navigation.safeargs.kotlin'
    id 'kotlin-parcelize'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.gearsrun.favdishkt"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    packagingOptions {
        exclude 'META-INF/atomicfu.kotlin_module'
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
    implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    implementation("androidx.recyclerview:recyclerview:1.2.1")
    // For control over item selection of both touch and mouse driven selection
    implementation("androidx.recyclerview:recyclerview-selection:1.1.0")
    implementation 'com.airbnb.android:lottie:3.4.1'
    implementation 'de.hdodenhof:circleimageview:3.1.0'
    implementation 'com.makeramen:roundedimageview:2.3.0'
    implementation 'com.squareup.picasso:picasso:2.71828'
    implementation("com.squareup.okhttp3:okhttp:4.9.0")
    implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
    implementation 'com.google.code.gson:gson:2.8.7'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    kapt 'com.github.bumptech.glide:compiler:4.12.0'


}

dependencies {
    //room
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
}

My idea is to pass the dish item from the homepage to another details page ,as follow ,Therefor ,I will need to pass a entity which names :FavDish

enter image description here

FavDish entity:

@Parcelize
@Entity(tableName = "fav_dishes_table")
data class FavDish(
    @PrimaryKey(autoGenerate = true) val id:Int = 0,
    @ColumnInfo val image:String,
    @ColumnInfo(name = "image_source")val imageSource:String,
    @ColumnInfo val title:String,
    @ColumnInfo val type:String,
    @ColumnInfo  val category:String,
    @ColumnInfo  val ingredients:String,
    @ColumnInfo(name = "cooking_time")  val cookingTime:String,
    @ColumnInfo(name = "instructions") val directionToCook:String,
    @ColumnInfo(name = "favorite_dish")  var favoriteDish:Boolean = false,
):Parcelable

And then , I have modified the navigation.xml ,from the AllDishes page to the DishDetailsFragment , and pass the entity reference as aguments :

<?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/mobile_navigation"
    app:startDestination="@+id/navigation_all_dishes">

    <fragment
        android:id="@+id/navigation_all_dishes"
        android:name="com.gearsrun.favdishkt.view.fragments.AllDishesFragment"
        android:label="Home"
        tools:layout="@layout/fragment_all_dishes" >
        <action
            android:id="@+id/action_navigation_all_dishes_to_dishDetailsFragment"
            app:destination="@id/dishDetailsFragment" />
    </fragment>

    <fragment
        android:id="@+id/navigation_favorite_dishes"
        android:name="com.gearsrun.favdishkt.view.fragments.FavoriteFragment"
        android:label="Favorite"
        tools:layout="@layout/fragment_favorite_dishes" >
        <action
            android:id="@+id/action_navigation_favorite_dishes_to_dishDetailsFragment"
            app:destination="@id/dishDetailsFragment" />
    </fragment>

    <fragment
        android:id="@+id/navigation_random_dish"
        android:name="com.gearsrun.favdishkt.view.fragments.RandomFragment"
        android:label="Random"
        tools:layout="@layout/fragment_random_dish" />
    <fragment
        android:id="@+id/dishDetailsFragment"
        android:name="com.gearsrun.favdishkt.view.fragments.DishDetailsFragment"
        android:label="fragment_dish_details"
        tools:layout="@layout/fragment_dish_details" >
        <argument
            android:name="dishDetails"
            app:argType="com.gearsrun.favdishkt.model.entities.FavDish"/>
    </fragment>
</navigation>

From my AllDishsFragment (home page ) ,I use findNavController,and navigate to the detailsDishFragment ,and pass the entity to it :

class AllDishesFragment : Fragment(){


    private var _binding: FragmentAllDishesBinding? = null

    private val binding get() = _binding!!
    private val mFavDishViewModel :FavDishViewModel by viewModels{
        FavDishViewModelFactory((requireActivity().application as FavDishApplication).repository)
    }
    private lateinit var mFavDishAdapter: FavDishAdapter

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding =  FragmentAllDishesBinding.inflate(inflater, container, false)
        val root: View = binding.root
     
        binding.imgAddHome.setOnClickListener {
            val intent = Intent(context,AddUpdateActivity::class.java)
            startActivity(intent)
        }
        binding.rvHome.layoutManager = GridLayoutManager(requireActivity(),2)
        mFavDishAdapter = FavDishAdapter(this)
        binding.rvHome.adapter = mFavDishAdapter

        mFavDishViewModel.allDishesList.observe(viewLifecycleOwner){dishes->
            dishes.let{
               if(it.isNotEmpty()){
                   binding.rvHome.visibility=View.VISIBLE
                   binding.txtNotice.visibility=View.GONE
                   mFavDishAdapter.getAllDishes(it)
               }else{
                   binding.rvHome.visibility =View.GONE
                   binding.txtNotice.visibility=View.VISIBLE
               }
            }
        }
        return root
    }

  
     fun dishDetails(favDish: FavDish){
      
        if(requireActivity() is MainActivity){
            (activity as MainActivity?)!!.hideBottomNavigationView()
        }
      
        findNavController().navigate(AllDishesFragmentDirections.actionNavigationAllDishesToDishDetailsFragment(favDish))
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

And the DetailDishFragment ,where it should receive the args and parse it occured the error :

class DishDetailsFragment : Fragment() {
private val mFavDishViewModel : FavDishViewModel by viewModels{
    FavDishViewModelFactory((requireActivity().application as FavDishApplication).repository)
}
 private  var mBinding : FragmentDishDetailsBinding? =null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
       mBinding = FragmentDishDetailsBinding.inflate(inflater,container,false)

        return mBinding!!.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val args:DishDetailsFragmentArgs by navArgs()
        args.let{
            try {
                Glide.with(requireActivity())
                    .load(it.dishDetails.image)


            }catch(e: IOException){

            }
        }
    }


}

enter image description here

And the problem description :

Internal Error occurred while analyzing this expression:
org.jetbrains.kotlin.descriptors.InvalidModuleException: Accessing invalid module descriptor <production sources for module FavDishKT.app> is a module[ModuleDescriptorImpl@10578057]
    at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.assertValid(ModuleDescriptorImpl.kt:62)
    at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.getPackage(ModuleDescriptorImpl.kt:84)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeFactory.createScopesForFile(FileScopeFactory.kt:62)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeFactory.createScopesForFile$default(FileScopeFactory.kt:61)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl$cache$1.invoke(FileScopeProvider.kt:48)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl$cache$1.invoke(FileScopeProvider.kt:46)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:651)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl.getFileScopes(FileScopeProvider.kt:53)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProvider$DefaultImpls.getFileResolutionScope(FileScopeProvider.kt:30)
    at org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl.getFileResolutionScope(FileScopeProvider.kt:40)
    at org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl.getResolutionScopeForDeclaration(DeclarationScopeProviderImpl.java:60)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.getOuterScope(LazyClassDescriptor.java:353)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport$scopeForClassHeaderResolution$1.invoke(ClassResolutionScopesSupport.kt:44)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport$scopeForClassHeaderResolution$1.invoke(ClassResolutionScopesSupport.kt:43)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageM...

Could anyone helps ?Thank you so much in advance !!

Upvotes: 8

Views: 10125

Answers (6)

devil hacker
devil hacker

Reputation: 21

Upgrading dependency to these worked for me

implementation 'androidx.core:core-ktx:1.10.1.0'

Upvotes: 2

Dibyendu Mahata
Dibyendu Mahata

Reputation: 179

Open the Project & Go to: File > Invalidate Caches


Select all the options & Run (Invalidate & Restart)


It has worked for me. I hope it will also work for you.

Upvotes: 7

JazBass
JazBass

Reputation: 31

Updating ktx implementation and syncing gradle worked for me!

Upvotes: 2

Mohit Dixit
Mohit Dixit

Reputation: 196

Invalid Cache Restart with both vcs and system cache option selected can resolved this issue. It worked for me.

Update: These warnings frequently coming in Dolphin Version of Android Studio(stable) causing faliure of auto suggestion and layout rendering. If you want to get rid of them for stable version you can use Chipmunk version or try canary channels of dolphin.

Upvotes: 3

Felix Kariuki
Felix Kariuki

Reputation: 684

For My case, I had the same issue but it was only happening in one particular project, The rest were okay so I tried upgrading the build Gradle plugin of the specific project to 7.3.0 and It worked. You can try to see if this helps

Upvotes: 3

Maryam Memarzadeh
Maryam Memarzadeh

Reputation: 236

install and uninstall kotlin plugin.it Worked for me

Upvotes: 5

Related Questions