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

adaptive_platform_ui: một cây widget, iOS 26 native và Material

adaptive_platform_ui cho bạn một cây widget duy nhất, hiển thị thành phần Liquid Glass native của iOS 26 trên iPhone mới, Cupertino trên máy cũ, và Material 3 trên Android. 235★, giấy phép MIT, cập nhật lần cuối 2026-07-25.

adaptive_platform_ui là gì?

Flutter luôn cho phép bạn dựng giao diện Cupertino và giao diện Material, nhưng chưa bao giờ cho phép làm cả hai một cách dễ chịu trong cùng một app. Kết quả thường thấy là Platform.isIOS ? CupertinoButton(...) : ElevatedButton(...) rải khắp cây widget, cùng một lớp Cupertino luôn chậm hơn Apple một hai năm.

iOS 26 làm mọi thứ tệ hơn. Liquid Glass không phải một bảng màu bạn có thể phỏng theo bằng BackdropFilter; hiệu ứng mờ của toolbar, hành vi thu gọn khi cuộn và cách xử lý cử chỉ đều đến từ chính UIKit.

adaptive_platform_ui chọn lập trường rằng cách trung thực duy nhất để bắt kịp là nhúng control thật. Nó là một plugin Flutter chứ không phải thư viện widget thuần Dart, và trên iOS 26 thì useNativeToolbar: true đặt một UIToolbar thật lên màn hình — tương tự UITabBar cho thanh dưới, cùng với UIButton, UISegmentedControl, UISwitchUISlider.

Ở nơi không làm được như vậy, nó hạ cấp dần: widget Cupertino trên iOS 18 trở xuống, Material 3 trên Android và web. Quyết định do gói đưa ra lúc chạy, không phải do bạn.

Vì sao nên biết trong năm 2026

Giá trị nằm ở trục phiên bản, chứ không chỉ trục nền tảng. Phần lớn gói thích ứng chỉ rẽ nhánh theo Platform.isIOS rồi dừng lại, nghĩa là ngay khi Apple ra ngôn ngữ thiết kế mới thì giao diện “thích ứng” của bạn lại đang thích ứng với đúng phiên bản iOS sai.

API được tổ chức quanh một widget cấp ứng dụng và một nhóm nhỏ thành phần thích ứng:

AdaptiveScaffold(
  appBar: AdaptiveAppBar(
    title: 'My App',
    useNativeToolbar: true,
    actions: [
      AdaptiveAppBarAction(
        onPressed: () {},
        iosSymbol: 'gear',
        icon: Icons.settings,
      ),
    ],
  ),
  bottomNavigationBar: AdaptiveBottomNavigationBar(
    items: [
      AdaptiveNavigationDestination(icon: 'house.fill', label: 'Home'),
      AdaptiveNavigationDestination(icon: 'person.fill', label: 'Profile'),
    ],
    selectedIndex: 0,
    onTap: (index) {},
  ),
  body: YourContent(),
)

Để ý iosSymbol: 'gear' nằm cạnh icon: Icons.settings — bạn cung cấp cả hai, và cái phù hợp sẽ được dùng. AdaptiveApp nhận theme Material và Cupertino riêng biệt, hỗ trợ sáng/tối/theo hệ thống, và có hàm khởi tạo AdaptiveApp.router() cho go_router.

Bắt đầu

flutter pub add adaptive_platform_ui

Gói cần Dart ^3.9.2. Sau đó cấu hình các delegate đa ngôn ngữ — README nêu đây là lỗi phổ biến nhất:

import 'package:flutter_localizations/flutter_localizations.dart';

