Set column width in flutter

User InterfaceDartFlutter

User Interface Problem Overview


I need to set a Column width in flutter, I have to do a layout with 3 sections, one should be 20% of the screen, the other one 60% and the last one 20%. I know that those 3 columns should be into a row, but I don't know a way to set the size, when I do that, the 3 columns take the same size.

I will appreciate any feedback.

User Interface Solutions


Solution 1 - User Interface

Instead of hard-coding the size, I would suggest using Flex like

Row(
      children: <Widget>[
        Expanded(
          flex: 2, // 20%
          child: Container(color: Colors.red),
        ),
        Expanded(
          flex: 6, // 60%
          child: Container(color: Colors.green),
        ),
        Expanded(
          flex: 2, // 20%
          child: Container(color: Colors.blue),
        )
      ],
    )

Which will produce like below,

enter image description here

Solution 2 - User Interface

Limiting the width of a Column could be

  1. Limiting the width of Column itself, use SizedBox

     SizedBox(
       width: 100, // set this
       child: Column(...),
     )
    

2 (A). Limiting width of children inside Column, without hardcoding values

Row(
  children: <Widget>[
    Expanded(
      flex: 3, // takes 30% of available width 
      child: Child1(),
    ),
    Expanded(
      flex: 7, // takes 70% of available width  
      child: Child2(),
    ),
  ],
)

2 (B). Limiting width of children inside Column, with hardcoding values.

Row(
  children: <Widget>[
    SizedBox(
      width: 100, // hard coding child width
      child: Child1(),
    ),
    SizedBox(
      width: 200, // hard coding child width
      child: Child2(),
    ),
  ],
)

Solution 3 - User Interface

This is not an answer to the original question but demonstrating a similar use case. I have a container and I want to expand the width until certain value. If width gets bigger I want container to be always in the middle. This is useful when rendering forms especially on web and desktop applications.

enter image description here

import 'package:flutter/material.dart';
import 'dart:math' as math;

var index = 0;

Widget buildContainer() { // Just a placeholder with random colour
  index++;
  return Container(
    height: 60,
    margin: const EdgeInsets.only(right: 5),
    color: Colors.primaries[math.Random().nextInt(Colors.primaries.length)],
    child: Text("$index"),
  );
}

Widget containers() {
  return Row(
    children: [
      Expanded(child: buildContainer(),
      flex: 2), // <- Control the width of each item. See other answers. 
      Expanded(child: buildContainer(), flex: 3,)
    ],
  );
}
class FormLayout extends StatelessWidget {
  const FormLayout({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(     //<- Centre the form
      child: SizedBox(
        width: 400,    //<- Limit the width
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [containers()]),
      ),
    );
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoseph ArriazaView Question on Stackoverflow
Solution 1 - User InterfaceDinesh BalasubramanianView Answer on Stackoverflow
Solution 2 - User InterfaceCopsOnRoadView Answer on Stackoverflow
Solution 3 - User InterfaceartronicsView Answer on Stackoverflow