Solucionar erros com o Resumo

Os recursos de API para melhorar o tratamento de erros no Glance estão incluídos a partir do Android 15 Esta página traz algumas práticas recomendadas com relação a essas APIs.

Usar um bloco try-catch em torno de componentes não combináveis.

O Compose não permite blocos try-catch em torno de elementos combináveis, mas permite unir a outra lógica do seu app nesses blocos. Isso permite que você use o Compose para visualização de erro, conforme mostrado no exemplo a seguir:

provideContent {
       var isError = false;
       var data = null
       try {
           val repository = (context.applicationContext as MyApplication).myRepository
           data = repository.loadData()
       } catch (e: Exception) {
           isError = true;
           //handleError
       }

       if (isError) {
           ErrorView()
       } else {
           Content(data)
       }
   }

Layout de erro padrão

Se houver uma exceção não identificada ou um erro do Compose, o Resumo vai mostrar uma layout de erro padrão:

Uma mensagem de erro mostrando o tipo de erro e uma sugestão de onde
  para procurá-lo
Figura 1.Layout de erro padrão do Glance 1.0
Uma caixa com o texto "Não é possível mostrar conteúdo"
Figura 2.Layout de erro padrão do Glance 1.1.0

O Glance permite que os desenvolvedores forneçam um layout XML como substituto se a composição falhar. Isso significa que houve um erro no código do Compose. Esta interface de erro também aparecerá se você tiver um erro não detectado no código do aplicativo.

class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)

Esse layout é estático com o qual o usuário não pode interagir, mas é bom em casos de emergência.

Contém um cabeçalho e um campo de texto para exibir uma mensagem de erro
Figura 3.Exemplo de layout de erro personalizado

Adicionar ações à interface de erro padrão

A partir do Glance 1.1.0, o Glance permite substituir o código de tratamento de erros padrão. Dessa forma, você pode adicionar callbacks de ação no caso de uma exceção não capturada ou na composição.

Para usar esse recurso, modifique a função onCompositionError():

GlanceAppWidget.onCompositionError(
    context: Context,
    glanceId: GlanceId,
    AppWidgetId: Int,
    throwable: Throwable
)

Nessa função, o Glance recorre à API RemoteViews para processar erros. Isso permite especificar layouts e gerenciadores de ações usando XML.

Os exemplos a seguir mostram, passo a passo, como criar uma interface de erro que inclui um botão para enviar feedback:

  1. Escrever o arquivo error_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   style="@style/Widget.MyApplication.AppWidget.Error"
   android:id="@android:id/background"
   android:layout_width="match_parent"
   android:textSize="24sp"
   android:layout_height="match_parent"
   android:orientation="vertical">


   <TextView
       android:id="@+id/error_title_view"
       android:layout_width="match_parent"
       android:textColor="@color/white"
       android:textFontWeight="800"
       android:layout_height="wrap_content"
       android:text="Example Widget Error" />

   <LinearLayout
       android:layout_width="match_parent"
       android:orientation="horizontal"
       android:paddingTop="4dp"
       android:layout_height="match_parent">

       <ImageButton
           android:layout_width="64dp"
           android:layout_height="64dp"
           android:layout_gravity="center"
           android:tint="@color/white"
           android:id="@+id/error_icon"
           android:src="@drawable/heart_broken_fill0_wght400_grad0_opsz24"
       />
       <TextView
           android:id="@+id/error_text_view"
           android:layout_width="wrap_content"
           android:textColor="@color/white"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:padding="8dp"
           android:textSize="16sp"
           android:layout_weight="1"
           android:text="Useful Error Message!" />
   </LinearLayout>

</LinearLayout>
  1. Substitua a função onCompositionError.
override fun onCompositionError(
   context: Context,
   glanceId: GlanceId,
   AppWidgetId: Int,
   throwable: Throwable
) {
   val rv = RemoteViews(context.packageName, R.layout.error_layout)
   rv.setTextViewText(
       R.id.error_text_view,
       "Error was thrown. \nThis is a custom view \nError Message: `${throwable.message}`"
   )
   rv.setOnClickPendingIntent(R.id.error_icon, getErrorIntent(context, throwable))
   AppWidgetManager.getInstance(context).updateAppWidget(AppWidgetId, rv)
}
  1. Criar uma intent pendente que faça referência ao GlanceAppWidgetReceiver
private fun getErrorIntent(context: Context, throwable: Throwable): PendingIntent {
    val intent = Intent(context, UpgradeToHelloWorldPro::class.java)
    intent.setAction("widgetError")
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
}
  1. Processar a intent no GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}