AdaptiveApp(
  localizationsDelegates: const [
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: const [Locale('en'), Locale('de'), Locale('tr')],
  // ...
)

Thiếu GlobalCupertinoLocalizations là mọi bộ chọn ngày và giờ sẽ hiện tiếng Anh bất kể ngôn ngữ thiết bị là gì.

Khi nào nên dùng adaptive_platform_ui?

  • ứng dụng của bạn cần cảm giác native thật sự trên iOS chứ không phải “Material bo góc”
  • bạn muốn phần khung Liquid Glass của iOS 26 mà không phải tự viết code platform channel
  • bạn đã mệt với việc duy trì song song hai cây widget Cupertino và Material
  • bạn hỗ trợ dải phiên bản iOS rộng và muốn phần dự phòng được lo sẵn

Điểm còn hạn chế

Nhúng view UIKit có cái giá mà một gói thuần Dart không có. Platform view được ghép ảnh theo cách khác, dễ gây khó chịu bên trong vùng cuộn và các hiệu ứng chuyển cảnh, và gần như vô hình với widget test của Flutter — bạn không thể kiểm tra một UITabBar từ flutter_test. Hãy dành thời gian kiểm chứng trên máy thật.

Phiên bản 0.1.111 không phải tín hiệu ổn định. Gói còn non, bề mặt API thì rộng, và 85 fork trên 235 sao cùng 44 issue đang mở cho thấy khá nhiều người đang tự vá ở phía họ.

Và đây là một gói nghiêng hẳn về iOS. Phía Android chỉ là Material 3 tiêu chuẩn — hoàn toàn ổn, nhưng không ai chọn thư viện này vì những gì nó làm trên Android.

Các lựa chọn đáng so sánh

Câu hỏi thường gặp

adaptive_platform_ui có thật sự dùng control native của iOS không?

Với toolbar và tab bar của iOS 26 thì có — đây là plugin Flutter nhúng UIToolbarUITabBar của UIKit, nhờ vậy bạn có hiệu ứng mờ Liquid Glass thật, hành vi thu gọn khi cuộn và cách xử lý cử chỉ native chứ không phải một bản mô phỏng.

Trên iOS 18 hoặc cũ hơn thì sao?

Nó hiển thị widget Cupertino truyền thống. Việc chọn theo phiên bản diễn ra tự động — bạn đặt useNativeToolbar: true và gói tự quyết định lúc chạy xem thiết bị có đáp ứng được không.

Có còn phải cấu hình đa ngôn ngữ không?

Có, và nhiều người vấp chỗ này. Hãy thêm các delegate GlobalMaterialLocalizations, GlobalCupertinoLocalizationsGlobalWidgetsLocalizations vào AdaptiveApp, nếu không bộ chọn ngày giờ sẽ hiện tiếng Anh bất kể ngôn ngữ hệ thống.

Đã dùng được cho production chưa?

Hãy xem nó là hứa hẹn chứ chưa ổn định. Gói có giấy phép MIT và đang được phát triển tích cực, nhưng số phiên bản là 0.1.111 — API vẫn đang thay đổi, và việc nhúng platform view có cái giá thật về hiệu năng lẫn kiểm thử.

Tài nguyên & liên kết


Thuộc FlutterCook — hướng dẫn thực hành về các thư viện, UI kit và ứng dụng Flutter mã nguồn mở tốt nhất. Xem xu hướng GitHub hoặc hướng dẫn YouTube.


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.

Nhận xét

Bài đăng phổ biến từ blog này

5 concepts every Flutter dev should know

  Phụ lục: State management architecture Testing IDE Shortcuts Platform channel Maintaining a project Tôi đã làm việc với Flagship trong một thời gian dài, và đây là những điều mà tôi phát hiện ra là điều cần phải có đối với bất kỳ nhà phát triển Flagship nào, về tổng thể nó sẽ khiến bạn trở thành một nhà phát triển Flagship giỏi trong thời gian dài. 1. State management architecture Đây là một trong những chủ đề quan trọng nhất trong cộng đồng thiết bị rung, nó khá quan trọng nếu bạn muốn duy trì một dự án rung kích thước trung bình hoặc lớn. Nó sẽ giúp tạo một dự án suôn sẻ và thêm các tính năng mới một cách hoàn hảo.  2. Testing Đây là một chủ đề duy nhất mà tôi không hiểu tại sao nó lại quan trọng trước đó trong sự nghiệp của tôi, nhưng khi tôi tiến lên trong sự nghiệp của mình và có kinh nghiệm với nhiều dự án và vấn đề xảy ra trong môi trường sản xuất. Tôi đã nhận ra một cách khó khăn, tại sao điều này lại quan trọng như vậy. Nếu bạn vẫn muốn có thêm lý do để cân nhắc thử...

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

Announcing Flutter 2

  Phụ lục: Flutter on the web Flutter 2 on desktops, foldables, and embedded devices The growing Flutter ecosystem Dart: The secret sauce behind Flutter Flutter 2: Available now Hôm nay, chúng tôi sẽ công bố Flutter 2: một bản nâng cấp lớn cho Flutter cho phép các nhà phát triển tạo các ứng dụng đẹp, nhanh chóng và di động cho bất kỳ nền tảng nào. Với Flutter 2, bạn có thể sử dụng cùng một cơ sở mã để gửi các ứng dụng gốc cho năm hệ điều hành: IOS, Android, Windows, macOS và Linux; cũng như trải nghiệm web nhắm mục tiêu các trình duyệt như Chrome, Firefox, Safari hoặc Edge. Flutter thậm chí có thể được nhúng vào ô tô, TV và thiết bị gia dụng thông minh, mang đến trải nghiệm di động và lan tỏa nhất cho thế giới điện toán xung quanh. Mục tiêu của chúng tôi là thay đổi cơ bản cách các nhà phát triển nghĩ về việc xây dựng ứng dụng, bắt đầu không phải với nền tảng bạn đang nhắm mục tiêu mà là với trải nghiệm bạn muốn tạo. Flutter cho phép bạn tạo ra những trải nghiệm tuyệt đẹp trong đó ...