Saltar al contenido

Mostrar/ocultar widgets en Flutter programáticamente

Te doy la bienvenida a nuestra página, en este lugar vas a hallar la resolución que andabas buscando.

Solución:

Invisible: El widget ocupa espacio físico en la pantalla pero no es visible para el usuario.

Desaparecido: El widget no ocupa espacio físico y desaparece por completo.


ejemplo invisible

Visibility(
  child: Text("Invisible"),
  maintainSize: true, 
  maintainAnimation: true,
  maintainState: true,
  visible: false, 
),

ejemplo ido

Visibility(
  child: Text("Gone"),
  visible: false,
),

Como alternativa, puede utilizar if condición tanto para invisible como para desaparecido.

Column(
  children: [
    if (show) Text("This can be visible/not depending on condition"),
    Text("This is always visible"),
  ],
) 

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


Puedes usar Opacity con un opacity: de 0.0 para dibujar hacer un elemento oculto pero que aún ocupe espacio.

Para que no ocupe espacio, reemplázalo con uno vacío. Container().

EDITAR: para envolverlo en un objeto Opacity, 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

Para colaborar con la pregunta y mostrar un ejemplo de reemplazarlo con un vacío Container().

Aquí está el ejemplo a continuación:

ingrese la descripción de la imagen aquí

import "package:flutter/material.dart";

void main() 
  runApp(new ControlleApp());


class ControlleApp extends StatelessWidget  
  @override
  Widget build(BuildContext context) 
    return new MaterialApp(
      title: "My App",
      home: new HomePage(),
    );
  


class HomePage extends StatefulWidget 
  @override
  HomePageState createState() => new HomePageState();


class HomePageState extends State 
  bool visibilityTag = false;
  bool visibilityObs = false;

  void _changed(bool visibility, String field) 
    setState(() 
      if (field == "tag")
        visibilityTag = visibility;
      
      if (field == "obs")
        visibilityObs = visibility;
      
    );
  

  @override
  Widget build(BuildContext context)
    return new Scaffold(
      appBar: new AppBar(backgroundColor: new Color(0xFF26C6DA)),
      body: new ListView(
        children: [
          new Container(
            margin: new EdgeInsets.all(20.0),
            child: new FlutterLogo(size: 100.0, colors: Colors.blue),
          ),
          new Container(
            margin: new EdgeInsets.only(left: 16.0, right: 16.0),
            child: new Column(
              children: [
                visibilityObs ? new Row(
                  crossAxisAlignment: CrossAxisAlignment.end,
                  children: [
                    new Expanded(
                      flex: 11,
                      child: new TextField(
                        maxLines: 1,
                        style: Theme.of(context).textTheme.title,
                        decoration: new InputDecoration(
                          labelText: "Observation",
                          isDense: true
                        ),
                      ),
                    ),
                    new Expanded(
                      flex: 1,
                      child: new IconButton(
                        color: Colors.grey[400],
                        icon: const Icon(Icons.cancel, size: 22.0,),
                        onPressed: () 
                          _changed(false, "obs");
                        ,
                      ),
                    ),
                  ],
                ) : new Container(),

                visibilityTag ? new Row(
                  crossAxisAlignment: CrossAxisAlignment.end,
                  children: [
                    new Expanded(
                      flex: 11,
                      child: new TextField(
                        maxLines: 1,
                        style: Theme.of(context).textTheme.title,
                        decoration: new InputDecoration(
                          labelText: "Tags",
                          isDense: true
                        ),
                      ),
                    ),
                    new Expanded(
                      flex: 1,
                      child: new IconButton(
                        color: Colors.grey[400],
                        icon: const Icon(Icons.cancel, size: 22.0,),
                        onPressed: () 
                          _changed(false, "tag");
                        ,
                      ),
                    ),
                  ],
                ) : new Container(),
              ],
            )
          ),
          new Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              new InkWell(
                onTap: () 
                  visibilityObs ? null : _changed(true, "obs");
                ,
                child: new Container(
                  margin: new EdgeInsets.only(top: 16.0),
                  child: new Column(
                    children: [
                      new Icon(Icons.comment, color: visibilityObs ? Colors.grey[400] : Colors.grey[600]),
                      new Container(
                        margin: const EdgeInsets.only(top: 8.0),
                        child: new Text(
                          "Observation",
                          style: new TextStyle(
                            fontSize: 12.0,
                            fontWeight: FontWeight.w400,
                            color: visibilityObs ? Colors.grey[400] : Colors.grey[600],
                          ),
                        ),
                      ),
                    ],
                  ),
                )
              ),
              new SizedBox(width: 24.0),
              new InkWell(
                onTap: () 
                  visibilityTag ? null : _changed(true, "tag");
                ,
                child: new Container(
                  margin: new EdgeInsets.only(top: 16.0),
                  child: new Column(
                    children: [
                      new Icon(Icons.local_offer, color: visibilityTag ? Colors.grey[400] : Colors.grey[600]),
                      new Container(
                        margin: const EdgeInsets.only(top: 8.0),
                        child: new Text(
                          "Tags",
                          style: new TextStyle(
                            fontSize: 12.0,
                            fontWeight: FontWeight.w400,
                            color: visibilityTag ? Colors.grey[400] : Colors.grey[600],
                          ),
                        ),
                      ),
                    ],
                  ),
                )
              ),
            ],
          )                    
        ],
      )
    );
  

Aquí puedes ver las comentarios y valoraciones de los lectores

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *