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 SafeArea: minimum và MediaQuery padding không phải cộng tay

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

Bạn bọc màn hình bằng SafeArea rồi cộng thêm padding theo status bar, kết quả nội dung cách mép trên quá xa. Hoặc một widget con đọc MediaQuery.padding.top bằng 0 và bị hiểu nhầm rằng máy không có vùng cần tránh.

Bài đối chiếu Flutter API ngày 01/11/2026. Mẫu dùng Material, tập trung quan hệ giữa SafeArea và MediaQuery; chưa chạy Flutter build, widget test hoặc thiết bị. Các bước kiểm tra bên dưới là cách bạn xác nhận trên cấu hình ứng dụng thực tế.

1. SafeArea xử lý phần inset cho child

SafeArea thêm khoảng đệm để child tránh các vùng bị hệ điều hành hoặc hình dạng màn hình che khuất. Bạn có thể bật hoặc tắt việc xử lý từng cạnh tùy bố cục. Không phải mọi màn hình đều cần thêm một SafeArea mới ở mọi cấp.

Sau khi xử lý một cạnh, widget điều chỉnh MediaQuery cho subtree để cạnh đã được tránh không tiếp tục được tính như ban đầu. Vì vậy, một widget con thấy padding.top bằng 0 có thể đang nằm trong vùng đã được xử lý, không phải đang đọc thông tin sai.

2. Minimum chọn mức lớn hơn

Với minimum, SafeArea dùng mức lớn hơn giữa khoảng tối thiểu và safe padding tương ứng. Nó không mặc định cộng hai giá trị lại. Nếu bạn muốn thêm khoảng cách thiết kế ngoài phần an toàn, hãy quyết định điều đó ở lớp layout riêng thay vì trộn hai khái niệm.

Một ví dụ số học: minimum 16 và safe padding 24 dẫn tới khoảng đệm 24 ở cạnh đó, không phải 40. Đây là diễn giải quy tắc trong tài liệu, không phải số đo đã thu từ một thiết bị.

3. Quan sát context trước và sau SafeArea

Đặt đoạn dưới vào lib/main.dart của project Flutter Material có sẵn. Màn hình không có AppBar để dễ quan sát cạnh trên; không lấy vị trí này làm quy tắc cho mọi màn hình có navigator hoặc header.

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    final before = MediaQuery.of(context).padding;
    return Scaffold(
      body: SafeArea(
        minimum: const EdgeInsets.all(16),
        child: Builder(
          builder: (insideContext) {
            final after = MediaQuery.of(insideContext).padding;
            return Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Text('Padding top trước: ${before.top.toStringAsFixed(0)}'),
                Text('Padding top trong: ${after.top.toStringAsFixed(0)}'),
                const SizedBox(height: 16),
                Expanded(
                  child: ListView(
                    children: const [
                      ListTile(title: Text('Đọc đúng context')),
                      ListTile(title: Text('Không cộng inset hai lần')),
                      ListTile(title: Text('Thử cả xoay màn hình')),
                    ],
                  ),
                ),
                FilledButton(
                  onPressed: () {},
                  child: const Text('Nút minh họa ở cuối vùng an toàn'),
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}

Builder cung cấp context nằm dưới SafeArea. Nếu dùng lại context bên ngoài, bạn đang hỏi dữ liệu của cấp khác. Nút chỉ minh họa vị trí layout và không thực hiện nghiệp vụ.

4. Kiểm tra cùng các lớp layout có sẵn

Thử trên thiết bị có cutout, xoay ngang, đổi kích thước cửa sổ và bật cỡ chữ lớn. Quan sát số padding ở hai context cùng vị trí nội dung. Giá trị cụ thể tùy môi trường; bài chưa có ảnh chụp hoặc kết quả chạy thiết bị để đưa ra một con số cố định.

Nếu thêm AppBar hoặc một lớp đã xử lý inset, kiểm tra lại cấp nào đang chịu trách nhiệm cho mỗi cạnh. Một khoảng trống có thể đến từ padding thiết kế, AppBar hoặc minimum, chứ không chỉ từ SafeArea.

Nếu muốn nền hoặc ảnh kéo dưới cutout nhưng phần chữ vẫn an toàn, có thể để lớp nền ngoài SafeArea và chỉ bọc phần tương tác cần tránh. Quyết định này thuộc thiết kế màn hình, không nên tắt cả bốn cạnh chỉ để xóa một khoảng trắng chưa tìm rõ nguồn.

Bàn phím là một thông tin khác

MediaQuery.viewInsets mô tả vùng bị che hoàn toàn, thường liên quan bàn phím. Nó khác padding và viewPadding. SafeArea không phải lời giải tổng quát cho mọi form bị bàn phím che; còn cần xem cách Scaffold và vùng cuộn xử lý kích thước còn lại.

Khi màn hình có form, kiểm tra riêng lúc bàn phím đóng và mở. Không cộng đồng thời nhiều nguồn bottom inset nếu chưa xác định lớp nào đã xử lý. Mẫu này không triển khai form hoặc thay thế bài kiểm tra keyboard trên thiết bị.

Nguồn tham khảo

  • Flutter: SafeArea và minimum
  • Flutter: SafeArea & MediaQuery
  • Flutter: MediaQueryData.viewInsets

Tags: FlutterLayoutSafeArea
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 Dismissible: xác nhận rồi xóa đúng dòng theo ID

by Suong Nguyen
31/10/2026
0

Tách confirmDismiss và onDismissed để hủy thao tác vuốt hoặc xóa đúng mục khỏi danh sách local.

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

Flutter IndexedStack: giữ state riêng khi chuyển giữa hai tab

by Suong Nguyen
30/10/2026
0

Tạo hai bộ đếm trong hai tab để kiểm tra state được giữ trong cây widget và hiểu chi phí của việc giữ các trang sống.

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

Flutter LayoutBuilder: chọn layout theo vùng cha thay vì toàn cửa sổ

by Suong Nguyen
29/10/2026
0

Đặt một component vào vùng rộng 360 logical pixel để thấy vì sao kích thước cửa sổ không thay thế constraints của cha.

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

Flutter showDialog: nhận kết quả xác nhận và kiểm tra context sau await

by Suong Nguyen
28/10/2026
0

Trả bool từ dialog qua Navigator.pop, phân biệt false với null và chỉ cập nhật giao diện khi context gọi vẫn còn mounted.

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 useColorScheme: đổi theme mà không cache màu từ module
  • Return trong finally có thể che cả return lẫn lỗi ban đầu
  • Android Intent extra: thiếu dữ liệu khác với giá trị 0

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