Chuyển đến nội dung chính

Bài đăng

Public release windows: PR Flutter của bạn lên stable khi nào

Lập kế hoạch open-source từng mập mờ. Flutter giờ công bố release windows — branch cutoff date bảo đảm inclusion vào stable kế tiếp. Lịch stable 2026 (công bố cùng 3.41) Release Mốc Branch cutoff 3.41 Tháng 2 06/01 3.44 Tháng 5 07/04 3.47 Tháng 8 07/07 3.50 Tháng 11 06/10 Merge trước cutoff → có mặt trong stable đó. Merge sau → chuyến sau. Team dùng thế nào Plugin author: align breaking change với cutoff, không phải cuối sprint. App team: lên lịch upgrade sau mỗi stable + một tuần bake. Contributor: ghi target release trong mô tả PR. Cạm bẫy Cutoff không phải “đóng băng vĩnh viễn” — cherry-pick vẫn có, nhưng đừng dựa vào. Feature beta/main có thể trượt; đọc release notes mỗi lần. Bài viết gốc đăng tại FlutterCook . Bản trên đó là bản được cập nhật mới nhất.

Flutter Property Editor: inspect widgets without print debugging — hướng dẫn Flutter

Property Editor exposes editable fields for the selected widget in DevTools. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi Edit properties live from DevTools while iterating on a screen. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Faster than hot-reload cycles when tuning padding, colors, and flags. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả v...

Prompt caching on mobile AI calls — hướng dẫn Flutter

Stable system prefixes can cut AI costs dramatically. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi Prefix stability, cost cuts, and cache invalidation. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Design prompts so the expensive prefix is cacheable. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về data có kiểu hoặc failure có kiểu, không trả stri...

Public release windows: when your Flutter PR ships to stable

Open-source planning used to be fuzzy. Flutter now publishes release windows — branch cutoff dates that guarantee inclusion in the next stable. 2026 stable train (as announced with 3.41) Release Target Branch cutoff 3.41 February 06 January 3.44 May 07 April 3.47 August 07 July 3.50 November 06 October Merge before cutoff → ships in that stable. Merge after → next train. How teams should use this Plugin authors: align breaking changes with cutoffs, not with your sprint end. App teams: schedule upgrades after each stable + a bake week. Contributors: say the target release in the PR description. Pitfalls Cutoff is not “code freeze forever” — cherry-picks still exist, but do not plan on them. Beta/main features can slip; read the release notes each time. Originally published on FlutterCook . Read the latest version there — that copy is the one kept up to date.

Flutter Property Editor: inspect widgets without print debugging

Property Editor exposes editable fields for the selected widget in DevTools. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence Edit properties live from DevTools while iterating on a screen. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Faster than hot-reload cycles when tuning padding, colors, and flags. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A control...

Prompt caching on mobile AI calls

Stable system prefixes can cut AI costs dramatically. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence Prefix stability, cost cuts, and cache invalidation. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Design prompts so the expensive prefix is cacheable. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controller or use case validates the intent and calls the ...

Privacy manifests and required reason APIs for Flutter plugins — hướng dẫn Flutter

Apple requires declared reasons for certain APIs. Plugins must ship manifests. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi What App Store privacy nutrition labels mean for plugin authors. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Audit transitive plugins before submission, not after rejection. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về ...

Predictive back animations in Flutter Android apps — hướng dẫn Flutter

Predictive back is now table stakes on modern Android. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi What users expect on gesture navigation and how to adopt it. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Validate pop gestures with modal routes and nested navigators. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về data có kiểu hoặc failure có k...

Blameless mobile incident postmortems — hướng dẫn Flutter

Postmortems exist to change systems, not assign blame. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi Timeline, user impact, and action items that get done. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Quantify affected sessions and store-rating impact. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về data có kiểu hoặc failure có kiểu, không trả st...

Privacy manifests and required reason APIs for Flutter plugins

Apple requires declared reasons for certain APIs. Plugins must ship manifests. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence What App Store privacy nutrition labels mean for plugin authors. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Audit transitive plugins before submission, not after rejection. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controlle...

Predictive back animations in Flutter Android apps

Predictive back is now table stakes on modern Android. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence What users expect on gesture navigation and how to adopt it. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Validate pop gestures with modal routes and nested navigators. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controller or use case validates the in...

Blameless mobile incident postmortems

Postmortems exist to change systems, not assign blame. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence Timeline, user impact, and action items that get done. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Quantify affected sessions and store-rating impact. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controller or use case validates the intent and calls th...

