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

Migrate sang material_ui và cupertino_ui: design system rời khỏi SDK

Suốt chín năm, import 'package:flutter/material.dart'; là dòng đầu tiên của gần như mọi file Flutter từng được viết. Flutter 3.47 bắt đầu kết thúc điều đó. material_uicupertino_ui giờ là package độc lập trên pub.dev, cả hai ở 1.0, cùng do publisher đã xác minh flutter.dev phát hành. Bản trong SDK vẫn chạy — và đã lên lịch deprecate chính thức ở bản stable tháng 11.

Đây là thay đổi lớn hơn vẻ ngoài của cái diff, nên hiểu lý do trước khi chạy công cụ migrate là đáng.

Vì sao phải tách ra

Khảo sát Q2 2026 trả lời điều này rõ hơn mọi bài blog. Ở mọi mảng trọng tâm, mức hài lòng đều cao: Dart 92%, Android 91%, core framework 90%. Một con số phá vỡ quy luật — Cupertino widgets 61%, giảm 6 điểm, mảng bị chấm thấp nhất khảo sát.

Nguyên nhân cấu trúc là nhịp phát hành. Bị buộc vào SDK, Cupertino chỉ ship sửa lỗi được theo chuyến tàu stable hàng quý. Apple thì đổi thiết kế bất cứ lúc nào họ muốn. Một design system chỉ phản ứng được bốn lần mỗi năm sẽ luôn chạy sau nền tảng mà nó mô phỏng.

Khi tách ra, material_uicupertino_ui có thể phát hành hàng tuần. Đó là toàn bộ chiến lược: không phải refactor cho đẹp, mà là sửa một sự lệch nhịp hiện lên trực tiếp trong mức hài lòng của lập trình viên.

Lợi ích thứ hai là độc lập phiên bản. Hôm nay, nâng Flutter đồng nghĩa chấp nhận mọi thay đổi widget cùng lúc. Khi design system là một dependency bình thường, bạn ghim được nó:

dependencies:
  flutter:
    sdk: flutter
  material_ui: ^1.0.0
  cupertino_ui: ^1.0.0

Nâng framework để lấy một bản vá engine mà không phải nhận kèm thay đổi layout của ListTile trong cùng buổi chiều.

Thực sự đổi gì trong code

Chủ yếu là đường dẫn import:

TrướcSau
package:flutter/material.dartpackage:material_ui/material_ui.dart
package:flutter/cupertino.dartpackage:cupertino_ui/cupertino_ui.dart
GlobalMaterialLocalizations từ flutter_localizationsbản do material_ui cung cấp

API widget không đổi. Đây là chuyện đóng gói, không phải phá vỡ API — và đó chính là lý do nó tự động hoá được.

Chạy migrate

Thêm package, rồi để dart fix viết lại import:

flutter pub add material_ui cupertino_ui
dart fix --apply --code=migrate_design_widgets

Fix migrate_design_widgets viết lại import từ vị trí cũ trong framework sang package mới trên toàn project. Hãy đọc diff — gần như toàn bộ phải là dòng import. Thứ gì khác thì đáng nhìn lại lần hai.

Thứ duy nhất công cụ không xử lý trọn cho bạn là localizations. Nếu bạn dùng GlobalMaterialLocalizations, hãy chuyển sang bản do material_ui cung cấp thay vì bản từ flutter_localizations. Trộn hai thứ sẽ sinh lỗi “không tìm thấy localizations” khó hiểu lúc chạy chứ không phải lúc biên dịch, nên hãy grep tường minh:

grep -rn "GlobalMaterialLocalizations" lib/

Sống sót qua giai đoạn dependency pha trộn

Đây là vấn đề thực tế. Bạn migrate app trong hai mươi phút. Rồi bạn phát hiện bốn dependency vẫn import package:flutter/material.dart, và cây widget của họ với của bạn giờ đến từ hai thư viện khác nhau.

Đó là lý do MaterialUiCompatibilityBridge tồn tại. Bọc app — hoặc chỉ nhánh cây chứa widget cũ — và hai thế giới cũ mới vẫn làm việc được với nhau:

import 'package:material_ui/material_ui.dart';

void main() {
  runApp(
    MaterialUiCompatibilityBridge(
      child: const MyApp(),
    ),
  );
}

Hãy coi bridge là giàn giáo có ngày tháo dỡ, không phải kiến trúc. Mỗi nhánh được bọc là một dependency bạn đang chờ. Giữ một danh sách.

Mốc thời gian deprecate

Hôm nay chưa có gì vỡ. Trình tự cần lên kế hoạch:

  • Bây giờ (3.47): cả hai đường đều chạy. Package ở 1.0. Migrate là tuỳ chọn.
  • Stable tháng 11: thư viện Material và Cupertino trong SDK bị deprecate chính thức. Hãy chờ cảnh báo analyzer trên mọi import chưa migrate.
  • Về sau: API bị deprecate cuối cùng sẽ bị gỡ. Chưa có ngày công bố, và bạn không nên chờ ngày đó.

Ước lượng chi phí thành thật: một buổi chiều cho một app, lâu hơn cho một hệ sinh thái plugin bạn không kiểm soát.

Nếu bạn phát hành package

Tác giả package gánh phần nặng thật, vì lựa chọn của bạn lan tới mọi người dùng. Vài nguyên tắc:

  • Đừng migrate rồi phát hành ngay một major phá vỡ nếu package của bạn chỉ chạm vài widget — bạn sẽ chia người dùng thành hai thế giới mà chẳng được gì.
  • Hãy migrate sớm nếu package của bạn chính là một thư viện UI. Người dùng không hoàn tất migrate được cho tới khi bạn xong.
  • Nới ràng buộc phiên bản thay vì ghim chặt, để người dùng nhận được bản vá design system mà không phải chờ bản phát hành của bạn.

Checklist migrate của bạn

  1. Nâng lên Flutter 3.47 và xác nhận build sạch trước khi đổi bất cứ thứ gì.
  2. Chạy flutter pub add material_ui cupertino_ui.
  3. Chạy dart fix --apply --code=migrate_design_widgets và đọc diff.
  4. Tìm GlobalMaterialLocalizations và đổi sang bản của material_ui.
  5. Build và chạy trên ít nhất một target iOS và một Android. Chú ý riêng các hồi quy về theme và localization.
  6. Xác định dependency còn dùng thư viện trong SDK. Mở issue cho họ ngay hôm nay.
  7. Bọc MaterialUiCompatibilityBridge chỉ ở nơi buộc phải, và ghi lại lý do.
  8. Đặt nhắc lịch tháng 10 để rà lại danh sách trước khi mốc deprecate tháng 11 tới.

Kết luận

Cuộc migrate này mang tính cơ học, và tooling làm hộ phần lớn. Phần cần phán đoán là đồ thị dependency: app của bạn thì dễ, dependency thì không, và MaterialUiCompatibilityBridge là cây cầu chứ không phải điểm đến. Hãy làm phần cơ học ngay bây giờ khi nó còn tuỳ chọn và analyzer còn im lặng — đó là việc khó chịu hơn nhiều vào tháng 11, với cảnh báo trên mọi file và một chiếc đồng hồ deprecate đang chạy.


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

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...

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ử...

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 đó ...