es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

GlanceAppWidget: Error en el widget de la aplicación Glance IllegalStateException: CompositionLocal LocalConfiguration no presente.

Estoy desarrollando un widget de aplicación con Compose. Tengo un problema para obtener una cadena de recursos. Si doy el texto como una cadena como “Label”, funciona correctamente. Pero si lo doy con stringResource, el texto no se muestra y veo este problema. ¿Alguien ha enfrentado este problema? Gracias.

E/GlanceAppWidget: Error en el widget de aplicación Glance
    java.lang.IllegalStateException: No se encuentra CompositionLocal LocalConfiguration
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.noLocalProvidedFor(AndroidCompositionLocals.android.kt:167)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.access$noLocalProvidedFor(AndroidCompositionLocals.android.kt:1)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$LocalConfiguration$1.invoke(AndroidCompositionLocals.android.kt:47)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$LocalConfiguration$1.invoke(AndroidCompositionLocals.android.kt:44)
        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:1776)
        at androidx.compose.runtime.ComposerImpl.consume(Composer.kt:1746)
        at androidx.compose.ui.res.StringResources_androidKt.resources(StringResources.android.kt:78)
        at androidx.compose.ui.res.StringResources_androidKt.stringResource(StringResources.android.kt:36)
class MarketWidget : GlanceAppWidget() {

    @Composable
    override fun Content() {
        Column(
            modifier = GlanceModifier
                .fillMaxSize()
                .background(color = Color.White)
                .padding(8.dp)
        ) {
            Text(
                text = stringResource(id = R.string.app_name)
            )
        }
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que no se proporciona CompositionLocal LocalConfiguration. Este error puede ocurrir al usar stringResource() en una función Composable dentro de AppWidgetProvider.

    Para solucionar este problema, en lugar de llamar directamente a stringResource() en la función Composable, utiliza la función rememberCompositionLocal() para almacenar la configuración en un CompositionLocal y obtenerla dentro de la función Composable.

    Aquí tienes un ejemplo de cómo solucionar el problema:


    val LocalConfiguration = compositionLocalOf<configuration> { error("No se proporciona ninguna configuración") } class MarketWidget : GlanceAppWidget() { @Composable override fun Content() { val configuration = LocalConfiguration.current Column( modifier = GlanceModifier .fillMaxSize() .background(color = Color.White) .padding(8.dp) ) { Text( text = stringResource(id = R.string.app_name, configuration = configuration) ) } } }

    En primer lugar, crea un compositionLocalOf para almacenar la Configuration. Luego, pasa este valor al contenido obteniéndolo desde el CompositionLocal. Por último, utiliza la configuración al llamar a stringResource().

    Además, asegúrate de que AppWidgetProvider esté envuelto con AppWidgetPreviewProvider para poder utilizar funciones de Compose.


    class MarketWidgetProvider : AppWidgetProvider() { @Preview @Composable override fun onUpdatePreview( @PreviewParameter(MarketWidgetPreviewProvider::class) params: GlancePreviewParams, ) { MarketWidget(params) } override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { appWidgetIds.forEach { appWidgetId -> val remoteViews = buildRemoteViews(context, appWidgetId) appWidgetManager.updateAppWidget(appWidgetId, remoteViews) } } } @Preview @Composable fun MarketWidgetPreview() { MarketWidget( GlancePreviewParams( widgetSize = WidgetSize(2, 2), backgroundColor = Color.White, defaultPreview = true ) ) }

    Al envolver AppWidgetProvider con AppWidgetPreviewProvider, puedes utilizar funciones de Compose como Column() y Text() dentro de AppWidgetProvider. La función onUpdatePreview() permite obtener vistas previas del widget dentro de Android Studio.

Comments are closed.