IconData 類別標記為 final
IconData 類別現在已標記為 final, 禁止對其進行擴充或實作。
概要
#
IconData 類別現在已標記為 final,
這表示它無法再被實作或擴充。
此變更是為了通用化資源 (assets) 與原生程式碼的
Tree Shaking 機制所做的努力之一。
背景
#Flutter 團隊正在開發一套通用機制, 以便將資源與原生程式碼的 Tree Shaking 功能帶入套件 (package)。 現有的專用 Icon Tree Shaker 將被整合至此通用機制中。
為了效能、局部性與可理解性,通用機制不支援
在複雜型別階層中記錄 const 實例。
因此,IconData 類別現在已標記為 final。
實作或擴充 IconData 的程式碼現在將無法編譯,
並出現下列錯誤:
The class 'IconData' is 'final' and can't be extended or implemented outside of its library.
遷移指南
#
若要取代實作 IconData 的方式
(例如使用支援點式簡寫 (dot shorthand)、型別安全以及自動 .values 清單的 enum),
請改用含有 static const 實例的包裝類別。
遷移自訂圖示型別
#
若您曾使用實作 IconData 的 enum,
請遷移至含有 static const 實例的類別,並搭配自訂元件 (Widget)。
遷移前的程式碼:
enum AppIcons implements IconData {
arrowUpward(0xe062),
arrowDownward(0xe061);
const AppIcons(this.codePoint)
: fontFamily = 'MaterialIcons',
fontPackage = null,
matchTextDirection = false;
@override
final int codePoint;
@override
final String? fontFamily;
@override
final String? fontPackage;
@override
final bool matchTextDirection;
}
Widget build(BuildContext context) {
// AppIcons 的使用範例:
return Icon(AppIcons.arrowUpward);
}
若要保留點式簡寫支援與型別安全, 請使用包裝類別與自訂元件。
遷移後的程式碼:
final class AppIconData {
final IconData iconData;
const AppIconData._(this.iconData);
static const arrowUpward = AppIconData._(
IconData(0xe062, fontFamily: 'MaterialIcons'),
);
static const arrowDownward = AppIconData._(
IconData(0xe061, fontFamily: 'MaterialIcons'),
);
static const values = [arrowUpward, arrowDownward];
}
class AppIcon extends StatelessWidget {
const AppIcon(this.icon, {super.key});
final AppIconData icon;
@override
Widget build(BuildContext context) {
return Icon(icon.iconData);
}
}
Widget build(BuildContext context) {
// 若可推斷型別,用法仍保留點式簡寫:
return const AppIcon(AppIconData.arrowUpward);
// 或在可推斷時使用:const AppIcon(.arrowUpward)
}
若您依賴 .values 搭配 Widgetbook 等工具,
可如上例手動維護 values 清單,或使用程式碼產生工具。
忽略 mustBeConst 程式碼檢查
#
為了啟用 Tree Shaking,部分 IconData 參數已使用
mustBeConst 標注進行標記。
若您必須使用非 const 的 IconData,
且願意放棄該圖示的 Tree Shaking,
請為該程式碼檢查加入忽略註解。
// ignore: non_const_argument_for_const_parameter
Icon(myDynamicIconData);
時間表
#
導入版本:3.44.0-0.1.pre
穩定版本:3.44
參考資料
#相關 PR:
相關 issues:
Unless stated otherwise, the documentation on this site reflects Flutter 3.44.0. Page last updated on 2026-06-14. View source or report an issue.