Saltar al contenido principal

Optimización de Container con color

Un Container con un color y sin ninguna otra decoración de fondo ya no construye los mismos widgets hijos.

Resumen

#

Se ha agregado un nuevo widget ColoredBox al framework, y el widget Container se ha optimizado para usarlo si un usuario especifica un color en lugar de una decoration.

Contexto

#

Es muy común usar el widget Container de la siguiente manera:

dart
return Container(color: Colors.red);

Anteriormente, este código resultaba en una jerarquía de widgets que utilizaba un BoxDecoration para pintar el color de fondo. El widget BoxDecoration cubre muchos otros casos además de solo pintar un color de fondo, y no es tan eficiente como el nuevo widget ColoredBox, que solo pinta un color de fondo.

Las pruebas de widgets que querían realizar aserciones basadas en el color de un container en el árbol de widgets anteriormente tenían que encontrar el BoxDecoration para obtener el color del container. Ahora, pueden verificar la propiedad color en el propio Container, a menos que se haya proporcionado explícitamente un BoxDecoration como la propiedad decoration. Sigue siendo un error proporcionar tanto color como decoration a Container.

Guía de migración

#

Las pruebas que realizan aserciones sobre el color de un Container o que esperaban que creara un BoxDecoration deben ser modificadas.

Código antes de la migración:

dart
testWidgets('Container color', (WidgetTester tester) async {
  await tester.pumpWidget(Container(color: Colors.red));

  final Container container = tester.widgetList<Container>().first;
  expect(container.decoration.color, Colors.red);
  // Or, a test may have specifically looked for the BoxDecoration, e.g.:
  expect(find.byType(BoxDecoration), findsOneWidget);
});

Código después de la migración:

dart
testWidgets('Container color', (WidgetTester tester) async {
  await tester.pumpWidget(Container(color: Colors.red));

  final Container container = tester.widgetList<Container>().first;
  expect(container.color, Colors.red);
  // If your test needed to work directly with the BoxDecoration, it should
  // instead look for the ColoredBox, e.g.:
  expect(find.byType(BoxDecoration), findsNothing);
  expect(find.byType(ColoredBox), findsOneWidget);
});

Timeline

#

Introducido en la versión: 1.15.4
En la versión estable: 1.17

Referencias

#

Documentación de la API:

Issues relevantes:

PR relevante: