aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

Flutter Expanded và Flexible: cho Text trong Row một giới hạn chiều rộng

Suong Nguyen by Suong Nguyen
27/10/2026
in Flutter
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một hàng gồm icon, tiêu đề và nhãn trạng thái có thể chạy đẹp với chữ ngắn nhưng tràn khi tên tài liệu dài. Thêm maxLines chưa đủ nếu Text chưa nhận một giới hạn chiều rộng hữu ích. Bạn cần xem cách Row phân phối phần không gian còn lại.

Bài dành cho người đã tạo được ứng dụng Flutter cơ bản. Các API được đối chiếu ngày 27/10/2026; trang hướng dẫn constraints hiện ghi phạm vi Flutter 3.47. Ví dụ được rà theo tài liệu, chưa build hoặc chạy widget test trong lượt biên tập, nên phần kiểm tra giao diện dưới đây là việc cần thực hiện trên dự án của bạn.

1. Dành phần còn lại cho tiêu đề

Đặt ví dụ sau vào lib/main.dart của ứng dụng Flutter. Không cần package ngoài SDK:

import 'package:flutter/material.dart';

void main() => runApp(const MaterialApp(home: DemoPage()));

class DemoPage extends StatelessWidget {
  const DemoPage({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: SafeArea(
        child: Padding(
          padding: EdgeInsets.all(16),
          child: Row(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Icon(Icons.article_outlined),
              SizedBox(width: 8),
              Expanded(
                child: Text(
                  'Tài liệu hướng dẫn phát triển ứng dụng cho nhóm mới',
                  maxLines: 2,
                  overflow: TextOverflow.ellipsis,
                ),
              ),
              SizedBox(width: 8),
              Text('Mới'),
            ],
          ),
        ),
      ),
    );
  }
}

Trong bố cục này, Row có chiều rộng được giới hạn bởi màn hình và Padding. Icon, khoảng cách và nhãn trạng thái chiếm phần của chúng. Expanded nhận phần chiều rộng còn lại cho tiêu đề; Text có giới hạn để quyết định xuống dòng và dùng dấu rút gọn.

maxLines: 2 là lựa chọn trình bày của ví dụ, không phải quy tắc cho mọi tên tài liệu. Nếu tiêu đề là thông tin quan trọng, hãy có nơi xem đầy đủ hoặc cho phép nhiều dòng hơn.

2. Expanded và Flexible khác nhau ở yêu cầu với con

Expanded yêu cầu con lấp phần không gian được cấp theo trục chính. Flexible với FlexFit.loose cho phép con nhỏ hơn phần tối đa được cấp. Cả hai tham gia bố cục flex, nhưng khác mức ràng buộc kích thước con.

Để thử khác biệt, thay Expanded của ví dụ bằng đoạn sau và đổi tiêu đề sang một từ ngắn:

Flexible(
  fit: FlexFit.loose,
  child: Text('Ngắn'),
),

Với bố cục này, nhãn phía sau có thể nằm gần chữ ngắn hơn vì Text không buộc chiếm hết phần được cấp. Nếu bạn muốn nhãn cuối luôn được đẩy về phía cuối hàng, Expanded thường diễn đạt ý định rõ hơn. Hãy nhìn cả vị trí phần tử sau Text khi so sánh, không chỉ nhìn vùng chữ.

Khi có nhiều con flex, flex tham gia chia phần còn lại giữa chúng. Nó không phải tỷ lệ phần trăm của toàn bộ màn hình, vì phần tử không flex và khoảng cách vẫn phải được tính trước.

3. Đặt Padding đúng phía

Expanded phải nhận parent data phù hợp từ Row, Column hoặc Flex. Một cách đặt khoảng đệm dễ hiểu là Row → Expanded → Padding → Text. Đặt Padding làm cha trực tiếp của Expanded ở giữa Row và Expanded có thể tạo lỗi parent data.

Trong ví dụ hoàn chỉnh, Padding bọc cả Row, nên nó tạo giới hạn bên ngoài cho hàng. Đó là tình huống khác với việc chèn một render widget giữa Row và một con Expanded. Khi gặp lỗi, đọc đường đi widget thay vì chỉ tìm xem Expanded có xuất hiện đâu đó trong cây hay không.

4. Kiểm tra chiều rộng hữu hạn trước

Nếu đưa hàng này vào một vùng cuộn ngang, chiều rộng theo hướng cuộn có thể không bị chặn. Khi ấy, “phần còn lại” không còn là một số hữu hạn để Expanded lấp đầy. Đổi sang một widget khác mà vẫn giữ constraints không phù hợp có thể chỉ chuyển thông báo lỗi.

Xác định phần nào phải có chiều rộng giới hạn, chẳng hạn một card có kích thước được quy định bởi bố cục cha. Nếu yêu cầu thật sự là cuộn ngang để xem toàn bộ nội dung, hãy thiết kế hàng theo kích thước nội dung thay vì mặc định bắt nó lấp một chiều rộng vô hạn.

Kiểm tra kết quả và giới hạn

Thử trên chiều rộng nhỏ, ngang màn hình và cỡ chữ lớn. Tiêu đề dài phải rút gọn theo số dòng đã chọn; nhãn “Mới” vẫn nhìn thấy. Sau đó dùng tiêu đề ngắn để quan sát khác biệt giữa Expanded và Flexible. Tiếp tục thử nhãn trạng thái dài hơn, vì phần tử không flex cũng có thể chiếm hết không gian.

Nếu nhiều thông tin cạnh tranh trên một hàng hẹp, chuyển nhãn xuống hàng khác có thể phù hợp hơn việc giảm cỡ chữ. Expanded là công cụ phân phối constraints, không bảo đảm mọi thiết kế luôn vừa một hàng.

Hiểu giới hạn mà Text nhận được sẽ giúp bạn sửa lỗi có lý do. Đừng thêm flex chỉ vì thấy sọc overflow; hãy xác định phần cần co, phần cần giữ và nơi giới hạn chiều rộng được tạo ra.

Nguồn tham khảo

  • Flutter API: Expanded
  • Flutter API: Flexible
  • Flutter: Understanding constraints

Tags: FlutterLayoutWidget
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

Flutter ValueKey: giữ state đi cùng dữ liệu khi đảo thứ tự danh sách

by Suong Nguyen
26/10/2026
0

Dựng hai hàng có bộ đếm riêng để hiểu key ổn định, vị trí widget và lý do UniqueKey mới mỗi lần build có thể làm mất state.

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

Flutter Form: validate dữ liệu trước khi gọi save

by Suong Nguyen
25/10/2026
0

Tổ chức Form và TextFormField với GlobalKey ổn định, validator rõ ràng và luồng validate rồi save có thể kiểm tra.

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

TextEditingController trong Flutter: giữ nội dung và con trỏ đúng vòng đời

by Suong Nguyen
24/10/2026
0

Tổ chức TextEditingController trong State, cập nhật text và selection cùng lúc, tránh reset nội dung khi widget rebuild.

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

ValueNotifier trong Flutter: cập nhật list để giao diện nhận đúng thay đổi

by Suong Nguyen
23/10/2026
0

Hiểu cách ValueNotifier dùng phép so sánh bằng, cập nhật list bằng giá trị mới và quản lý vòng đời notifier rõ ràng.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native SectionList: nhóm dữ liệu với key và tiêu đề riêng cho từng phần
  • Phỏng vấn JavaScript: Object.is khác === thế nào với NaN, +0 và -0?
  • Android Sharesheet: chia sẻ văn bản và đường dẫn bằng ACTION_SEND

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply