Saltar al contenido principal

Desaprobar ButtonBar en favor de OverflowBar

El widget ButtonBar ha sido reemplazado por un widget más eficiente, OverflowBar.

Resumen

#

El widget ButtonBar fue deprecado en favor del widget OverflowBar, que es más eficiente. Como resultado, ThemeData.buttonBarTheme y ButtonBarTheme también fueron deprecados.

Contexto

#

El widget ButtonBar organiza a sus hijos en una fila y en una columna si no hay suficiente espacio horizontal. El widget OverflowBar hace lo mismo, pero no está vinculado a la librería Material y forma parte de la librería principal widgets.dart.

Descripción del cambio

#
  • Reemplaza el widget ButtonBar por el widget OverflowBar.
  • De forma predeterminada, ButtonBar alinea a sus hijos al final del diseño, mientras que OverflowBar alinea a sus hijos al inicio. Para alinear a los hijos de OverflowBar al final, establece la propiedad OverflowBar.alignment en MainAxisAlignment.end.
  • ButtonBar.buttonPadding proporciona espaciado entre los botones y relleno alrededor de ellos. Reemplázalo con OverflowBar.spacing, que proporciona espaciado entre los botones. Envuelve el widget OverflowBar con el widget Padding para proporcionar relleno alrededor de los botones.
  • Reemplaza ButtonBar.overflowButtonSpacing con OverflowBar.overflowSpacing, el cual proporciona espaciado entre los botones cuando estos se disponen en una columna porque no hay suficiente espacio horizontal.
  • Si está especificado, elimina ButtonBarThemeData de ThemeData.

Guía de migración

#

Reemplaza ButtonBar con OverflowBar, anula la alineación predeterminada si es necesario, reemplaza ButtonBar.buttonPadding con el widget Padding y OverflowBar.spacing para el espaciado entre y alrededor de los botones, y reemplaza ButtonBar.overflowButtonSpacing con OverflowBar.overflowSpacing para el espaciado entre los botones cuando se disponen en una columna si no hay suficiente espacio horizontal.

Antes:

dart
ButtonBar(
  buttonPadding: const EdgeInsets.all(8.0),
  overflowButtonSpacing: 8.0,
  children: <Widget>[
    TextButton(child: const Text('Button 1'), onPressed: () {}),
    TextButton(child: const Text('Button 2'), onPressed: () {}),
    TextButton(child: const Text('Button 3'), onPressed: () {}),
  ],
),

Después:

dart
Padding(
  padding: const EdgeInsets.all(8.0),
  child: OverflowBar(
    alignment: MainAxisAlignment.end,
    spacing: 8.0,
    overflowSpacing: 8.0,
    children: <Widget>[
      TextButton(child: const Text('Button 1'), onPressed: () {}),
      TextButton(child: const Text('Button 2'), onPressed: () {}),
      TextButton(child: const Text('Button 3'), onPressed: () {}),
    ],
  ),
),

Si especificas un ThemeData.buttonBarTheme, elimínalo y utiliza las propiedades del widget OverflowBar para personalizar el widget OverflowBar.

Antes:

dart
ThemeData(
  buttonBarTheme: ButtonBarThemeData(
    alignment: MainAxisAlignment.center,
  ),
),

Después:

dart
ThemeData(
  // ...
),

Si utilizas el widget ButtonBarTheme, elimínalo y utiliza las propiedades del widget OverflowBar para personalizar el widget OverflowBar.

Antes:

dart
ButtonBarTheme(
  data: ButtonBarThemeData(
    alignment: MainAxisAlignment.center,
  ),
  child: ButtonBar(
    children: <Widget>[
      // ...
    ],
  ),
),

Después:

dart
OverflowBar(
  alignment: MainAxisAlignment.center,
  children: <Widget>[
    // ...
  ],
),

Timeline

#

Introducido en la versión: 3.22.0-2.0.pre
En la versión estable: 3.24.0

Referencias

#

Documentación de la API:

Issues relevantes:

PRs relevantes: