Độ rộng của nút đối sánh gốc


119

Tôi muốn biết rằng làm cách nào để đặt chiều rộng phù hợp với chiều rộng bố cục mẹ

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,
  ),
),

Tôi biết một chút về Expandedwidget nhưng Expandedmở rộng tầm nhìn sang cả hai hướng, tôi không biết phải làm thế nào.


1
Có lẽ một Cột thay thế?
Günter Zöchbauer

Có, tôi đính kèm cột thay vì container nhưng chiều rộng nút là Gói nội dung như thế nào có thể kéo dài chiều rộng để cha mẹ
Mohit Suthar

Bạn chỉ có thể sử dụng một FlatButton và quấn nó bên trong một container và thêm chiều rộng của container với chiều rộng màn hình bằng cách sử dụng mediaquery nhìn cho câu trả lời của tôi dưới đây
maheshmnj

Câu trả lời:


263

Giải pháp chính xác sẽ là sử dụng SizedBox.expandtiện ích con, tiện ích này bắt buộc nó childphải phù hợp với kích thước của phụ huynh.

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

Có nhiều lựa chọn thay thế, cho phép tùy chỉnh nhiều hơn hoặc ít hơn:

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

hoặc sử dụng một ConstrainedBox

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

31
SizedBox.expand sẽ làm cho nút có chiều rộng và chiều cao đầy đủ, đây không phải là câu hỏi. Câu hỏi là về một nút bao gồm toàn bộ chiều rộng chứ không chỉ chiều cao.
Vinoth Kumar

3
Nhận xét của @ RémiRousselet Vinoth là hợp lệ. Vì đây hiện là câu trả lời được chấp nhận, bạn có thể thêm các hàm tạo phù hợp cho SizedBox để chỉ mở rộng chiều rộng một cách cụ thể không?
user823447

Tôi nhận được lỗi nàyFailed assertion: line 1645 pos 12: '!_debugDoingThisLayout': is not true.
kapsid

Thnaks cho giải pháp
Ajay Kumar

Tôi thích câu trả lời cả hai chiều, nó đầy đủ hơn.
Raiden Core

30

Thuộc tính kích thước có thể được cung cấp sử dụng ButtonThemevớiminWidth: double.infinity

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

hoặc sau khi https://github.com/flutter/flutter/pull/19416 hạ cánh

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


24

Cách đơn giản nhất là sử dụng một FlatButtonbao bọc bên trong a Container, Nút theo mặc định có kích thước bằng kích thước cha của nó và do đó, gán chiều rộng mong muốn cho 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,
                      ),
                    ),
                  ),
                )

Đầu ra:

nhập mô tả hình ảnh ở đây


17

Sau một số nghiên cứu, tôi đã tìm ra một số giải pháp và cảm ơn @ Günter Zöchbauer,

Tôi đã sử dụng cột thay vì Vùng chứa và

đặt thuộc tính thành cột CrossAxisAlignment.stretch để Điền đối sánh cha của Nút

    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/ Rowkhông nên được sử dụng cho bố cục một con. Sử dụng giải pháp thay thế một con. Chẳng hạn như Align, SizedBoxvà tương tự.
Rémi Rousselet

4

@Mohit Suthar,

Đã tìm thấy một trong những giải pháp tốt nhất để đối sánh cha mẹ với chiều rộng cũng như chiều cao như bên dưới

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")),
        ), 

Ở đây bạn có thể kiểm tra các Expandedđiều khiển Có được toàn bộ vẫn chiều rộngchiều cao .


1
Cho đến nay nó là giải pháp tốt nhất
M David

4

Điều này đã làm việc cho tôi.

Cách đơn giản nhất để cung cấp chiều rộng hoặc chiều cao của đối sánh gốc trong mã đã cho ở trên.

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

4

Cho match_parentbạn có thể sử dụng

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

Đối với bất kỳ giá trị cụ thể nào bạn có thể sử dụng

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

4

Bạn có thể đặt phụ huynh phù hợp của tiện ích bằng cách

1) đặt chiều rộng thành gấp đôi. Vô cực :

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) Sử dụng 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,
          ),
        ),

1

Đoạn mã sau phù hợp với tôi

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

1

Điều này đang làm việc cho tôi trong một widget độc lập.

  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

Điều này đang làm việc cho tôi.

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

1

Sử dụng một ListTilecũng hoạt động, vì một danh sách lấp đầy toàn bộ chiều rộng:

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

1

bạn có thể làm điều đó với MaterialButton

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

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

0

Cái này làm việc cho tôi

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

0

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) Nó làm việc cho tôi.


0

Cách tiếp cận cơ bản nhất là sử dụng Container bằng cách xác định chiều rộng của nó là vô hạn. Xem ví dụ dưới đây về mã

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,
                ),
              ),
            )

Một cái gì đó như thế này làm việc cho tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.