compose-multiplatform icon indicating copy to clipboard operation
compose-multiplatform copied to clipboard

Compose Compiler (iOS): public Composable functions in expect/actual class is attempted to be exported to ObjC

Open eymar opened this issue 1 year ago • 1 comments

When updating the jetsnack example to Kotlin 2, the iOS target won't compile:

e: Compilation failed: no implementation for FUN MISSING_DECLARATION name:shouldShowBottomBar visibility:public modality:FINAL <> () returnType:kotlin.Nothing

Affected platforms

  • iOS

Versions

  • Libraries:
    • Compose Multiplatform version: 1.6.10
  • Kotlin version: 2.0.0

To Reproduce

expect abstract class JetSnackCartViewModel() {
    @Composable
    fun collectOrderLinesAsState(flow: StateFlow<List<OrderLine>>): State<List<OrderLine>>
}

// Then an actual
actual abstract class JetSnackCartViewModel actual constructor()  {
    @Composable
    actual fun collectOrderLinesAsState(flow: StateFlow<List<OrderLine>>): State<List<OrderLine>> {
        return flow.collectAsState()
    }
}

The workaround is to add:

@OptIn(kotlin.experimental.ExperimentalObjCRefinement::class)
@HiddenFromObjC

on the actual class., or make the class internal.

eymar avatar May 22 '24 09:05 eymar

Marking it as a regression, because there is no issue when using kotlin 1.9.2x My guess is that the issue could be on Kotlin side, but only an investigation can confirm.


Another possible reason: Maybe we skip 'expect' classes/functions in our lowering AddHiddenFromObjC. And k/native relies on them to create the exports in 2.0?

eymar avatar May 22 '24 09:05 eymar

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.

okushnikov avatar Aug 26 '24 13:08 okushnikov