Container widget được sử dụng để chứa child widget với khả năng áp dụng một số thuộc tính styling.
Nếu Container widget không có child, nó sẽ tự động lấp đầy vùng đã cho trên màn hình, nếu không, nó sẽ wrap chiều cao và chiều rộng của child element đã cho.
Lưu ý: Container Widget không nên hiển thị trực tiếp mà không có bất kỳ parent widget. Bạn có thể sử dụng Center widget, Padding Widget, Column Widget, Row Widget hoặc Scaffold Widget với tư cách là parent.
Hãy bắt đầu với một empty container và áp dụng một green color property. Container sẽ lấp đầy tất cả màn hình.
Center(
child: Container(
color: Colors.green,
),
);
Hãy thêm child cho container
Center(
child: Container(
color: Colors.green,
child: Text("Flutter CheatSheet."),
),
);
Chúng ta có thể thấy rằng container có kích thước của child. (Chúng ta sẽ nói sau về Text Widget).
Color Property
Bạn có thể sử dụng color property để thêm background cho container.
Bạn sẽ sử dụng Color Class hoặc Colors Class với color property như bên dưới:
Colors Class
sử dụng Colors Class với color name
Center(
child: Container(
color: Colors.green,
),
);
Bạn cũng có thể thêm shade
Center(
child: Container(
color: Colors.green[400],
),
);
Hoặc
Center(
child: Container(
color: Colors.green.shade400,
),
);
Color Class
Sử dụng Color Class với đầy đủ 8 chữ số thập lục phân không phải là 6. Nếu bạn chỉ chỉ định sáu, thì hai chữ số hàng đầu được giả định là 0, có nghĩa là hoàn toàn trong suốt.
Color(0xFFFFFF); // fully transparent white (invisible)
Color(0xFFFFFFFF); // fully opaque white (visible)
Bạn có thể sử dụng.fromARGB
(A = Alpha hoặc opacity, R = Red, G = Green, B = Blue) với số màu hoặc số thập lục phân
Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5);
Color.fromARGB(255, 66, 165, 245);
Và bạn có thể sử dụng.fromRGBO
(R = Red, G = Green, B = Blue, O = Opacity) với số màu (color number)
Color c = const Color.fromRGBO(66, 165, 245, 1.0);
Child Property
Cung cấp child widget được chứa trong container, container sẽ wrap chiều rộng & chiều cao của child widget này.
Widget này chỉ có thể có một child. Để bố trí nhiều children, hãy để child của widget này là một widget như Row, Column, hoặc Stack, có children
property và sau đó cung cấp các children cho widget đó.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
child: new Text("Flutter Cheatsheet"),
),
);
Alignment Property
Chúng ta sử dụng Alignment Class với alignment property được áp dụng cho việc căn chỉnh các child widget.
Alignment nhận vào 2 tham số x và y.
Alignment(0.0, 0.0)
đại diện cho tâm của hình chữ nhật.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
child: new Text("Flutter Cheatsheet",
style: TextStyle(
fontSize: 10.0
),
),
alignment: Alignment(0.0, 0.0),
),
);
Alignment(-1.0, -1.0)
đại diện cho phía trên bên trái của hình chữ nhật.
Alignment(1.0, 1.0)
đại diện cho phía dưới bên phải của hình chữ nhật.
Alignment(0.0, 3.0)
thể hiện một điểm có tâm theo chiều ngang đối với hình chữ nhật và theo chiều dọc bên dưới đáy hình chữ nhật bằng chiều cao của hình chữ nhật.
Hình dưới đây cho thấy đồ thị của X và Y
Bạn cũng có thể sử dụng một tên cố định với class Alignment
Alignment.bottomCenter
Điểm chính giữa dọc theo cạnh dưới giống nhưAlignment(0.0, 1.0)
Alignment.bottomLeft
Góc dưới cùng bên trái giống vớiAlignment(-1.0, 1.0)
Alignment.bottomRight
Góc dưới cùng bên phải giống vớiAlignment(1.0, 1.0)
Alignment.center
Điểm trung tâm, theo cả chiều ngang và chiều dọc giống nhưAlignment(0.0, 0.0)
Alignment.centerLeft
Điểm chính giữa dọc theo cạnh trái giống nhưAlignment(-1.0, 0.0)
Alignment.centerRight
Điểm chính giữa dọc theo cạnh bên phải giống nhưAlignment(1.0, 0.0)
Alignment.topCenter
Điểm chính giữa dọc theo cạnh trên giống như Alignment(0.0, -1.0)
Alignment.topLeft
Góc trên cùng bên trái giống vớiAlignment(-1.0, -1.0)
Alignment.topRight
Góc trên cùng bên phải giống vớiAlignment(1.0, -1.0)
Bạn có thể sử dụng FractionalOffset Class với alignment property.
FractionalOffset và Alignment là hai đại diện khác nhau của cùng một thông tin: vị trí bên trong hình chữ nhật so với kích thước của hình chữ nhật. Sự khác biệt giữa hai class là trong hệ thống tọa độ mà chúng sử dụng để biểu diễn vị trí.
FractionalOffset sử dụng hệ tọa độ có điểm gốc ở góc trên bên trái của hình chữ nhật trong khi Alignment sử dụng hệ tọa độ có điểm gốc ở tâm hình chữ nhật.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
child: new Text("Flutter Cheatsheet",
style: TextStyle(
fontSize: 20.0
),
),
alignment: FractionalOffset(0.5, 0.5),
),
);
Bạn cũng có thể sử dụng một tên cố định với class FractionalOffset
FractionalOffset.bottomCenter
Điểm chính giữa dọc theo cạnh dưới giống vớiFractionalOffset(0.5, 1.0)
FractionalOffset.bottomLeft
Góc dưới bên trái giống vớiFractionalOffset(0.0, 1.0)
FractionalOffset.bottomRight
Góc dưới cùng bên phải giống vớiFractionalOffset(1.0, 1.0)
FractionalOffset.center
Điểm trung tâm, theo cả chiều ngang và chiều dọc giống nhưFractionalOffset(0.5, 0.5)
FractionalOffset.centerLeft
Điểm chính giữa dọc theo cạnh trái giống vớiFractionalOffset(0.0, 0.5)
FractionalOffset.centerRight
Điểm trung tâm dọc theo cạnh bên phải giống nhưFractionalOffset(1.0, 0.5)
FractionalOffset.topCenter
Điểm chính giữa dọc theo cạnh trên giống vớiFractionalOffset(0.5, 0.0)
FractionalOffset.topLeft
Góc trên bên trái giống vớiFractionalOffset(0.0, 0.0)
FractionalOffset.topRight
Góc trên cùng bên phải giống vớiFractionalOffset(1.0, 0.0)
Bạn có thể sử dụng AlignmentDirectional Class với alignment property.
Offset được biểu thị dưới dạng một phần của Size, nhưng có horizontal component phụ thuộc vào writing direction.
Điều này có thể được sử dụng để chỉ ra offset từ bên trái trong văn bản TextDirection.ltr và offset từ bên phải trong văn bản TextDirection.rtl mà không cần phải biết text direction hiện tại.
Bạn cũng có thể sử dụng một tên cố định với class AlignmentDirectional
AlignmentDirectional.bottomCenter
Điểm chính giữa dọc theo cạnh dưới giống nhưAlignmentDirectional(0.0, 1.0)
AlignmentDirectional.bottomEnd
Góc dưới cùng ở phía "cuối" giống vớiAlignmentDirectional(1.0, 1.0)
AlignmentDirectional.bottomStart
Góc dưới cùng ở phía "bắt đầu" giống vớiAlignmentDirectional(-1.0, 1.0)
AlignmentDirectional.center
Điểm trung tâm, theo cả chiều ngang và chiều dọc giống nhưAlignmentDirectional(0.0, 0.0)
AlignmentDirectional.centerEnd
Điểm trung tâm dọc theo cạnh "cuối" giống nhưAlignmentDirectional(1.0, 0.0)
AlignmentDirectional.centerStart
Điểm chính giữa dọc theo cạnh "bắt đầu" giống nhưAlignmentDirectional(-1.0, 0.0)
AlignmentDirectional.topCenter
Điểm chính giữa dọc theo cạnh trên giống nhưAlignmentDirectional(0.0, -1.0)
AlignmentDirectional.topEnd
Góc trên cùng ở phía "cuối" giống vớiAlignmentDirectional(1.0, -1.0)
AlignmentDirectional.topEnd
Góc trên cùng ở phía "bắt đầu" giống vớiAlignmentDirectional(-1.0, -1.0)
Constraints Property
Constraint chỉ là một thuộc tính chỉ định kích thước hoặc không gian mà một widget có thể lấy. Hầu hết các widget và giao diện người dùng có thể được xây dựng bằng cách sử dụng BoxConstraint đơn giản.
BoxConstraint chỉ quan tâm đến minWidth, maxWidth, minHeight và maxHeight.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
constraints: BoxConstraints(
maxHeight: 300.0,
maxWidth: 200.0,
minWidth: 150.0,
minHeight: 150.0
),
),
),
);
Như chúng ta đã biết trước đây, nếu container widget không có child, nó sẽ tự động lấp đầy vùng đã cho trên màn hình và bởi vì chúng ta có chiều rộng tối đa và chiều cao tối đa nên container sẽ lấp đầy kích thước vùng của chiều rộng tối đa và chiều cao tối đa.
Hãy thêm Text widget vào container.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
child: Text("Flutter"),
constraints: BoxConstraints(
maxHeight: 300.0,
maxWidth: 200.0,
minWidth: 150.0,
minHeight: 150.0
),
),
),
);
Bởi vì có child trong container, nó sẽ wrap chiều cao và chiều rộng của child element đã cho và vì chúng ta có chiều rộng tối thiểu và chiều cao tối thiểu, vì vậy nó sẽ lấy kích thước đã cho trong BoxConstraints.
Hãy thử với một văn bản dài.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
child: Text("Flutter Cheatsheet Flutter Cheatsheet"),
constraints: BoxConstraints(
maxHeight: 300.0,
maxWidth: 200.0,
minWidth: 150.0,
minHeight: 150.0
),
),
),
);
Chúng ta có thể thấy trong ảnh chụp màn hình, container không thể sử dụng nhiều hơn chiều rộng tối đa và chiều cao tối đa.
Nếu chúng ta cần mở rộng container của mình đến kích thước tối đa ngay cả khi container có child, chúng ta có thể sử dụng BoxConstraints.expand()
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
child: Text("Flutter"),
constraints: BoxConstraints.expand(),
),
),
);
Chúng ta có thể thấy rằng container đã không wrap chiều cao và chiều rộng của child element đã cho, nó đã sử dụng đến mức tối đa.
Bạn cũng có thể thiết lập chiều rộng và chiều cao dưới dạng tham số.
Margin Property
Margin chỉ là một thuộc tính chỉ định để thêm không gian trống bao quanh container bằng cách sử dụng giá trị không đổi EdgeInsets.
EdgeInsets.all()
nếu bạn cần canh lề ở tất cả các bên
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
margin: new EdgeInsets.all(20.0),
),
),
);
EdgeInsets.symmetric()
Nếu bạn cần thêm lề với các hiệu số dọc và/hoặc ngang đối xứng
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
margin: new EdgeInsets.symmetric(
vertical: 20.0,
horizontal: 50.0
),
),
),
);
EdgeInsets.fromLTRB()
Nếu bạn cần thêm lề từ các hiệu số từ trái, trên, phải và dưới.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
margin: new EdgeInsets.fromLTRB(20.0, 30.0, 40.0, 50.0),
),
),
);
EdgeInsets.only()
Nếu bạn cần thêm lề chỉ với các giá trị đã cho khác 0.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
color: Colors.green,
margin: new EdgeInsets.only(
left: 20.0,
bottom: 40.0,
top: 50.0
),
),
),
);
Padding Property
Padding chỉ là một thuộc tính được chỉ định để thêm không gian trống bên trong container bằng cách sử dụng một giá trị không đổi EdgeInsets giống như lề.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
margin: new EdgeInsets.only(
left: 20.0,
bottom: 40.0,
top: 50.0
),
padding: new EdgeInsets.all(40.0),
color: Colors.green,
child: Text("Flutter Cheatsheet"),
constraints: BoxConstraints.expand(),
),
),
);
ForegroundDecoration Property
A decoration property can be applied in front of the given container.
The value can be
- BoxDecoration Class
- FlutterLogoDecoration Class
- ShapeDecoration Class
- UnderlineTabIndicator Class
We will talk about the above class later in a different article
Decoration Property
Decoration property có thể được áp dụng phía sau container đã cho.
Giá trị có thể là:
- class BoxDecoration
- class FlutterLogoDecoration
- class ShapeDecoration
- class UnderlineTabIndicator
Transform Property
Thực hiện chuyển đổi trên container khi nó được bố trí. Chúng ta sử dụng class Matrix làm giá trị.
Center(
child: Container(
color: Color.fromARGB(255, 66, 165, 245),
alignment: AlignmentDirectional(0.0, 0.0),
child: Container(
padding: new EdgeInsets.all(40.0),
color: Colors.green,
child: Text("Flutter Cheatsheet"),
transform: new Matrix4.rotationZ(0.5)
),
),
);
Hy vọng bạn sẽ thích bài viết này!
Bài viết được lược dịch từ Julien Louage.
Chau Le
Cực thích đồ ngọt như sữa, kem. Thích phiêu lưu mạo hiểm nhưng vì Covid mà vô tình trở thành người chia sẻ nội dung lập trình :))
follow me :
Bài viết liên quan
Tự học Dart: Các Dart Operators (toán tử) bạn cần biết
Sep 02, 2023 • 18 min read
Flutter cơ bản: Điều cần biết khi lập trình ứng dụng đầu tiên
Aug 23, 2023 • 13 min read
Dart là gì? Giới thiệu cơ bản về ngôn ngữ lập trình Dart
Aug 21, 2023 • 11 min read
Flutter là gì? Vì sao nên học công cụ lập trình Flutter?
Aug 19, 2023 • 11 min read
Flutter cơ bản: Widget Tree, Element Tree & Render Tree
Aug 19, 2023 • 10 min read
So sánh StatelessWidget và StatefulWidget
Jul 17, 2022 • 12 min read