flutter의 wrap_content 및 match_parent에 해당합니까?


127

안드로이드 match_parentwrap_content위젯에 포함 된 내용에 자신의 부모를 자동으로 상대 위젯의 크기를 조정하는 데 사용됩니다.

Flutter에서는 기본적으로 모든 위젯이로 설정되어있는 것 같습니다.이 위젯 과 상위 위젯 wrap_content을 채울 수 있도록 어떻게 변경 합니까?widthheight

답변:


161

당신은 작은 트릭으로 할 수 있습니다 : (폭, 높이)의 요구 사항이 있다고 가정합니다.

Wrap_content, Wrap_content :

 //use this as child
 Wrap(
  children: <Widget>[*your_child*])

Match_parent, Match_parent :

 //use this as child
Container(
        height: double.infinity,
    width: double.infinity,child:*your_child*)

Match_parent, Wrap_content :

 //use this as child
Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);

Wrap_content, Match_parent :

 //use this as child
Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);

2
부모와 일치하기 위해 SizedBox.expand ()로 위젯을 래핑 할 수도 있습니다
Wecherowski

138

주문 동작을 얻을에서 match_parentwrap_content 우리가 사용할 필요가 mainAxisSize의 재산을 행 / 열 위젯의 mainAxisSize의 속성이 소요 MainAxisSize의 두 개의 값을 가지는 열거 MainAxisSize.min을 하는 것처럼 동작 wrap_contentMainAxisSize.max 로 동작 match_parent .

여기에 이미지 설명 입력

원본 기사 링크


6
예를 들어 열 내에서 가로로 확장 crossAxisAlignment하도록 설정할 수있는 행 및 열 필드 도 있다고 추가합니다.CrossAxisAlignment.stretch
wamfous

1
감사합니다! 작년에 투표를했는데 오랫동안 플러터를 사용하지 않았고 거의 모든 것을 잊어 버렸고 오늘도 당신이 저를 도왔습니다.
Chandler

33

짧은 대답은 아이가 크기를 가질 때까지 부모는 크기가 없다는 것입니다.

Flutter에서 레이아웃이 작동하는 방식은 각 위젯이 각각의 자식에게 제약 조건을 제공한다는 것입니다. "이만큼 넓어야하고, 이만큼 키가 커야하며, 최소한 이만큼 넓어야합니다."또는 무엇이든 (특히, 최소 너비, 최대 너비, 최소 높이 및 최대 높이 가져 오기). 각 자식은 이러한 제약 조건을 취하고 무언가를 수행하고 해당 제약 조건과 일치하는 크기 (너비 및 높이)를 선택합니다. 그런 다음 각 자식이 작업을 마치면 위젯은 자체 크기를 선택할 수 있습니다.

일부 위젯은 부모가 허용하는만큼 커지려고합니다. 일부 위젯은 부모가 허용하는만큼 작아야합니다. 일부 위젯은 특정 "자연"크기 (예 : 텍스트, 이미지)와 일치 시키려고합니다.

일부 위젯은 자녀에게 원하는 크기를 지정할 수 있다고 말합니다. 일부는 자녀에게 부모로부터받은 것과 동일한 제약 조건을 부여합니다.


Ian, PageView내부 a Column가 있고 다른 Column내부가 current 내부에 있으면 page렌더링 오류가 발생하지만 PageView내부 an Expanded또는 a를 래핑하여 수정할 수 있습니다 Flexible. 문제는이 두 가지 옵션이 자녀를 확장한다는 것입니다. 이러한 종류의 렌더링 문제를 해결하기 위해 "콘텐츠 래핑"과 같은 축소 관련 위젯이없는 이유는 무엇입니까?
Michel Feinstein

21

실제로 사용할 수있는 몇 가지 옵션이 있습니다.

SizedBox.expand를 사용하여 위젯을 부모 크기와 일치 시키거나 SizedBox (width : double.infinity)를 사용하여 너비 만 일치 시키거나 SizedBox (heigth : double.infinity)를 사용하여 높이 만 일치시킬 수 있습니다.

