Flutter에서 RaisedButton의 너비를 설정하는 방법은 무엇입니까?


126

RaisedButtonFlutter에서 a의 너비를 설정할 수 없음을 보았습니다 . 내가 잘 이해 한 경우, 나는을 넣어해야 RaisedButtonSizedBox. 그런 다음 상자의 너비 또는 높이를 설정할 수 있습니다. 맞습니까? 다른 방법이 있습니까?

이것은 SizedBox모든 버튼 주위 에 생성하는 것이 약간 지루 하므로 왜 이런 식으로 선택했는지 궁금합니다. 나는 그들이 그렇게 할 타당한 이유가 있다고 확신하지만 나는 그것을 보지 못합니다. 스캐 폴딩은 초보자를 위해 읽고 만들기가 매우 어렵습니다.

new SizedBox(
  width: 200.0,
  height: 100.0,
  child: new RaisedButton(
    child: new Text('Blabla blablablablablablabla bla bla bla'),
    onPressed: _onButtonPressed,
  ),
),

2
이 호를 읽으십시오 : github.com/flutter/flutter/issues/10492
Blasanka

3
너비가 고정 된 UI 디자인은 앱을 액세스 가능 (더 큰 글꼴 크기 제공) 또는 다국어 (일부 언어는 다른 언어보다 더 장황함)로 설정하려는 경우 골칫거리가 될 수 있습니다.
Ruud Helderman

답변:


240

여기 문서 에서 말했듯이

돌출 된 버튼의 최소 크기는 88.0 x 36.0이며 ButtonTheme로 덮어 쓸 수 있습니다.

그렇게 할 수 있습니다

ButtonTheme(
  minWidth: 200.0,
  height: 100.0,
  child: RaisedButton(
    onPressed: () {},
    child: Text("test"),
  ),
);

8
"match_parent"와 같은 것이 있습니까?
Pawan

2
당신은 width:MediaQuery.of(context).size.width또는 사용할 수 있습니다width:double.infinity
Oush

2
확장 된 위젯으로 감싸십시오
janosch

2
그것은 모든 기본 buttontheme 값을 제거
무라트 Özbayraktar

101

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

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

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

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

흥미로운 솔루션입니다. 그런 다음 여백을 사용하여 측면에 빈 공간을 두어야한다고 생각합니다.
OlivierGrenoble

이 경우 Container대신 사용해야 합니다.SizedBox
CopsOnRoad

@CopsOnRoad SizedBox는 고정 크기 상자를 만듭니다. 컨테이너 위젯과 달리 Sized Box에는 색상 또는 장식 매개 변수가 없습니다. 따라서 너비 만 설정해야한다면 SizedBox가 더 명확합니다. 이 답변을 확인하여 더 많은 정보를 찾을 수도 있습니다. stackoverflow.com/questions/55716322
Hasan El-Hefnawy

1
@ HasanEl-Hefnawy 나는 그것이 크기의 상자를 사용하는 이유를 알고 있습니다. 하지만 누군가 마진을 요구하고 있었고 저는 그에게 컨테이너 솔루션으로 답장했습니다
CopsOnRoad

19

플러터는 크기에 관한 것이 아니기 때문입니다. 제약에 관한 것입니다.

일반적으로 두 가지 사용 사례가 있습니다.

  • 위젯의 자식은 제약 조건을 정의합니다. 상위 크기 자체는 해당 정보를 기반으로합니다. ex : Padding, 자식 제약 조건을 취하고 증가시킵니다.
  • 부모는 자식에게 제약을 적용합니다. 예 : SizedBox,하지만 Columnstrech 모드에서도 ...

RaisedButton첫 번째 경우입니다. 즉, 자체 높이 / 너비를 정의하는 버튼입니다. 그리고 재료 규칙에 따라 올린 버튼 크기가 고정됩니다.

이러한 동작을 원하지 않으므로 두 번째 유형의 위젯을 사용하여 버튼 제약 조건을 재정의 할 수 있습니다.


어쨌든 이것이 많이 필요하다면 당신을 위해 일하는 새로운 위젯을 만드는 것을 고려하십시오. 또는 MaterialButton높이 속성이있는를 사용하십시오 .


15

다음과 같이 할 수있는 것보다 MaterialButton을 사용하는 것이 좋습니다.

new MaterialButton( 
 height: 40.0, 
 minWidth: 70.0, 
 color: Theme.of(context).primaryColor, 
 textColor: Colors.white, 
 child: new Text("push"), 
 onPressed: () => {}, 
 splashColor: Colors.redAccent,
)

minWidth를 사용하는 것은 너비 설정에 대한 질문에 완전히 대답하지 않습니다. 여기에서는 Wrap 부모 위젯을 사용하는 것이 도움이 될 수 있습니다.
AlanKley

라벨을 단단히 감싸는 작은 버튼을 얻는 데 적합합니다.
hawkbee

6

확장 된 위젯을 사용해야합니다. 그러나 버튼이 열에있는 경우 확장 된 위젯이 나머지 열을 채 웁니다. 따라서 확장 된 위젯을 한 행으로 묶어야합니다.

Row(children: <Widget>[
Expanded(
  flex: 1,
  child: RaisedButton(
    child: Text("Your Text"),
      onPressed: _submitForm,
    ),
  ),),])

"The Expanded You"-확장 된 위젯을 의미합니까?
Yasir

flex 기본값은 1이며 지정할 필요가 없습니다.
c49

확장 된 작품. 감사합니다
Sravan

6

Raise 버튼을 부모와 일치시키는 가장 선호하는 방법은 컨테이너로 감싸는 것입니다. 아래는 샘플 코드입니다.

Container(
          width: double.infinity,
          child: RaisedButton(
                 onPressed: () {},
                 color: Colors.deepPurpleAccent[100],
                 child: Text(
                        "Continue",
                        style: TextStyle(color: Colors.white),
                      ),
                    ),
                  )

5

이 코드는 RaisedButton에 너비를 직접 지정할 수없고 자식에 너비를 지정할 수 있으므로 문제를 더 잘 해결하는 데 도움이됩니다.

double width = MediaQuery.of(context).size.width;
var maxWidthChild = SizedBox(
            width: width,
            child: Text(
              StringConfig.acceptButton,
              textAlign: TextAlign.center,
            ));

RaisedButton(
        child: maxWidthChild,
        onPressed: (){},
        color: Colors.white,
    );

또한 버튼이 화면의 80 %가되도록하려면 다음과 같이 할 수 있습니다.width * 0.8
Kirill Karmazin

5

FractionallySizedBox, where widthFactorheightFactor 앱 / 부모 크기의 비율을 정의하기 만하면됩니다 .

FractionallySizedBox(
widthFactor: 0.8,   //means 80% of app width
child: RaisedButton(
  onPressed: () {},
  child: Text(
    "Your Text",
    style: TextStyle(color: Colors.white),
  ),
  color: Colors.red,
)),

4

미디어 쿼리를 사용하여 크고 작은 화면에서 동일하게 실행되는 솔루션에 너비를 현명하게 사용하십시오.

  Container(
            width: MediaQuery.of(context).size.width * 0.5, // Will take 50% of screen space
            child: RaisedButton(
              child: Text('Go to screen two'),
              onPressed: () => null
            ),
          )

유사한 솔루션을 적용 할 SizeBox수도 있습니다.


3

모든의 높이와 minWidth를 전역 적으로 변경하려면 내부에서 RaisedButton재정의 할 수 있습니다 .ThemeDataMaterialApp

 @override
  Widget build(BuildContext context) {
    return MaterialApp(
       ...
       theme: ThemeData(
       ...
       buttonTheme: ButtonThemeData(
          height: 46,
          minWidth: 100,
       ),
    ));
  }

3

컨테이너 내부에 RaisedButton을 감싸고 컨테이너 위젯에 너비를 제공합니다.

예 :

 Container(
 width : 200,
 child : RaisedButton(
         child :YourWidget ,
         onPressed(){}
      ),
    )

3

앱 전체에서 사용되는 버튼과 같은 전역 메서드를 만들 수 있습니다. 컨테이너 내부의 텍스트 길이에 따라 크기가 조정됩니다. FittedBox 위젯은 그 안의 자식에 따라 위젯을 맞추는 데 사용됩니다.

Widget primaryButton(String btnName, {@required Function action}) {
  return FittedBox(
  child: RawMaterialButton(
  fillColor: accentColor,
  splashColor: Colors.black12,
  elevation: 8.0,
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
  child: Container(
    padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 13.0),
    child: Center(child: Text(btnName, style: TextStyle(fontSize: 18.0))),
  ),
  onPressed: () {
    action();
   },
  ),
 );
}

특정 너비와 높이의 버튼을 원한다면 RawMaterialButton의 제약 속성을 사용하여 버튼의 최소 최대 너비와 높이를 제공 할 수 있습니다.

constraints: BoxConstraints(minHeight: 45.0,maxHeight:60.0,minWidth:20.0,maxWidth:150.0),

