Os recursos da API para melhorar o tratamento de erros no Resumo estão incluídos no Android 15 em diante. 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 envolver outra lógica do app nesses blocos. Isso permite usar o Compose na visualização de erros, conforme mostrado neste exemplo:
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 detectada ou um erro do Compose, o Glance vai mostrar um layout de erro padrão:
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. Essa interface de erro também será exibida se você tiver um erro não detectado no código do app.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
Esse layout é estático com que o usuário não pode interagir, mas é bom em casos de emergência.
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, é possível adicionar callbacks de ação no caso de uma exceção não identificada ou um erro 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 inclua um botão para enviar feedback:
- 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>
- 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)
}
- 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)
}
- Processar a intent no
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}