wrap_content 동작을 원하는 경우 사용중인 상위 위젯에 따라 다릅니다. 예를 들어 열에 버튼을 배치하면 wrap_content처럼 동작하고 match_parent처럼 사용하려면 확장 된 위젯 또는 sizedbox로 버튼을 래핑 할 수 있습니다.

ListView를 사용하면 버튼이 match_parent 동작을 얻고 wrap_content 동작을 얻으려면 Row와 같은 Flex 위젯으로 단추를 래핑 할 수 있습니다.

확장 위젯을 사용하면 행, 열 또는 플렉스의 하위 항목이 확장되어 주 축의 사용 가능한 공간을 채 웁니다 (예 : 행의 경우 가로로, 열의 경우 세로로). https://docs.flutter.io/flutter/widgets/Expanded-class.html

Flexible 위젯을 사용하면 Row, Column 또는 Flex의 하위 항목이 기본 축에서 사용 가능한 공간을 채울 수있는 유연성을 제공하지만 (예 : 행의 경우 가로로 또는 열의 경우 세로로) 확장 됨과 달리 Flexible은 그렇지 않습니다. 자녀가 사용 가능한 공간을 채우도록 요구하십시오. https://docs.flutter.io/flutter/widgets/Flexible-class.html


7

간단한 해결 방법 :

컨테이너에 최상위 자식이 하나만있는 경우 자식에 대한 정렬 속성을 지정하고 사용 가능한 값을 제공 할 수 있습니다. 컨테이너의 모든 공간을 채울 것입니다.

Container(color:Colors.white,height:200.0,width:200.0,
 child:Container(
    color: Colors.yellow,
    alignment:Alignment.[any_available_option] // make the yellow child match the parent size
   )
)

또 다른 방법:

Container(color:Colors.white,height:200.0,width:200.0,
 child:Container(
    color: Colors.yellow,
    constraints:  BoxConstraints.expand(height: 100.0), // height will be 100 dip and width will be match parent
   )
)

BoxConstraints.expand(height: 100.0)안드로이드의 위대한 작품을 width="match_parent"동등한
kosiara - 바르 토스 Kosarzycki

6

이 솔루션을 사용했으며 MediaQuery를 사용하여 화면의 높이와 너비를 정의해야합니다.

 Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width
  )

5
Stack(
  children: [
    Container(color:Colors.red, height:200.0, width:200.0),
    Positioned.fill(
      child: Container(color: Colors. yellow),
    )
  ]
),

1
코드가 질문에 답할 수 있지만 좋은 대답은 항상 코드의 기능과 문제 해결 방법을 설명해야합니다.
BDL

이것은 포장 내용에 대한 대답이 아닙니다. 이것은 단순히 하드 코딩 된 너비와 높이입니다.
개발

1

위젯을 사용합니다 Wrap.

의 경우 Column와 같은 행동 시도 :

  return Wrap(
          direction: Axis.vertical,
          spacing: 10,
          children: <Widget>[...],);

의 경우 Row와 같은 행동 시도 :

  return Wrap(
          direction: Axis.horizontal,
          spacing: 10,
          children: <Widget>[...],);

추가 정보 : 랩 (Flutter 위젯)


0

컬럼 내에서이 코드 라인을 사용하십시오. wrap_content의 경우 : mainAxisSize: MainAxisSize.min match_parent의 경우 :mainAxisSize: MainAxisSize.max


0

실제로이를 수행하는 매우 쉽고 깔끔한 방법이 있습니다.

FractionallySizedBox위젯을 사용하십시오 .

FractionallySizedBox(
  widthFactor: 1.0, // width w.r.t to parent
  heightFactor: 1.0,  // height w.r.t to parent
  child: *Your Child Here*
}

이 위젯은 부모 크기의 일부로 자녀의 크기를 조정하려는 경우에도 매우 유용합니다.

예:

자녀가 부모 너비의 50 %를 차지하도록하려면 다음을 제공하십시오 widthFactor.0.5


0

자식이 부모를 채우도록하려면 FittedBox에 래핑하면됩니다.

    FittedBox(
     child: Image.asset('foo.png'),
     fit: BoxFit.fill,
   )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.