[Flutter] Flutter 3.38 & Dart 3.10 có gì mới ?
Giới thiệu
Hi ae, đã rất lâu rồi nay mới quay trở lại chuyên mục Blog. Hôm nay mình sẽ cùng tìm hiểu xem Flutter phiên bản mới có gì nhé. Ok let’s go!
Flutter 3.38 vừa được ra mắt với nhiều cập nhật thú vị, tập trung vào việc tăng năng suất và cải thiện trải nghiệm phát triển. Điểm nhấn chính của bản phát hành này là dot shorthands và các cập nhật mạnh mẽ cho Widget Previews.
Đáng chú ý là bản phát hành này có 825 commits từ 145 contributors khác nhau, trong đó có 37 người đóng góp lần đầu tiên - một con số ấn tượng cho thấy sức mạnh của cộng đồng Flutter.
I. Dart 3.10 - Dot Shorthands
1.1. Tính năng chính
Một trong những tính năng được mong chờ nhất - dot shorthands - cuối cùng cũng đã có mặt trong Dart 3.10! Tính năng này giúp code Dart ngắn gọn hơn đáng kể bằng cách cho phép bỏ qua các kiểu mà Dart có thể tự suy luận.
Ví dụ, bạn có thể sử dụng shorthands để viết .start thay vì MainAxisAlignment.start:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Với shorthands
Column(
mainAxisAlignment: .start,
crossAxisAlignment: .center,
children: [ /* ... */ ],
),
// Không có shorthands
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ /* ... */ ],
),
1.2. Named constructors
Tính năng này cũng hoạt động với named constructors! Bạn có thể viết .all thay vì EdgeInsets.all:
1
2
3
4
Padding(
padding: .all(8.0),
child: Text('Hello world'),
),
Tính năng này được bật mặc định trong Dart 3.10 và Flutter 3.38.
Để biết thêm thông tin, xem trang dot shorthands trên dart.dev.
II. Web - Cải tiến cho Web Development
2.1. Web development configuration files
Lệnh flutter run hiện hỗ trợ file cấu hình cho cài đặt web. Điều này cho phép bạn chỉ định host, port, certificate và header information trong file web_dev_config.yaml ở thư mục gốc của project.
Commit file này để mọi người trong team debug với cùng cài đặt.
2.2. Web development proxy settings
File web dev config cũng hỗ trợ cài đặt proxy mới. Proxy settings giúp chuyển tiếp requests đến các đường dẫn đã cấu hình sang server khác, giúp việc phát triển web client kết nối với dynamic endpoints trên cùng host dễ dàng hơn.
2.3. Hot reload trên web được mở rộng
Stateful hot reload hiện được bật mặc định khi chạy với -d web-server và bạn mở link đến ứng dụng Flutter trong trình duyệt. Tính năng này thậm chí hoạt động với nhiều trình duyệt kết nối cùng lúc.
Tương tự như -d chrome, tính năng này có thể tạm thời tắt bằng cách sử dụng flag --no-web-experimental-hot-reload.
III. Framework - Cải tiến Framework
3.1. OverlayPortal enhancements
OverlayPortal giờ đây mạnh mẽ hơn nhiều khi tạo pop-ups, dialogs và các floating UI elements.
Điểm mới là có thể render một child trong bất kỳ Overlay nào lên widget tree bằng cách sử dụng OverlayPortal.overlayChildLayoutBuilder (#174239). Điều này rất hữu ích khi cần hiển thị thông báo toàn ứng dụng hoặc UI cần “thoát” khỏi layout constraints của parent widget.
3.2. Predictive back transitions (Android)
Để có trải nghiệm navigation hiện đại hơn trên Android, predictive back route transitions hiện được bật mặc định trong MaterialApp (#173860).
Khi người dùng thực hiện cử chỉ back, họ sẽ thấy preview của màn hình home khi route hiện tại animate ra ngoài. Ngoài ra, page transition mặc định đã được cập nhật từ ZoomPageTransitionsBuilder sang FadeForwardsPageTransitionsBuilder để phản ánh hành vi native.
3.3. Windows desktop integration
Một cải tiến đáng chú ý cho Windows: giờ đây có thể truy cập danh sách các màn hình được kết nối và lấy thông tin chi tiết như resolution, refresh rate, kích thước vật lý (#164460). Mở ra khả năng xây dựng các ứng dụng desktop với tính năng quản lý window chuyên nghiệp hơn.
3.4. Framework resilience
Framework giờ đây bền vững hơn. Các lỗi xảy ra trong widget lifecycle callbacks (như didUpdateWidget) giờ được xử lý gracefully hơn, ngăn chúng gây ra cascading failures trong element tree (#173148).
ResizeImage giờ implement equality đúng cách, giúp image caching và comparison dễ đoán hơn (#172643).
3.5. Web UI polish
Trên web, sửa lỗi cho RSuperellipse ngăn rendering errors khi corner radii lớn hơn chính widget (#172254).
3.6. Locale detection improvements
Đối với người dùng quốc tế, việc phát hiện ngôn ngữ ưa thích của trình duyệt giờ đây mạnh mẽ hơn. Engine hiện sử dụng Intl.Locale web API chuẩn để parse browser languages (#172964).
3.7. Android IME bug fix
Một bug Android (#171973) đã được giải quyết, chủ yếu ảnh hưởng đến các thiết bị Samsung có bàn phím phần cứng. Trước đây, sau khi người dùng tương tác với TextField, Android Input Method Editor (IME) có thể bị stuck ở trạng thái cũ, khiến IME chặn các phím “Enter” hoặc “Space”, ngăn các widget không phải text như Checkbox hoặc Radio nhận event.
IV. Material và Cupertino Updates
4.1. MaterialState to WidgetState migration
Bản phát hành này tiếp tục migration nội bộ từ MaterialState đã deprecated sang WidgetState thống nhất hơn. Migration này đã được áp dụng cho nhiều widgets và themes của chúng, bao gồm IconButton, ElevatedButton, Checkbox, và Switch (#173893).
API mới cũng thêm sức mạnh và tính linh hoạt; ví dụ, IconButton giờ bao gồm thuộc tính statesController (#169821) cho phép kiểm soát programmatic các visual states.
4.2. New features và convenience APIs
- Badge.count constructor giờ bao gồm parameter
maxCount(#171054) để dễ dàng giới hạn số hiển thị (ví dụ: hiển thị “99+” thay vì “100”) - InkWell widget giờ có callback
onLongPressUp(#173221) - CupertinoSlidingSegmentedControl thêm thuộc tính
isMomentary(#164262) - CupertinoSheet giờ có hiệu ứng “stretch” nhẹ khi kéo lên (#168547)
4.3. Refinements
- Fix cho
DropdownMenuFormFieldđể xóa đúng text field khi form được reset (#174937) - Cập nhật cho
SegmentedButtonđể cải thiện focus handling (#173953)
V. Decoupling Material và Cupertino
Một kế hoạch lớn đang được triển khai: tách Material và Cupertino libraries khỏi framework core. Đây là một thay đổi kiến trúc quan trọng sẽ làm cho Flutter linh hoạt hơn. Một số design docs đã được công bố:
- Improving the release process cho flutter/packages (Status: Decided)
- Colors và dot shorthands (Status: Decided)
- Decoupling tests (Status: In progress)
- Text (Status: In discussion)
VI. Scrolling - Slivers mạnh mẽ hơn
6.1. SliverMainAxisGroup và SliverCrossAxisGroup fixes
Nếu bạn làm việc với các scrolling layouts phức tạp, đặc biệt là sử dụng SliverMainAxisGroup và SliverCrossAxisGroup, tin vui là bản này đã fix rất nhiều vấn đề, làm cho chúng hoạt động ổn định và dễ đoán hơn.
- Hit-testing cho taps và pointer events trên slivers trong các groups này giờ được tính toán đúng (#174265)
- Các vấn đề về over-scrolling khi sử dụng pinned header được giải quyết (#173349)
- Gọi
showOnScreenđể reveal một sliver giờ hoạt động đúng (#171339)
6.2. SliverGrid.list constructor
Khi xây dựng custom scroll views, constructor mới SliverGrid.list (#173925) sẽ giúp tạo grid từ danh sách children đơn giản và sạch sẽ hơn nhiều.
6.3. Focus navigation improvements
Trong nested scroll views với các scroll axes khác nhau (như danh sách vertical của horizontal carousels), directional focus navigation giờ dễ đoán hơn (#172875).
VII. Accessibility - Trải nghiệm toàn diện hơn
7.1. Programmatic control
- Khả năng bật accessibility mặc định trên iOS bằng
WidgetsFlutterBinding.instance.ensureSemantics(#174163) debugDumpSemanticsTreebao gồm thông tin validation kết quả text input bổ sung (#174677)
7.2. SliverSemantics widget
Widget SliverSemantics mới (#167300) giờ khả dụng. Giống như widget Semantics hiện có, developers có thể sử dụng SliverSemantics bên trong CustomScrollView để annotate các phần của sliver tree với thông tin semantic cụ thể.
7.3. Widget accessibility refinements
CupertinoExpansionTilegiờ accessible mặc định (#174480)AutoCompletewidget giờ thông báo status của search results (#173480)- Touch targets lớn hơn trong
TimePicker(#170060)
VIII. iOS - Platform Updates
8.1. Latest platform support
Flutter hỗ trợ đầy đủ các bản phát hành platform mới nhất: iOS 26, Xcode 26, và macOS 26 (phát hành tháng 9).
8.2. Deployment improvements
Cải tiến quality-of-life lớn: loại bỏ yêu cầu ứng dụng Xcode tự động khởi động khi chạy Flutter apps trên thiết bị vật lý.
Phương thức deployment mới sử dụng công cụ command line Xcode 26 devicectl để cài đặt, khởi chạy và debug app. Nếu gặp vấn đề, có thể tắt bằng:
1
flutter config --no-enable-lldb-debugging
8.3. UIScene Lifecycle Migration (QUAN TRỌNG!)
Flutter 3.38 bao gồm hỗ trợ thiết yếu cho UIScene lifecycle do Apple yêu cầu. Đây là cập nhật quan trọng theo thông báo của Apple tại WWDC25:
“Trong bản phát hành sau iOS 26, bất kỳ UIKit app nào được build với SDK mới nhất sẽ được yêu cầu sử dụng UIScene life cycle, nếu không nó sẽ không khởi chạy.”
Tất cả ứng dụng iOS Flutter hiện tại phải migrate sang lifecycle mới.
Hai cách migration:
- Manual migration: Làm theo hướng dẫn trên website Flutter
- Automatic migration (Experimental): Bật tính năng thực nghiệm:
1
flutter config --enable-uiscene-migration
8.4. Migrating Flutter plugins
Flutter plugins phụ thuộc vào application lifecycle events phải được cập nhật để sử dụng UIScene lifecycle events. Plugins chưa migrate sẽ hiển thị warnings trong bản phát hành tương lai.
IX. Android - Platform Updates
9.1. 16KB page size compatibility (QUAN TRỌNG!)
Nâng cấp lên Flutter 3.38 là chuẩn bị thiết yếu cho yêu cầu tương thích page size 16 KB của Google Play.
Từ ngày 1 tháng 11, 2025, apps targeting Android 15 trở lên phải hỗ trợ 16 KB pages. Flutter 3.38 cập nhật ndkVersion Android mặc định sang NDK r28, phiên bản tối thiểu cần thiết để native code đạt được alignment phù hợp cho hỗ trợ 16 KB.
9.2. Memory leak fix
Flutter 3.38 sửa memory leak đáng kể ảnh hưởng đến tất cả Flutter apps trên Android. Vấn đề (được giới thiệu trong 3.29.0) xảy ra khi Activities bị destroyed khi thoát.
9.3. Android dependency updates
Flutter 3.38 đã test và xác nhận tương thích với các phiên bản Android dependency sau:
- Java 17: phiên bản tối thiểu bắt buộc cho Android development trong Flutter 3.38
- KGP 2.2.20: phiên bản Kotlin Gradle Plugin tối đa đã biết và được hỗ trợ
- AGP 8.11.1: phiên bản Android Gradle Plugin mới nhất tương thích với KGP 2.2.20
- Gradle 8.14: hoạt động với các phiên bản đã chọn của Java, KGP, và AGP
Các giá trị đã cấu hình cho bản phát hành này:
flutter.compileSdkVersion(API 36)flutter.targetSdkVersion(API 36)flutter.minSdkVersion(API 24) hoặc cao hơn
X. Engine - Performance và Stability
10.1. Performance overlay
Performance overlay đã được refactor để hiệu quả hơn, giảm rendering time trên cả Skia và Impeller backends (#176364).
10.2. Vulkan và OpenGL ES
Nhiều fixes và improvements cho Vulkan và OpenGL ES backends cải thiện stability và performance trên phạm vi thiết bị rộng hơn, bao gồm xử lý tốt hơn của:
- Pipeline caches (#176322)
- Fence waiters (#173085)
- Image layout transitions (#173884)
10.3. Renderer unification
Công việc tiếp tục để thống nhất CanvasKit và Skwasm renderers. Bản phát hành này bao gồm refactoring đáng kể để chia sẻ nhiều code hơn giữa hai renderer (#174588).
10.4. Thread merging
Khả năng opt-out khỏi thread merging đã được loại bỏ khỏi iOS và Android.
XI. DevTools và IDEs
11.1. Widget Previews - Cập nhật lớn (Experimental)
Flutter 3.35 đã giới thiệu Widget Previews, và Flutter 3.38 mang đến các cải tiến đáng kể:
IDE integration
Cả VSCode và IntelliJ/Android Studio plugins đều được cập nhật với hỗ trợ ban đầu cho Widget Previews. Bạn có thể xem previews trực tiếp trong IDE.
Environment theming
Widget preview environment giờ hỗ trợ light và dark modes, cũng như custom IDE color schemes để khớp với môi trường phát triển của bạn.
Preview extensibility
Class annotation Preview không còn được đánh dấu là final và giờ có thể được extend để tạo custom Preview annotations.
MultiPreview support
Class cơ sở MultiPreview mới cho phép tạo nhiều Preview variations từ một annotation tùy chỉnh duy nhất.
Preview groups
Parameter group mới trong class Preview cho phép nhóm các previews liên quan.
Reduced restrictions
Private constants giờ được hỗ trợ làm arguments cho Preview annotations.
Lưu ý quan trọng: Có một vấn đề đã biết khi Widget Previewer có thể crash hoặc ngừng cập nhật sau flutter pub get. Nếu gặp vấn đề này, chạy flutter pub get và restart IDE.
11.2. DevTools updates
Flutter 3.38 chứa fixes cho một số pain points hàng đầu mà người dùng đã chỉ ra trong khảo sát DevTools 2025:
Network Panel Improvements
- Dễ hiểu hơn khi panel đang recording network traffic (#9495)
- Sửa các vấn đề liên quan đến copy-paste network requests (#9472, #9482, #9485, #8588)
Flutter Inspector fixes
- Sửa bug khi selecting một widget đôi khi mở underlying framework source code thay vì user’s source code (#176530)
- Sửa bug đôi khi ngăn tương tác với top buttons trong Inspector panel (#9327)
XII. Deprecations và Breaking Changes
12.1. Build và tooling changes
- File
versionở root của Flutter SDK đã được loại bỏ, thay vào đó là fileflutter.version.jsonmới trongbin/cache(#172793) - File
AssetManifest.jsonkhông còn được tạo mặc định (#172594)
12.2. Notable changes
SnackBarbao gồm action sẽ không còn auto-dismiss (#173084)OverlayPortal.targetsRootOverlayconstructor bị deprecated, thay vào đó dùngOverlayPortal(overlayLocation: OverlayChildLocation.rootOverlay)- Nhiều properties trên
CupertinoDynamicColornhưwithAlphavàwithOpacitygiờ bị deprecated (#171160) - Flutter 3.38 yêu cầu Java 17 là phiên bản tối thiểu cho Android
Kết luận
Flutter 3.38 là một bản cập nhật tập trung vào trải nghiệm developer, với nhiều cải tiến giúp viết code nhanh hơn và dễ chịu hơn. Từ dot shorthands giúp code gọn gàng, Widget Previews mạnh mẽ hơn, đến các fixes quan trọng cho iOS và Android - tất cả đều hướng đến mục tiêu làm cho Flutter ngày càng tốt hơn.
Để biết chi tiết đầy đủ về tất cả thay đổi, bạn có thể xem:
Upgrade ngay để trải nghiệm những tính năng mới:
1
flutter upgrade
Chúc các bạn code vui vẻ! 🎉
Tham khảo: What’s new in Flutter 3.38 - Kevin Chisholm