skip to Main Content

I am trying to change the width of a container dynamically. I have four containers in a row. I hide other three when a user selects a value (taps on a filter icon having bool value). The problem is that when I hide the other three (using visibility), the remaining container takes the space of full row.

What I want is this:
Keep the default width of the container when the bool value is true, else take 1/4 value of the device width using media query.

Thanks in Advance!
Regards

2

Answers


  1. Try use Flexible widget and set flex: for widget child

    Example:

    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatefulWidget {
      const HomeScreen({Key? key}) : super(key: key);
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      bool _button1Show = true;
      bool _button2Show = true;
      bool _button3Show = true;
      bool _button4Show = true;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Row(
              children: [
                Visibility(
                  visible: _button1Show,
                  child: Flexible(
                    child: GestureDetector(
                      onTap: (){
                        setState(() {
                          _button1Show = false;
                        });
                      },
                      child: Container(
                        height: 50,
                        color: Colors.red,
                      ),
                    ),
                    flex: 1,
                  ),
                ),
                Visibility(
                  visible: _button2Show,
                  child: Flexible(
                    child: GestureDetector(
                      onTap: (){
                        setState(() {
                          _button2Show = false;
                        });
                      },
                      child: Container(
                        height: 50,
                        color: Colors.green,
                      ),
                    ),
                    flex: 1,
                  ),
                ),
                Visibility(
                  visible: _button3Show,
                  child: Flexible(
                    child: GestureDetector(
                      onTap: (){
                        setState(() {
                          _button3Show = false;
                        });
                      },
                      child: Container(
                        height: 50,
                        color: Colors.grey,
                      ),
                    ),
                    flex: 1,
                  ),
                ),
                Visibility(
                  visible: _button4Show,
                  child: Flexible(
                    child: GestureDetector(
                      onTap: (){
                        setState(() {
                          _button4Show = false;
                        });
                      },
                      child: Container(
                        height: 50,
                        color: Colors.yellow,
                      ),
                    ),
                    flex: 1,
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    Login or Signup to reply.
  2. This might point you in the right direction:

    Container(
      width: myBool ? 200 : MediaQuery.of(context).size.width * 0.25,
      
      ...
    

    However, the better solution might be to set each Row’s child width to 1/4 of the overall width:

    Row(
          children: <Widget>[
            Expanded(
              flex: 1, // 25%
              child: Container(color: Colors.red),
            ),
            Expanded(
              flex: 1, // 25%
              child: Container(color: Colors.green),
            ),
            Expanded(
              flex: 1, // 25%
              child: Container(color: Colors.blue),
            )
            Expanded(
              flex: 1, // 25%
              child: Container(color: Colors.yellow),
            )
          ],
        )
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search