Flutter에서 Column의 자식 사이의 공간


117

ColumnTextField위젯이 자식으로 있는 위젯이 있고 두 위젯 사이에 약간의 공간을두고 싶습니다.

나는 이미 시도 mainAxisAlignment: MainAxisAlignment.spaceAround했지만 결과가 내가 원하는 것이 아닙니다.


3
두 텍스트 필드 사이 : 간단히 SizedBox (15.0, 높이)를 넣어
anmol.majhail

margin: EdgeInsets.only(left: 200.0, top: 300.0))
user7856586

답변:


145

Padding두 위젯 사이에 위젯을 사용 하거나 위젯으로 Padding위젯을 래핑 할 수 있습니다 .

최신 정보

SizedBox 위젯은 두 위젯 사이에 사용하여 두 위젯 사이에 공간을 추가 할 수 있으며 패딩 위젯보다 코드를 더 읽기 쉽게 만듭니다.

전의:

Column(
  children: <Widget>[
    Widget1(),
    SizedBox(height: 10),
    Widget2(),
  ],
),

10
column-class가 그 속성을 포함 했으면 좋겠어요 . 모든 아이들 사이에 패딩을 얻는 것은 코딩 시간 낭비가 될 것입니다.
Haroun Hajem

패딩 위젯이 하나의 하위 매개 변수 만 취할 때 패딩 위젯에서 두 위젯을 어떻게 래핑 할 수 있습니까?
ScottF

@ScottF 대답은 Padding위젯이 두 위젯 사이에 있다고 말했습니다 . 두 위젯이 Padding.
marcusljx

2
그것은 똑바로 ... "또는 패딩 위젯들 위젯을 포장"말한다
ScottF

@ScottF 두 위젯을 자식으로 사용하여 자식을 열 또는 행으로 만듭니다.
Riley Fitzpatrick

143

다음 과 같이 위젯 사이 SizedBox에 특정을 넣을 수 있습니다 height.

Column(
  children: <Widget>[
    FirstWidget(),
    SizedBox(height: 100),
    SecondWidget(),
  ],
),

위젯을 래핑하는 것보다 이것을 선호하는 이유는 Padding무엇입니까? 가독성! 시각적 상용구가 적고 들여 쓰기가 적으며 코드는 일반적인 읽기 순서를 따릅니다.


크기가 지정된 상자를 추가하는 것은 빈보기를 추가하는 것과 같습니다. 문제가 발생하지 않습니까?
user5381191

SizedBox레이아웃 중에 원하는 크기를 가지지 만 아무것도 렌더링하지 않는 일반 위젯입니다. 텍스트 또는 컨테이너와 같은 모든 리프 위젯도 비어 있으므로 괜찮습니다.
Marcel

52

Wrap()대신 위젯을 사용 Column()하여 자식 위젯 사이에 공간을 추가 할 수 있습니다.

Wrap(
  spacing: 20, // to apply margin in the main axis of the wrap
  runSpacing: 20, // to apply margin in the cross axis of the wrap
  children: <Widget>[
     Text('child 1'),
     Text('child 2')
  ]
)

1
세로 간격 항목 사이의 간격 runSpacing대신 사용spacing
Arpit

이것은 나에게 효과적이었습니다. 나는 그것이 최선의 해결책이라고 생각하지만 Column () 대신 Wrap () 사용의 단점은 무엇입니까?
Lima Chaves 19 년

1
열은 확장 된 위젯이지만 Wrap은 그렇지 않습니다. 따라서 부모의 전체 공간을 확장하려면 Column 또는 Row 등과 같은 확장 된 위젯을 사용해야합니다. 이는 경우에 따라 다릅니다.
Mahdi Tohidloo

예, 이것은 각 어린이를 개별적으로 포장하는 것보다 훨씬 낫습니다. 좋은 제안입니다.
kevinH

31

패딩을 사용하여 다음과 같이 포장하십시오.

Column(
  children: <Widget>[
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World!'),
  ),
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World2!'),
  )
]);

Container (padding ...) 또는 SizeBox (height : xx)를 사용할 수도 있습니다. 마지막 것이 가장 일반적이지만 위젯의 공간을 관리하려는 방법에 따라 달라집니다. 공간이 실제로 위젯의 일부인 경우 패딩을 사용하고 목록에 sizebox를 사용하는 것을 좋아합니다.


CSS 그리드 갭과 같은 방법이 있습니까?
Aseem

17