Portfolio Flutter projects that get interviews in 2026 — hướng dẫn Flutter

Pretty UI clones are everywhere. Production habits stand out. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi Show offline, a11y, performance, and CI — not just UI. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Ship one app with tests, CI, and a store-ready listing. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về data có kiểu hoặc failure có kiểu, k...

Google Play policy changes mobile teams should track — hướng dẫn Flutter

Play enforcement is continuous, not annual. Bài này chuyển quan sát đó thành một mô hình nhỏ để bạn có thể kiểm thử, đo lường và giữ cho code dễ bảo trì khi app lớn lên. Vấn đề cốt lõi Data safety, target API, and account deletion. Câu hỏi hữu ích không phải API hay pattern có đẹp riêng lẻ hay không, mà là state nằm ở đâu, boundary nào chịu trách nhiệm khi lỗi xảy ra, và người dùng phục hồi thế nào khi happy path biến mất. Mô hình thực tế Keep Data safety form in sync with every permission change. Hãy bắt đầu bằng một owner rõ ràng cho behavior. Widget chỉ nên render và phát intent; IO, persistence, permission và retry nên nằm sau một interface nhỏ. Nhờ vậy bạn có seam để fake trong test và một chỗ ghi lại các dữ kiện cần theo dõi ở production. Trong app Flutter, boundary thường có dạng: Widget phát intent như load, submit, refresh hoặc retry. Controller hoặc use case validate intent rồi gọi boundary. Boundary trả về data có kiểu hoặc failure có kiểu, không trả string chỉ dà...

Chỉ ship asset mà từng nền tảng cần

Một danh sách flutter: assets từng khiến mọi nền tảng nhận mọi file. Từ 3.41 bạn lọc được: flutter : assets : - path : assets/logo.png - path : assets/web_worker.js platforms : [ web ] - path : assets/desktop_icon.png platforms : [ windows , linux , macos ] Vì sao app đa nền tảng nên làm User mobile không nên tải PDF hướng dẫn desktop hay web worker. Metric dung lượng store và ma sát download cải thiện ngay. CI assert được ma trận asset theo nền tảng. Cách chia thực tế Loại asset Nền tảng Branding dùng chung all Web worker / helper wasm web Template in ấn độ phân giải cao desktop Nhạc notification iOS/Android android, ios Cạm bẫy rootBundle.load asset không tồn tại trên nền tảng sẽ throw — guard bằng platform check. Đây là lọc đóng gói , không phải theming runtime. Bài viết gốc đăng tại FlutterCook . Bản trên đó là bản được cập nhật mới nhất.

Portfolio Flutter projects that get interviews in 2026

Pretty UI clones are everywhere. Production habits stand out. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence Show offline, a11y, performance, and CI — not just UI. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Ship one app with tests, CI, and a store-ready listing. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controller or use case validates the intent a...

Google Play policy changes mobile teams should track

Play enforcement is continuous, not annual. This article turns that observation into a small implementation model you can test, measure, and keep boring when the app grows. The problem in one sentence Data safety, target API, and account deletion. The useful question is not whether the API or pattern looks elegant in isolation. It is where state lives, which boundary owns failure, and how a user recovers when the happy path disappears. A practical model Keep Data safety form in sync with every permission change. Start with one explicit owner for the behavior. Keep widgets responsible for rendering and user intent; keep IO, persistence, permissions, and retries behind a small interface. That gives you a seam for a fake in tests and a place to record the facts that matter in production. For a Flutter app, the boundary usually looks like this: The widget emits an intent such as load, submit, refresh, or retry. A controller or use case validates the intent and calls the boundary....

Ship only the assets each platform needs

One flutter: assets list used to mean every platform received every file. From 3.41 you can filter: flutter : assets : - path : assets/logo.png - path : assets/web_worker.js platforms : [ web ] - path : assets/desktop_icon.png platforms : [ windows , linux , macos ] Why this is not optional for multi-platform apps Mobile users should not download desktop help PDFs or web workers. Store size metrics and download friction improve immediately. CI can assert platform asset matrices in tests. Practical split Asset type Platforms Shared branding all Web workers / wasm helpers web High-res print templates desktop iOS/Android notification sounds android, ios Pitfalls Conditional rootBundle.load of a missing platform asset throws — guard with a platform check. This is packaging filtering, not runtime theming. Originally published on FlutterCook . Read the latest version there — that copy is the one kept up to date.