1

주석에서 말한대로 수행하거나 노력을 절약하고 RawMaterialButton으로 작업 할 수 있습니다. 모든 것이 있고 테두리를 원형으로 변경할 수 있고 다른 속성을 많이 사용할 수 있습니다. ex shape (반경을 늘려 더 원형을 만듭니다)

shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),//ex add 1000 instead of 25

위젯 인 GestureDetector를 사용하여 원하는 모양을 버튼으로 사용할 수 있으며 하위 속성 아래에 다른 위젯을 허용합니다. 여기 다른 예 에서처럼

GestureDetector(
onTap: () {//handle the press action here }
child:Container(

              height: 80,
              width: 80,
              child:new Card(

                color: Colors.blue,
                shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
                elevation: 0.0,                
              child: Icon(Icons.add,color: Colors.white,),
              ),
              )
)

1

버튼이 Flex위젯 ( Row& 포함 Column)에 배치 된 경우 확장 된 위젯 을 사용하여 사용 가능한 공간을 채울 수 있습니다.


2
Expanded는 부모가 지원하는 경우에만 작동 할 수 있습니다.
CopsOnRoad

Expanded같은 멀티 자식 위젯에 사용하도록되어 RowColumn.
Loolooii

0

제 경우에는 여백을 사용하여 크기를 변경할 수 있습니다.

Container(


     margin: EdgeInsets.all(10),

    // or margin: EdgeInsets.only(left:10, right:10),



        child: RaisedButton(
          padding: EdgeInsets.all(10),

          shape: RoundedRectangleBorder(borderRadius: 
BorderRadius.circular(20)),
          onPressed: () {},
          child: Text("Button"),
        ),
      ),

0

그것을 시도

Expanded(   
  child: RaisedButton(
    onPressed: _onButtonPressed,
    child: Text('Button1')
  )  
)

0

모든 버튼 테마 설정을 제거하지 않으려면.




ButtonTheme.fromButtonThemeData(
  data: Theme.of(context).buttonTheme.copyWith(
                minWidth: 200.0,
                height: 100.0,,
              )
  child: RaisedButton(
    onPressed: () {},
    child: Text("test"),
  ),
);


0

Column () 안에 버튼이 있고 버튼이 최대 너비를 갖도록하려면 다음을 설정하십시오.

crossAxisAlignment : CrossAxisAlignment.stretch

열 위젯에서. 이제이 Column () 아래의 모든 것은 사용 가능한 최대 너비를 갖습니다.


-1

이것은 나를 위해 일했습니다. 컨테이너는 높이를 제공하고 FractionallySizedBox는 RaisedButton의 너비를 제공합니다.

Container(
  height: 50.0, //Provides height for the RaisedButton
  child: FractionallySizedBox(
    widthFactor: 0.7, ////Provides 70% width for the RaisedButton
    child: RaisedButton(
      onPressed: () {},
    ),
  ),
),

-2

전체 너비 버튼을위한 짧고 달콤한 솔루션 :

Row(
  children: [
    Expanded(
      child: ElevatedButton(...),
    ),
  ],
)

짧지도 달지도 않습니다. 단순히 트리 계층 구조에 중복 된 위젯을 추가하는 것입니다. 왜 단순히 사용하지 double.infinityA의 SizedBox? 그것은 훨씬 "짧고" "더 달콤"할 것입니다.
iDecode

이 예제는 중복 위젯을 사용하지 않습니다. 다른 위젯으로 동일한 결과를 얻을 수 있다는 것을 의미한다면 그것은 다르다고 말할 것입니다. 어쨌든 고정 된 크기없이 SizedBox를 사용할 수 있다는 것을 몰랐습니다. 그것을 살펴보면 SizedBox.expand()double.infinity를 사용하는 것보다 더 나은 것을 발견 했습니다.
fromvega

SizedBox.expand기본적으로 SizedBoxwith width이고로 height설정됩니다 double.infinity. 그래서, 당신조차도에 SizedBox.expand관한 OP 질문에 대답 width하지 않을 것 width + height입니다.
iDecode

어쨌든 질문의 제목은 버튼의 너비를 설정하는 것입니다. 내 대답은 버튼을 전체 너비로 만드는 방법을 찾고 여기에 온 나와 같은 다른 사람들에게 도움이되었다고 생각합니다.
fromvega

귀하의 답변은 더 간단한 작업을 수행하기 위해 불필요한 위젯을 추가합니다. 성능에 좋지 않을 수 있습니다.
iDecode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.