Flutter: Mở rộng so với Linh hoạt


100

Tôi đã sử dụng cả hai ExpandedFlexiblewidget và chúng dường như hoạt động giống nhau. Có sự khác biệt nào giữa hai thứ mà tôi đã bỏ qua không?

Câu trả lời:


118
Scaffold(
  appBar: AppBar(),
  body: Column(
    children: <Widget>[
      Row(
        children: <Widget>[
          buildExpanded(),
          buildFlexible(),
        ],
      ),
      Row(
        children: <Widget>[
          buildExpanded(),
          buildExpanded(),
        ],
      ),
      Row(
        children: <Widget>[
          buildFlexible(),
          buildFlexible(),
        ],
      ),
    ],
  ),
);

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


6
Linh hoạt chỉ chiếm không gian cần thiết và Mở rộng lấy tất cả không gian có sẵn, tôn trọng flexyếu tố này. Xem tài liệu của Expandedtiện ích để biết thêm thông tin.
Aleksandar

100

Expanded chỉ là cách viết tắt của Flexible

Sử dụng mở rộng theo cách này:

Expanded(
  child: Foo(),
);

hoàn toàn tương đương với:

Flexible(
  fit: FlexFit.tight,
  child: Foo(),
);

Bạn có thể muốn sử dụng Flexiblehơn Expandedkhi bạn muốn một sự khác biệt fit, hữu ích trong một số bố cục đáp ứng.

Sự khác biệt giữa FlexFit.tightFlexFit.looselà lỏng lẻo sẽ cho phép con của nó có kích thước tối đa trong khi chặt buộc con đó phải lấp đầy tất cả không gian có sẵn.


1
không Maximum sizeAvailable spacecó nghĩa là điều tương tự ở đây?
CopsOnRoad

Không, bởi MaximumSize Tôi có nghĩa là một cái gì đó giống như có là con của Flexible một ConstrainedBox với một maxHeight bên trong một cột
Rémi Rousselet

25
Nói một cách dễ hiểu, Flexible.tightsẽ buộc bọn trẻ phải chiếm toàn bộ không gian có sẵn và Flexible.looseđể bọn trẻ làm những gì chúng muốn. Một số trẻ em có thể chiếm toàn bộ không gian và một số thì không, tùy thuộc vào loại của chúng.
CopsOnRoad vào

30

Tiện ích con trong Linh hoạt theo mặc định là WRAP_CONTENT mặc dù bạn có thể thay đổi nó bằng cách sử dụng tham số Fit.

Tiện ích con trong Đã mở rộngMATCH_PARENT, bạn có thể thay đổi nó bằng cách sử dụng linh hoạt .


1
Giải thích tuyệt vời cho các nhà phát triển Android!
SwiftiSwift

19

Expanded- nó Flexiblephù hợp với bộ

class Expanded extends Flexible {
    const Expanded({
        Key key,
        int flex = 1,
        @required Widget child,
    }) : super(
        key: key, 
        flex: flex, 
        fit: FlexFit.tight, 
        child: child
    );
}

16

Bạn có thể sử dụng Linh hoạt để thay đổi kích thước các tiện ích con trong các hàngcột . Nó chủ yếu được sử dụng để điều chỉnh không gian của các widget con khác nhau trong khi vẫn giữ mối quan hệ với các widget cha của chúng.

Trong khi đó, Expanded thay đổi các ràng buộc được gửi đến con của các hàngcột ; nó giúp lấp đầy không gian có sẵn ở đó. Do đó, khi bạn bọc con mình trong một tiện ích Mở rộng, nó sẽ lấp đầy các khoảng trống.

Cung cấp những video này từ kênh YouTube chính thức của Flutter chỉ để giúp đỡ những người có thể tìm kiếm video này trong tương lai sắp tới ...

  1. Đã mở rộng:

  2. Linh hoạt:


1

Sự khác biệt duy nhất nếu bạn sử dụng Flexiblethay thế Expanded, là Flexiblecho phép con của nó có cùng chiều rộng hoặc nhỏ hơn Flexiblechính nó, trong khi Expandedbuộc con của nó phải có cùng chiều rộng chính xác của Expanded. Nhưng cả hai ExpandedFlexiblebỏ qua chiều rộng của con cái của họ khi tự định cỡ.

Row(children:[
  Flexible(
    child: Container(color: Colors.red, child: Text('This is a very long text that won’t fit the line.'))),
  Flexible(
    child: Container(color: Colors.green, child: Text(‘Goodbye!’))),
  ]
)

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

Lưu ý : Điều này có nghĩa là không thể mở rộng Rowtrẻ em tương ứng với kích thước của chúng. Hàng sử dụng chiều rộng chính xác của con hoặc bỏ qua hoàn toàn khi bạn sử dụng Expandedhoặc Flexible.


0

Expanded () không hơn gì Linh hoạt () với

Flexible (fit: FlexFit.tight) = Expanded()

nhưng, sử dụng linh hoạt fit :FlexFit.loosetheo mặc định.

FlexFit.tight = Muốn vừa khít với phụ huynh chiếm nhiều không gian nhất có thể.

FlexFit.loose = Muốn vừa với phụ huynh, chiếm ít không gian nhất có thể cho chính nó.

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.