Cómo mostrar/ocultar widgets mediante programación en Flutter
En Android, cada View
subclase tiene un setVisibility()
método que te permite modificar la visibilidad de un View
objeto .
Hay 3 opciones para configurar la visibilidad:
- Visible: muestra lo
View
visible dentro del diseño. - Invisible: Oculta el
View
, pero deja un espacio equivalente al queView
ocuparía si fuera visible - Desaparecido: oculta el archivo
View
y lo elimina por completo del diseño. Es como si fueraheight
ywidth
fuera0dp
¿Existe algo equivalente a lo anterior para los widgets en Flutter?
Para una referencia rápida: https://developer.android.com/reference/android/view/View.html#attr_android:visibility
Definición:
Invisible : el widget ocupa espacio físico en la pantalla pero no es visible para el usuario. Esto se puede lograr usando Visibility
un widget.
Desaparecido : el widget no ocupa espacio físico y desapareció por completo. Esto se puede lograr usando o Visibility
condición .if
if-else
Ejemplo invisible:
Visibility(
child: Text("Invisible"),
maintainSize: true,
maintainAnimation: true,
maintainState: true,
visible: false,
),
Ejemplo desaparecido:
Visibility(
child: Text("Gone"),
visible: false,
),
Usando if
:
Para un niño:
Column( children: <Widget>[ Text('Good Morning'), // Always visible if (wishOnePerson) Text(' Mr ABC'), // Only visible if condition is true ], )
Para varios niños:
Column( children: [ Text('Good Morning'), // Always visible if (wishAll) ... [ // These children are only visible if condition is true Text('Mr ABC'), Text('Mr DEF'), Text('Mr XYZ'), ], ], )
Usando if-else
:
Para un niño:
Column( children: <Widget>[ // Only one of them is visible based on 'isMorning' condition if (isMorning) Text('Good Morning') else Text ('Good Evening'), ], )
Para varios niños:
Column( children: [ // Only one of the children will be shown based on `beforeSunset` condition if (beforeSunset) ... [ Text('Good morning'), Text('Good afternoon'), ] else ... [ Text('Good evening'), Text('Good night'), ], ], )
ACTUALIZACIÓN: Desde que se escribió esta respuesta, Visibility
se presentó y proporciona la mejor solución a este problema.
Puedes usar Opacity
con un opacity:
de 0.0
para dibujar y ocultar un elemento pero aún ocupar espacio.
Para que no ocupe espacio, sustitúyalo por un archivo vacío Container()
.
EDITAR: Para envolverlo en un objeto Opacidad, haga lo siguiente:
new Opacity(opacity: 0.0, child: new Padding(
padding: const EdgeInsets.only(
left: 16.0,
),
child: new Icon(pencil, color: CupertinoColors.activeBlue),
))
Tutorial rápido para desarrolladores de Google sobre opacidad: https://youtu.be/9hltevOHQBw