버튼 너비 일치 부모


120

부모 레이아웃 너비 와 일치하도록 너비를 어떻게 설정할 수 있는지 알고 싶습니다.

new Container(
  width: 200.0,
  padding: const EdgeInsets.only(top: 16.0),
  child: new RaisedButton(
    child: new Text(
        "Submit",
        style: new TextStyle(
          color: Colors.white,
        )
    ),
    colorBrightness: Brightness.dark,
    onPressed: () {
      _loginAttempt(context);
    },
    color: Colors.blue,
  ),
),

나는 Expanded위젯 에 대해 조금 알고 있지만 Expanded두 방향으로보기를 확장합니다. 어떻게 해야할지 모르겠습니다.


1
대신 칼럼일까요?
Günter Zöchbauer

그래, 난 대신 컨테이너의 열을 연결하지만 버튼의 폭은 부모 폭을 늘릴 수있는 방법을 랩 내용입니다
Mohit Suthar

당신은 단순히 FlatButton를 사용하여 컨테이너 내부를 감싸고 아래에있는 내 대답을 mediaquery 모양을 사용하여 화면 폭에 컨테이너의 폭을 추가 할 수 있습니다
maheshmnj

답변:


264

올바른 해결책은 SizedBox.expand위젯 을 사용하여 child부모의 크기와 일치하도록 강제하는 것입니다.

SizedBox.expand(
  child: RaisedButton(...),
)

더 많거나 적은 사용자 정의를 허용하는 많은 대안이 있습니다.

SizedBox(
  width: double.infinity,
  // height: double.infinity,
  child: RaisedButton(...),
)

또는 사용 ConstrainedBox

ConstrainedBox(
    constraints: const BoxConstraints(minWidth: double.infinity),
    child: RaisedButton(...),
)

31
SizedBox.expand는 버튼이 전체 너비와 높이를 갖도록 만들 것입니다. 질문은 높이가 아닌 전체 너비를 덮는 버튼에 관한 것입니다.
Vinoth Kumar

3
@ RémiRousselet Vinoth의 의견이 유효합니다. 이것이 이제 허용되는 대답이므로 SizedBox에 대한 올바른 생성자를 추가하여 특별히 너비 만 확장 할 수 있습니까?
user823447

이 오류가 표시됩니다Failed assertion: line 1645 pos 12: '!_debugDoingThisLayout': is not true.
kapsid

해결책을위한 Thnaks
Ajay Kumar

나는 양방향 대답을 좋아하며 더 완벽합니다.
Raiden Core

31

사이즈 속성하여 제공 될 수 ButtonThememinWidth: double.infinity

ButtonTheme(
  minWidth: double.infinity,
  child: MaterialButton(
    onPressed: () {},
    child: Text('Raised Button'),
  ),
),

또는 https://github.com/flutter/flutter/pull/19416 착륙 후

MaterialButton(
  onPressed: () {},
  child: SizedBox.expand(
    width: double.infinity, 
    child: Text('Raised Button'),
  ),
),


24

가장 간단한 방법은 FlatButton내부 에 래핑 된 을 사용하는 것입니다 Container. 버튼은 기본적으로 부모의 크기를 사용하므로 원하는 너비를 Container.

            Container(
                  color: Colors.transparent,
                  width: MediaQuery.of(context).size.width,
                  height: 60,
                  child: FlatButton(
                    shape: new RoundedRectangleBorder(
                      borderRadius: new BorderRadius.circular(30.0),
                    ),
                    onPressed: () {},
                    color: Colors.red[300],
                    child: Text(
                      "Button",
                      style: TextStyle(
                        color: Colors.black,
                        fontFamily: 'Raleway',
                        fontSize: 22.0,
                      ),
                    ),
                  ),
                )

산출:

여기에 이미지 설명 입력


17

조사 끝에 몇 가지 해결책을 찾았고 @ Günter Zöchbauer 덕분에

컨테이너 대신 열을 사용하고

속성을 열 CrossAxisAlignment.stretch 로 설정하여 Button의 부모와 일치합니다.

    new Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                new RaisedButton(
                  child: new Text(
                      "Submit",
                      style: new TextStyle(
                        color: Colors.white,
                      )
                  ),
                  colorBrightness: Brightness.dark,
                  onPressed: () {
                    _loginAttempt(context);
                  },
                  color: Colors.blue,
                ),
              ],
            ),

