Skip to content

Kotlin compatibility issue after upgrading Flutter, Android Studio, and Gradle — Flutter plugin ToolWindowBadgeUpdater causes ClassCastException on Android Studio Narwhal (2025.1.2) #8441

@Githubsaveme

Description

@Githubsaveme

What happened

After upgrading to the latest versions of Flutter, Android Studio Narwhal Feature Drop (2025.1.2), Gradle, and Kotlin, Android Studio throws a ClassCastException when trying to retrieve Flutter SDK information.

This happens as soon as the Flutter plugin is active, even without opening a project. It seems related to io.flutter.toolwindow.ToolWindowBadgeUpdater$BadgeIcon being incompatible with com.intellij.openapi.util.ScalableIcon in the new IntelliJ platform.

Steps to Reproduce:

Update Android Studio to Narwhal Feature Drop | 2025.1.2

Update Flutter to the latest stable version (flutter upgrade --force)

Update Gradle and Kotlin to the latest versions supported by Flutter

Install or enable the Flutter plugin (v87.0)

Open Android Studio (with or without a Flutter project)

Expected Behavior:
Flutter plugin should load without errors and display the Flutter tool window normally.

Version information

Android Studio Narwhal Feature Drop | 2025.1.2 • Flutter plugin io.flutter 87.0 • Dart plugin 251.27623.5

Error getting Flutter sdk information.

Exception

Unhandled exception in [Kernel@t4nrgf222uitrdk0ttus, Rete(failFast=false, commands=capacity=2147483647,data=[onReceive], reteState=kotlinx.coroutines.flow.StateFlowImpl@7fc2413d, dbSource=ReteDbSource(reteState=kotlinx.coroutines.flow.StateFlowImpl@7fc2413d)), DbSourceContextElement(kernel Kernel@t4nrgf222uitrdk0ttus), ComponentManager(ProjectImpl@1840229347), com.intellij.codeWithMe.ClientIdContextElementPrecursor@60b1fa38, CoroutineName(com.intellij.openapi.wm.impl.ToolWindowManagerImpl), ModalityState.NON_MODAL, Dispatchers.EDT]

java.lang.ClassCastException: class io.flutter.toolwindow.ToolWindowBadgeUpdater$BadgeIcon cannot be cast to class com.intellij.openapi.util.ScalableIcon (io.flutter.toolwindow.ToolWindowBadgeUpdater$BadgeIcon is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @31fcb578; com.intellij.openapi.util.ScalableIcon is in unnamed module of loader com.intellij.util.lang.PathClassLoader @4cb2c100)
	at com.intellij.openapi.wm.impl.SquareStripeButton.updatePresentation(SquareStripeButton.kt:244)
	at com.intellij.toolWindow.ToolWindowPaneNewButtonManager$createStripeButton$1.updateIcon(ToolWindowPaneNewButtonManager.kt:203)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.toolWindowPropertyChanged(ToolWindowManagerImpl.kt:2355)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.setIcon(ToolWindowImpl.kt:583)
	at io.flutter.toolwindow.ToolWindowBadgeUpdater.lambda$updateBadgedIcon$0(ToolWindowBadgeUpdater.java:39)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl$invokeLater$1.invokeSuspend(ToolWindowManagerImpl.kt:1621)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
	at com.intellij.openapi.application.impl.EdtCoroutineDispatcher$wrapWithLocking$2$1.run(EdtCoroutineDispatcher.kt:71)
	at com.intellij.openapi.application.WriteIntentReadAction.lambda$run$0(WriteIntentReadAction.java:24)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction$lambda$6(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWithTemporaryThreadLocal(AnyThreadWriteThreadingSupport.kt:204)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:222)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteIntentReadAction(ApplicationImpl.java:1009)
	at com.intellij.openapi.application.WriteIntentReadAction.compute(WriteIntentReadAction.java:55)
	at com.intellij.openapi.application.WriteIntentReadAction.run(WriteIntentReadAction.java:23)
	at com.intellij.openapi.application.impl.EdtCoroutineDispatcher$wrapWithLocking$$inlined$Runnable$2.run(Runnable.kt:15)
	at com.intellij.openapi.application.impl.DispatchedRunnable.run(DispatchedRunnable.kt:42)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:240)
	at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:25)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:222)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:117)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:43)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Unknown Source)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:585)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:482)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10$lambda$9(IdeEventQueue.kt:307)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:864)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10(IdeEventQueue.kt:306)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$3(IdeEventQueue.kt:958)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:109)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:958)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12(IdeEventQueue.kt:301)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:341)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [Kernel@t4nrgf222uitrdk0ttus, Rete(failFast=false, commands=capacity=2147483647,data=[onReceive], reteState=kotlinx.coroutines.flow.StateFlowImpl@7fc2413d, dbSource=ReteDbSource(reteState=kotlinx.coroutines.flow.StateFlowImpl@7fc2413d)), DbSourceContextElement(kernel Kernel@t4nrgf222uitrdk0ttus), ComponentManager(ProjectImpl@1840229347), com.intellij.codeWithMe.ClientIdContextElementPrecursor@60b1fa38, CoroutineName(com.intellij.openapi.wm.impl.ToolWindowManagerImpl), ModalityState.NON_MODAL, StandaloneCoroutine{Cancelled}@31993c41, Dispatchers.EDT]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions