IllegalStateException:CompositionLocal LocalConfiguration 不存在 Android

IllegalStateException: CompositionLocal LocalConfiguration not present Android

我正在尝试根据此 article on Medium 在 Jetpack Compose 中使用 staticCompositionLocalOf。 这是我的 ProvidableCompositionLocal

val lightColors = lightColors(
    primary = LightColor.BackgroundWhite,
    primaryVariant = LightColor.ToolbarWhite,
    secondary = LightColor.FabBlue,
    secondaryVariant = LightColor.BackgroundWhite,
    surface = LightColor.SurfaceWhite,
    onPrimary = LightColor.TextBlack,
    onSecondary = LightColor.TextBlack,
    onSurface = LightColor.TextBlack
)

val darkColors = darkColors(
    primary = DarkColor.BackgroundBlue,
    primaryVariant = DarkColor.ToolbarBlue,
    secondary = DarkColor.FabGrey,
    secondaryVariant = DarkColor.BackgroundBlue,
    surface = DarkColor.SurfaceBlue,
    onPrimary = Color.White,
    onSecondary = Color.White,
    onSurface = Color.White
)

private val DarkColorPalette =
    Colors(
        material = darkColors,
        toolbar = DarkColor.ToolbarBlue,
        background = DarkColor.BackgroundBlue,
        surface = DarkColor.SurfaceBlue,
        fab = DarkColor.FabGrey,
        pink = DarkColor.Pink
    )

private val LightColorPalette =
    Colors(
        material = lightColors,
        toolbar = LightColor.ToolbarWhite,
        background = LightColor.BackgroundWhite,
        surface = LightColor.SurfaceWhite,
        fab = LightColor.FabBlue,
        pink = LightColor.Pink
    )

val TheColor: Colors
    @Composable
    @ReadOnlyComposable
    get() = LocalColors.current
}

val LocalColors = staticCompositionLocalOf { DarkColorPalette }

这是 Compose class 提供的普通颜色 class 的包装。 material 变量是正常的颜色 class.

data class Colors(
    val material: Colors,
    val toolbar: Color,
    val background: Color,
    val surface: Color,
    val fab: Color,
    val pink: Color
) {
    val primary: Color get() = material.primary
    val primaryVariant: Color get() = material.primaryVariant
    val secondary: Color get() = material.secondary
    val secondaryVariant: Color get() = material.secondaryVariant
//    val background: Color get() = material.background
//    val surface: Color get() = material.surface
    val error: Color get() = material.error
    val onPrimary: Color get() = material.onPrimary
    val onSecondary: Color get() = material.onSecondary
    val onBackground: Color get() = material.onBackground
    val onSurface: Color get() = material.onSurface
    val onError: Color get() = material.onError
    val isLight: Boolean get() = material.isLight
}

我也在我的主题功能中提供了它,如下所示。我从 Android DataStore

获取 darkTheme
@Composable
fun BMICalculatorTheme(
    darkTheme: Boolean,
    content: @Composable () -> Unit
) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    CompositionLocalProvider(LocalColors provides colors) {
        MaterialTheme(
            colors = colors.material,
            typography = CabinTypography,
            shapes = Shapes,
            content = content
        )
    }
}

但是,我收到以下错误,但找不到任何可以帮助我修复它的在线资源。如果需要任何进一步的信息,我很乐意澄清。任何帮助将不胜感激。

IllegalStateException: CompositionLocal LocalConfiguration not present
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.noLocalProvidedFor(AndroidCompositionLocals.android.kt:123)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.access$noLocalProvidedFor(AndroidCompositionLocals.android.kt:1)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$LocalConfiguration.invoke(AndroidCompositionLocals.android.kt:44)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$LocalConfiguration.invoke(AndroidCompositionLocals.android.kt:43)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at androidx.compose.runtime.LazyValueHolder.getCurrent(ValueHolders.kt:29)
        at androidx.compose.runtime.LazyValueHolder.getValue(ValueHolders.kt:31)
        at androidx.compose.runtime.ComposerImpl.resolveCompositionLocal(Composer.kt:1895)
        at androidx.compose.runtime.ComposerImpl.consume(Composer.kt:1865)
        at androidx.compose.foundation.DarkTheme_androidKt.isSystemInDarkTheme(DarkTheme.android.kt:52)
        at com.octagon_technologies.bmicalculator.data.ThemeDataStore$isDarkMode$$inlined$map.emit(Collect.kt:135)
        at kotlinx.coroutines.flow.FlowKt__ErrorsKt$catchImpl$$inlined$collect.emit(Collect.kt:134)
        at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun.invoke(SafeCollector.kt:15)
        at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun.invoke(Unknown Source:4)
        at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:77)
        at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:59)
        at androidx.datastore.core.SingleProcessDataStore$data$invokeSuspend$$inlined$map.emit(Collect.kt:139)
        at kotlinx.coroutines.flow.FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$lambda.emit(Collect.kt:137)
        at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:348)
        at kotlinx.coroutines.flow.StateFlowImpl$collect.invokeSuspend(Unknown Source:12)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
        at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
        at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback.run(AndroidUiDispatcher.android.kt:57)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)

问题似乎出在这里:

... ThemeDataStore$isDarkMode$$inlined$map.emit(Collect.kt:135)

从堆栈跟踪来看,isSystemInDarkTheme 似乎是在传递给 collect() 的 lambda 内部调用的,因为它是一个 @Composable 函数,所以只能从另一个 @Composable 函数,不能在流中调用 collect().

编译器应该报告这个错误。请考虑将此报告为 compose 编译器插件错误。