8
Column/ Row는 단일 하위 레이아웃에 사용하면 안됩니다. 대신 한 자녀 대안을 사용하십시오. 예 : Align, SizedBox및 유사.
레미 Rousselet

5

위젯의 부모 일치를 설정할 수 있습니다.

1) 너비를 double.infinity로 설정 하십시오 .

new Container(
          width: double.infinity,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),

2) MediaQuery 사용 :

new Container(
          width: MedialQuery.of(context).size.width,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),

4

@Mohit Suthar,

부모 를 아래와 같이 너비높이일치 시키는 최상의 솔루션 중 하나를 찾았 습니다.

new Expanded(
          child: new Container(
              padding: EdgeInsets.all(16.0),
              margin: EdgeInsets.all(16.0),
              decoration: new BoxDecoration(
                  color: Colors.white,
                  borderRadius:
                      const BorderRadius.all(const Radius.circular(8.0)),
                  border: new Border.all(color: Colors.black, width: 1.0)),
              child: new Text("TejaDroid")),
        ), 

여기에서 ExpandedController 가 전체 잔여 너비높이를 획득 하는지 확인할 수 있습니다 .


1
지금까지 최고의 솔루션
M David

4

이것은 나를 위해 일했습니다 .

위의 주어진 코드에서 일치 부모 너비 또는 높이를 제공하는 가장 간단한 방법입니다.

...
width: double.infinity,
height: double.infinity,
...

4

들어 match_parent당신이 사용할 수있는

SizedBox(
  width: double.infinity, // match_parent
  child: RaisedButton(...)
)

특정 값에 대해 사용할 수 있습니다.

SizedBox(
  width: 100, // specific value
  child: RaisedButton(...)
)

1

다음 코드는 나를 위해 작동합니다.

       ButtonTheme(
            minWidth: double.infinity,
            child: RaisedButton(child: Text("Click!!", style: TextStyle(color: Colors.white),), color: Colors.pink, onPressed: () {}))

1

이것은 자체 포함 된 위젯에서 저에게 효과적입니다.

  Widget signinButton() {
    return ButtonTheme(
      minWidth: double.infinity,
      child: new FlatButton(
        onPressed: () {},
        color: Colors.green[400],
        textColor: Colors.white,
        child: Text('Flat Button'),
      ),
    );
  }

// It can then be used in a class that contains a widget tree.

1

이것은 나를 위해 일하고 있습니다.

    SizedBox(
             width: double.maxFinite,
             child: RaisedButton(
                 materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                 child: new Text("Button 2"),
                 color: Colors.lightBlueAccent,
                 onPressed: () => debugPrint("Button 2"),
              ),
     ), 

1

ListTile목록이 전체 너비를 채우므로 a를 사용하는 것도 작동합니다.

ListTile(
  title: new RaisedButton(...),
),

1

당신은 재치 MaterialButton 할 수 있습니다

MaterialButton(
     padding: EdgeInsets.all(12.0),
     minWidth: double.infinity,
     onPressed: () {},
    child: Text("Btn"),
)

0
 new SizedBox(
  width: 100.0,
     child: new RaisedButton(...),
)

0

이것은 나를 위해 일했습니다.

width: MediaQuery.of(context).size.width-100,

0

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) 그것은 나를 위해 작동합니다.


0

가장 기본적인 접근 방식은 너비를 무한대로 정의하여 컨테이너를 사용하는 것입니다. 아래 코드 예제 참조

Container(
    width: double.infinity,
    child:FlatButton(
        onPressed: () {
            //your action here
        },
        child: Text("Button"),

    )
)

0
         OutlineButton(
              onPressed: () {
                logInButtonPressed(context);
              },
              child: Container(
                width: MediaQuery.of(context).size.width / 2,
                child: Text(Log in,
                  textAlign: TextAlign.center,
                ),
              ),
            )

이와 같은 것이 저에게 효과적입니다.


0

당신의 장소 RaisedButton(...)에서 a를SizedBox

SizedBox(
  width: double.infinity,
  child: RaisedButton(...),
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.