이를 수행하는 방법은 여러 가지가 있습니다. 여기에 몇 가지를 나열하겠습니다.

  1. 사용 Container하고 약간의 높이를 제공 하십시오 .

    Column(
      children: <Widget>[
        Widget1(),
        Container(height: 10), // set height
        Widget2(),
      ],
    )
    
  2. 사용하다 Spacer

    Column(
      children: <Widget>[
        Widget1(),
        Spacer(), // use Spacer
        Widget2(),
      ],
    )
    
  3. 사용하다 Expanded

    Column(
      children: <Widget>[
        Widget1(),
        Expanded(child: SizedBox()), // use Expanded
        Widget2(),
      ],
    )
    
  4. 사용하다 mainAxisAlignment

    Column(
      mainAxisAlignment: MainAxisAlignment.spaceAround, // mainAxisAlignment
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    
  5. 사용하다 Wrap

    Wrap(
      direction: Axis.vertical, // make sure to set this
      spacing: 20, // set your spacing
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    

8
Column(
  children: <Widget>[
    FirstWidget(),
    Spacer(),
    SecondWidget(),
  ]
)

Spacer는 [Flexible] 위젯에 삽입 할 유연한 공간을 만듭니다. (칼럼처럼)


5
다른 사람들이 더 잘 이해할 수 있도록 답변에 설명을 추가하십시오. 코드 전용 답변은 무례한 것으로 간주되며 OP가 도움을 주려는 문제를 이해하는 데 도움이되지 않을 수 있습니다.
Michael

6

코드 가독성을 위해 위에서 SizedBox를 사용 하는 것과 동일한 방식으로 Padding 위젯을 동일한 방식으로 사용할 수 있으며 Column의 자식에 대한 부모 위젯으로 만들 필요가 없습니다.

Column(
  children: <Widget>[
    FirstWidget(),
    Padding(padding: EdgeInsets.only(top: 40.0)),
    SecondWidget(),
  ]
)

2

이 문제를 다른 방법으로 해결할 수 있습니다.

당신이 사용하는 경우 행 / 열을 당신은 사용에 있습니다 mainAxisAlignment : MainAxisAlignment.spaceEvenly를

당신이 사용하는 경우 위젯을 사용해야 , 5 간격 : runSpacing 10,

어디에서나 SizeBox ()를 사용할 수 있습니다.


1

열 기본적으로 높이가 없습니다. 열을 컨테이너에 래핑하고 특정 높이를 컨테이너에 추가 할 수 있습니다. 그런 다음 아래와 같이 사용할 수 있습니다.

Container(
   width: double.infinity,//Your desire Width
   height: height,//Your desire Height
   child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: <Widget>[
         Text('One'),
         Text('Two')
      ],
   ),
),

1

여기에 많은 답변이 있지만 모두가 사용해야 할 가장 중요한 답변을 여기에 넣겠습니다.

1. 기둥

 Column(
          children: <Widget>[
            Text('Widget A'), //Can be any widget
            SizedBox(height: 20,), //height is space betweeen your top and bottom widget
            Text('Widget B'), //Can be any widget
          ],
        ),

2. 랩

     Wrap(
          direction: Axis.vertical, // We have to declare Axis.vertical, otherwise by default widget are drawn in horizontal order
            spacing: 20, // Add spacing one time which is same for all other widgets in the children list
            children: <Widget>[
              Text('Widget A'), // Can be any widget
              Text('Widget B'), // Can be any widget
            ]
        )

0
Column(children: <Widget>[
   Container(margin: EdgeInsets.only(top:12, child: yourWidget)),
   Container(margin: EdgeInsets.only(top:12, child: yourWidget))
]);

0

열의 자식 사이에 SizedBox () 위젯을 사용해야 할 수도 있습니다. 유용 할 수 있기를 바랍니다.


새로운 질문이 있으면 질문하기 버튼 을 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - 리뷰에서
Bruno

이것은 질문에 대한 답을 제공하지 않습니다. 충분한 평판얻으면 모든 게시물댓글 수 있습니다 . 대신 질문자의 설명이 필요하지 않은 답변을 제공하세요 . - 리뷰에서
Ram Sharma

0

도우미 기능을 사용하여 각 자식 뒤에 간격을 추가 할 수도 있습니다.

List<Widget> childrenWithSpacing({
  @required List<Widget> children,
  double spacing = 8,
}) {
  final space = Container(width: spacing, height: spacing);
  return children.expand((widget) => [widget, space]).toList();
}

따라서 반환 된 목록은 열의 자식으로 사용될 수 있습니다.

Column(
  children: childrenWithSpacing(
    spacing: 14,
    children: [
      Text('This becomes a text with an adjacent spacing'),
      if (true == true) Text('Also, makes it easy to add conditional widgets'),
    ],
  ),
);

같은 목표를 위해 도우미 기능을 통해 아이들을 실행시키는 것이 잘못되었거나 성능 저하가 있는지 확실하지 않습니다.


-1

크기 상자는 경우에 도움이되지 않으며 전화기가 가로 모드입니다.

body: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
      ],
     )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.