Cómo mostrar/ocultar widgets mediante programación en Flutter

Resuelto user3217522 asked hace 7 años • 16 respuestas

En Android, cada Viewsubclase tiene un setVisibility()método que te permite modificar la visibilidad de un Viewobjeto .

Hay 3 opciones para configurar la visibilidad:

  • Visible: muestra lo Viewvisible dentro del diseño.
  • Invisible: Oculta el View, pero deja un espacio equivalente al que Viewocuparía si fuera visible
  • Desaparecido: oculta el archivo Viewy lo elimina por completo del diseño. Es como si fuera heighty widthfuera0dp

¿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

user3217522 avatar Jun 12 '17 06:06 user3217522
Aceptado

Definición:

Invisible : el widget ocupa espacio físico en la pantalla pero no es visible para el usuario. Esto se puede lograr usando Visibilityun widget.

Desaparecido : el widget no ocupa espacio físico y desapareció por completo. Esto se puede lograr usando o Visibilitycondición .ifif-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'),
        ],
      ],
    )
    
CopsOnRoad avatar Oct 29 '2018 11:10 CopsOnRoad

ACTUALIZACIÓN: Desde que se escribió esta respuesta, Visibilityse presentó y proporciona la mejor solución a este problema.


Puedes usar Opacitycon un opacity:de 0.0para 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

Collin Jackson avatar Jun 12 '2017 00:06 Collin Jackson