پرش به محتوای اصلی
پرش به محتوای مقاله

فلاتر ۳.۴۷ سیستم‌های طراحی Material و Cupertino را مستقل کرد

·۲۲ مرداد ۱۴۰۵۱۱ دقیقه مطالعه۱ بازدید
لوگوی فلاتر با متن "What's new in Flutter 3.47"
لوگوی فلاتر با متن "What's new in Flutter 3.47"
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

جداسازی Material و Cupertino به بسته‌های مستقل در pub.dev؛ این اولین باری است که استایل‌های UI فلاتر از چرخه انتشار SDK جدا شده و امکان به‌روزرسانی هفتگی پیدا کرده‌اند.

تصور کنید دنیایی را که در آن به‌روزرسانی‌های رابط کاربری (UI) دیگر به چرخه‌های انتشار فصلی SDK وابسته نیستند. این موضوع اکنون با انتشار نسخه ۳.۴۷ فلاتر (Flutter) در ۱۲ اوت ۲۰۲۶ به واقعیت تبدیل شده است؛ نسخه‌ای که در آن تیم فلاتر با انتقال ویجت‌های Material و Cupertino به بسته‌های مستقل، سیستم‌های طراحی اصلی خود را از هسته SDK جدا کرده است.

برای سال‌ها، فلاتر کتابخانه‌های طراحی خود را مستقیماً در موتور اصلی (Core Engine) بسته‌بندی کرده بود. اگرچه این رویکرد پایداری را تضمین می‌کرد، اما گلوگاهی برای مشارکت‌کنندگان ایجاد کرد و سرعت عرضه استایل‌های جدید ویجت‌ها را کاهش داد. توسعه‌دهندگان مجبور بودند برای دریافت تنها یک اصلاح کوچک در یک باگ UI، کل فریم‌ورک خود را ارتقا دهند.

دنیایی را تصور کنید که در آن کتابخانه UI شما با سرعتی مشابه یک فریم‌ورک وب تکامل می‌یابد، اما موتور اصلی شما همچنان صخره‌ای استوار و پایدار باقی می‌ماند. با انتقال این کتابخانه‌ها به pub.dev، تیم توسعه اکنون می‌تواند به‌روزرسانی‌ها را در یک برنامه زمانی هفتگی منتشر کند. این امر به شما اجازه می‌دهد تا آخرین روندهای طراحی را بدون به خطر انداختن پایداری کل زیرساخت اپلیکیشن خود، به کار بگیرید.

جداسازی بزرگ

اکنون Material و Cupertino در قالب بسته‌های material_ui و cupertino_ui نسخه ۱.۰ در دسترس هستند. اگرچه هسته SDK فعلاً این کتابخانه‌ها را در خود جای داده است، اما تیم فلاتر قصد دارد نسخه‌های داخلی (Bundled) را در انتشار پایدار پاییزی نوامبر رسماً منسوخ کند. این جداسازی به تیم اجازه می‌دهد تا مشارکت‌ها و به‌روزرسانی‌ها را سریع‌تر و مکررتر اعمال کند و زیربنای یک کاتالوگ ویجت هسته فلاتر را بسازد که از نظر استایل خنثی (Style-neutral) باشد.

برای مهاجرت، توسعه‌دهندگان می‌توانند از دستور dart fix --apply --code=migrate_design_widgets استفاده کنند. این ابزار به‌طور خودکار ایمپورت‌ها را از package:flutter/material.dart و package:flutter/cupertino.dart به بسته‌های مستقل جدید تغییر می‌دهد. اگر این ابزار به دلیل یک باگ شناخته‌شده در نسخه‌های اولیه نتوانست فایل pubspec.yaml را به‌روزرسانی کند، توسعه‌دهندگان باید پیش از اجرای مجدد دستور fix، به‌صورت دستی دستور flutter pub add material_ui (و در صورت نیاز cupertino_ui) را اجرا کنند.

برای جلوگیری از شکست در اکوسیستم، تیم توسعه ابزار MaterialUiCompatibilityBridge را معرفی کرده است. این ابزار کاربردی اجازه می‌دهد تا یک اپلیکیشن از بسته‌های جدید استفاده کند، حتی اگر وابستگی‌های شخص‌ثالث (Third-party) آن هنوز به ایمپورت‌های قدیمی هسته SDK متکی باشند. به عنوان مثال، توسعه‌دهندگان می‌توانند اپلیکیشن خود را در ویژگی builder مربوط به MaterialApp در این پل ارتباطی قرار دهند تا سازگاری تضمین شود.

بخش بومی‌سازی (Localization) نیز از هسته جدا شده است. بسته flutter_localizations دیگر رشته‌های ترجمه‌شده برای این ویجت‌ها را در خود جای نمی‌دهد؛ این رشته‌ها اکنون در بسته‌های UI مربوط به خودشان قرار دارند.

لوگوی فلاتر با متن "What's new in Flutter 3.47"

تنظیم localizationsDelegates روی GlobalMaterialLocalizations.delegates اکنون به‌طور خودکار هر دو نماینده Cupertino و Widgets را شامل می‌شود و فرآیند را ساده‌تر می‌کند. این تغییر جایگزین الزام قبلی شد که در آن باید GlobalCupertinoLocalizations.delegate، GlobalMaterialLocalizations.delegate و GlobalWidgetsLocalizations.delegate را به‌صورت جداگانه لیست می‌کردید.

مدل مشارکت باز

تیم فلاتر برای تضمین یک انتقال نرم، مشارکت‌ها در کتابخانه‌های Material و Cupertino را از ماه آوریل متوقف کرده بود. این انجماد (Freeze) تضمین کرد که کتابخانه‌های موجود در بسته‌های مستقل جدید، دقیقاً با نسخه‌هایی که توسعه‌دهندگان در حال حاضر در هسته SDK استفاده می‌کنند، یکسان باشند.

با انتشار فلاتر ۳.۴۷، این محدودیت برداشته شد. تیم توسعه اکنون رسماً این بسته‌ها را برای مشارکت‌های جامعه باز کرده است. توسعه‌دهندگان می‌توانند انتظار داشته باشند که ویژگی‌های جدید و رفع باگ‌ها به‌طور منظم منتشر شوند؛ در حال حاضر برنامه‌ریزی شده است که این نسخه‌ها به‌صورت هفتگی عرضه گردند.

گرافیک دسکتاپ و Impeller

Impeller، موتور رندرینگ نسل جدید فلاتر، اکنون پیش‌فرض برای macOS، ویندوز و لینوکس است. Impeller با جایگزینی Skia، مشکل «لگِ کامپایل شیدر» (Shader Compilation Jank) را از طریق کامپایل شیدرها در زمان ساخت (Build time) به جای زمان اجرا (Runtime) از بین می‌برد. این موتور APIهای سخت‌افزاری مدرن، به‌ویژه Metal در macOS و Vulkan در ویندوز و لینوکس را هدف قرار می‌دهد.

این تغییر باعث می‌شود انیمیشن‌های دسکتاپ از همان فریم اول، نرمیِ برنامه‌های Native را داشته باشند. در macOS، قابلیت Wide Gamut Color اکنون به‌طور پیش‌فرض فعال است و بازتولید رنگ‌های دقیق‌تری را در سخت‌افزارهای پشتیبانی‌شده فراهم می‌کند.

برای بهبود وضوح متن، موتور جدید اکنون از رندرینگ SDF (Signed Distance Function) در تمام پلتفرم‌های دسکتاپ استفاده می‌کند. این امر باعث می‌شود متن‌ها تیزتر و منحنی‌های برداری تمیزتر در مانیتورهایی با تراکم پیکسلی پایین به نظر برسند و از قدرت پردازشی گرافیکی بالاتر در ماشین‌های دسکتاپ بهره ببرد.

اگر توسعه‌دهندگان نیاز دارند به‌طور موقت از Impeller خارج شوند، می‌توانند از طریق تنظیمات خاص هر پلتفرم این کار را انجام دهند:

  • macOS: مقدار FLTEnableImpeller را در Info.plist برابر false قرار دهید.
  • Windows: عبارت project.set_impeller_switch(flutter::ImpellerSwitch::Disabled) را در main.cpp اضافه کنید.
  • Linux: تابع fl_dart_project_set_enable_impeller(project, FALSE) را در my_application.cc فراخوانی کنید.

گزینه‌های بازگشت (Fallback) در نسخه‌های آینده حذف خواهند شد. توسعه‌دهندگانی که متوجه می‌شوند مجبور به بازگشت به Skia هستند، تشویق می‌شوند تا باگ‌های مربوطه را گزارش کنند.

پنجره‌های آزمایشی و Flavorها

فلاتر در همکاری با Canonical و با مشارکت‌های @robert-ancell و @mattkae، در حال گسترش APIهای مدیریت پنجره در دسکتاپ است. اکنون ویندوز و لینوکس از پنجره‌های پاپ‌آپ برای منوهای راست‌کلیک (Context Menus) و پالت‌های ابزار (Utility Palettes) پشتیبانی می‌کنند.

لوگوی فلاتر با متن "What's new in Flutter 3.47"

توسعه‌دهندگان اکنون می‌توانند windowHandle را در کنترلرهای خاص هر پلتفرم فراخوانی کنند. این کار یک اشاره‌گر مستقیم به پنجره بومی (HWND در ویندوز، NSWindow در مک یا GtkWindow در لینوکس) فراهم می‌کند و امکاناتی مانند پنل‌های قابل جابه‌جایی (Dockable Panes) را فعال می‌سازد.

لوگوی فلاتر با متن "What's new in Flutter 3.47"

اصلاحات اخیر همچنین مشکلات فوکوس پنجره در ویندوز را برطرف کرده است (با کمک @9AZX). اکنون فعال کردن یک پنجره باعث نمی‌شود پنجره‌های پس‌زمینه به‌طور غیرمنتظره به جلو کشیده شوند یا هنگام بازگشت به اپلیکیشن، فوکوس را دوباره بدزدند.

لوگوی فلاتر در کنار عنوان «What's new in Flutter 3.47»

در لینوکس، ایجاد چندپنجره‌ای اکنون به‌طور صریح پنجره‌ها را پیش از دریافت اولین فریم از کامپوزیتور تحقق (Realize) می‌بخشد، که این امر هشدارهای رندرینگ اولیه و خطاهای کامپوزیتور را برطرف می‌کند. علاوه بر این، یک API جدید sized-to-content اضافه شده است که به پنجره‌های معمولی و دیالوگ‌ها اجازه می‌دهد به‌طور خودکار با اندازه محتوایشان تطبیق یابند.

ویندوز و لینوکس اکنون از Flutter Flavors پشتیبانی می‌کنند. شما می‌توانید در pubspec.yaml دارایی‌های (Assets) متفاوتی را برای Flavorهای مختلف تعریف کنید (مثلاً assets/flavor_a/images برای flavor_a) و از گزینه ساخت --flavor استفاده کنید، مانند flutter build windows --flavor flavor_a یا flutter build linux --flavor flavor_a. این قابلیت‌ها توسط @AngeloAvv فراهم شده است.

آمادگی برای اکوسیستم اپل

با ظهور Xcode 27، iOS 27 و macOS 27 در پاییز امسال، فلاتر حداقل نسخه‌های سیستم‌عامل پشتیبانی‌شده را برای تضمین پایداری از روز اول ارتقا داده است:

  • iOS: حداقل نسخه از ۱۳ به ۱۵ ارتقا یافت.
  • macOS: حداقل نسخه از ۱۰.۱۵ به ۱۲ ارتقا یافت.

نکته حیاتی این است که SDK نسخه iOS 27 استفاده از چرخه حیات UIScene را برای تمام اپلیکیشن‌های مبتنی بر UIKit اجباری کرده است. اپلیکیشن‌هایی که UIScene را نپذیرند، اجرا نخواهند شد. در حالی که CLI فلاتر بیشتر مهاجرت‌ها را به‌طور خودکار انجام می‌دهد، کدهای بومی سفارشی در AppDelegate یا پلاگین‌هایی که به چرخه حیات قدیمی متکی هستند، نیاز به مهاجرت دستی از طریق «راهنمای پذیرش UIScene/Delegate» دارند.

فلاتر همچنین در راستای همسویی با Apple Silicon، در حال کاهش پشتیبانی از مک‌های مبتنی بر Intel است. تست‌های خودکار روی سخت‌افزار اینتل غیرفعال شده‌اند و CLI هنگام ساخت روی میزبان‌های اینتل یا هدف قرار دادن معماری‌های دوگانه، هشدار چاپ می‌کند. این هشدارها در نسخه‌های آینده به خطا تبدیل خواهند شد. توسعه‌دهندگان می‌توانند با دستور flutter config --enable-macos-arm64-only اپلیکیشن‌های macOS را فقط برای ARM64 فعال کنند.

پیشرفت‌های قابل توجهی در زمینه Swift Package Manager (SwiftPM) صورت گرفته و ۹۲ مورد از ۱۰۰ پلاگین برتر iOS مهاجرت کرده‌اند. از آنجا که CocoaPods در حالت نگهداری (Maintenance) قرار دارد، پلاگین‌های مهاجرت‌نشده در نهایت از کار خواهند افتاد و در حال حاضر امتیازات کمتری در pub.dev دریافت می‌کنند. زمان‌های ساخت نیز توسط @lukemmtt بهینه‌سازی شده است، زیرا او طرح‌های (Schemes) غیرضروری SwiftPM را در مراحل اولیه فرآیند ساخت فیلتر کرده است.

WebAssembly و GenUI

فلاتر در حال حرکت به سمتی است که WebAssembly (Wasm) را به پیش‌فرض اپلیکیشن‌های وب تبدیل کند تا عملکردی در سطح Native را به مرورگر بیاورد. توسعه‌دهندگان می‌توانند با استفاده از پرچم --wasm (مثلاً flutter build web --release --wasm) این قابلیت را فعال کنند.

این انتقال نیازمند مهاجرت کدها به بسته جدید JS interop یعنی package:web است، زیرا کتابخانه قدیمی dart:html پشتیبانی نمی‌شود. برای کمک به مقیاس‌پذیری اپلیکیشن‌های بزرگتر، این نسخه پشتیبانی آزمایشی از Deferred Loading در Wasm را از طریق پرچم --enable-wasm-deferred-loading معرفی می‌کند که اجازه می‌دهد اپلیکیشن‌ها به ماژول‌های کوچکتر و Lazy-load تقسیم شوند.

در جبهه هوش مصنوعی، بسته genui به نسخه ۰.۱۰.۰ رسید. این به‌روزرسانی موارد زیر را معرفی می‌کند:

  • بسته a2ui_core: متمرکز کردن کلاس‌های مربوط به پروتکل، از جمله عبارت‌ها (Expressions) و ورودی‌های کاتالوگ.
  • توابع سمت کلاینت: فعال کردن عامل‌ها (Agents) برای هدایت کلاینت جهت انجام اعتبارسنجی یا محاسبه مقادیر مشتق‌شده بدون نیاز به رفت و برگشت به سرور.

پیش‌نمایش پایدار ویجت‌ها

قابلیت Flutter Widget Preview رسماً به وضعیت پایدار (Stable) رسید. این ابزار به توسعه‌دهندگان اجازه می‌دهد تا اجزای UI را به‌طور مجزا رندر، بازبینی و روی آن‌ها تکرار کنند، بدون اینکه نیاز باشد کل اپلیکیشن را بسازند یا اجرا کنند.

بهبودهای کلیدی در نسخه پایدار عبارتند از:

  • استارت‌آپ سریع‌تر: کشینگ محلی پروژه در پوشه .widget_preview/ هزینه‌های تکراری را از بین می‌برد.
  • تست منعطف: یک API انتزاعی به نام PreviewThemeData اکنون از لایه‌بندی متوالی تم‌ها برای تست‌های ماتریسی پیچیده پشتیبانی می‌کند.
  • همگام‌سازی دارایی‌های وب: همگام‌سازی خودکار دارایی‌های پوشه web/ از پروژه میزبان، شامل تم‌های سفارشی و شخصی‌سازی‌های index.html.

اصلاحات پلتفرم و دسترسی‌پذیری

بهبودهای اندروید
در اندروید، تیم توسعه مشکلی را در کیبورد مجازی حل کرد که در آن کلیدهای Modifier مانند Shift گیر می‌کردند. اکنون پاسخ‌دهنده کلید (Key responder)، سنتز کلیدهای فیزیکی را برای ورودی‌های کیبورد مجازی نادیده می‌گیرد.

دسترسی‌پذیری و Semantics
فریم‌ورک اکنون تنظیمات High-contrast و Invert Colors اندروید را به‌طور خودکار از طریق MediaQueryData.highContrast و MediaQueryData.invertColors تشخیص می‌دهد (با مشارکت @xxxOVALxxx).

لوگوی فلاتر با متن "What's new in Flutter 3.47"

سایر به‌روزرسانی‌ها شامل موارد زیر است:

  • متن‌های تو در تو (Nested text spans) در Text.rich اکنون با توالی چیدمان خود در درخت Semantics مطابقت دارند.
  • مسدود کردن فوکوس کیبورد برای BlockSemantics اضافه شده است.

متن و انتخاب
دستگیره‌های انتخاب متن (Selection handles) در موبایل هنگام اسکرول تثبیت شده‌اند. پیش از این، دستگیره‌ها می‌توانستند منوی زمینه (Context menu) را هنگام قرارگیری در بالای صفحه بپوشانند؛ این اصلاح توسط @JhonaCodes انجام شد.

لوگوی فلاتر با متن "What's new in Flutter 3.47"

لوگوی فلاتر با متن "What's new in Flutter 3.47"

آرتیفکت‌های بصری هایلایت در متن‌های قابل انتخاب کمرنگ توسط @ikramhasan حذف شده‌اند و کرشی که در SelectableRegion در کانتینرهای اسکرول‌شونده خالی رخ می‌داد، برطرف شده است.

لوگوی فلاتر با متن "What's new in Flutter 3.47"

ژست‌ها و ویجت‌های هسته

  • iOS: بهبود انتشار ژست‌ها برای Viewهای بومی که از طریق Platform Views جاسازی شده‌اند.
  • اسکرول: EdgeDraggingAutoScroller اکنون از ScrollPhysics ویوی اسکرول فعال پیروی می‌کند و از اسکرول خودکار در لیست‌های قفل‌شده جلوگیری می‌کند.
  • هسته: ImageIcon اکنون از useOriginalColors: true پشتیبانی می‌کند، AnimatedCrossFade اجازه تعیین رفتار Clipping را می‌دهد و ImageStreamListener اکنون می‌تواند خطاهای استریم تصویر را مستقیماً ردیابی کند.

سایر اصلاحات پلتفرم

  • ویندوز: موقعیت قرارگیری Caret برای ترکیب متن کره‌ای برطرف شد (@CHOIgoung). پلاگین‌ها اکنون می‌توانند کارهای سنگین را با استفاده از FlutterEngine::PostPlatformThreadTask از رشته پلتفرم (Platform thread) خارج کنند.
  • لینوکس: @CodeDoctorDE گزارش چرخش و فشار استایلوس (Stylus) را اضافه کرد.
  • گرافیک: شیدرهای Fragment که OpenGLES را هدف قرار می‌دهند، دیگر هنگام خواندن تکسچرها نیازی به معکوس کردن شرطی مختصات ندارند؛ این کار اکنون در شیدر Vertex انجام می‌شود.
  • iOS/macOS: CLI اکنون هنگام انتخاب گواهینامه‌ها، هم Team ID و هم Team Name را نمایش می‌دهد (@alex-medinsh) و پیام‌های خطای Provisioning Profile واضح‌تر شده‌اند (@mozammal-hossain).

ماتریس وابستگی‌های اندروید

برای تضمین پایداری ساخت، فلاتر ۳.۴۷ در برابر نسخه‌های وابستگی زیر تأیید شده است:

  • Java: حداقل ۱۷
  • Kotlin Gradle Plugin (KGP): ۲.۴.۰
  • Android Gradle Plugin (AGP): ۹.۱.۰
  • Gradle: حداقل ۹.۳.۱

متغیرهای پیش‌فرض API Level به شرح زیر پیکربندی شده‌اند:

  • flutter.compileSdkVersion: API 36
  • flutter.targetSdkVersion: API 36
  • flutter.minSdkVersion: API 24

تحلیل

این انتشار نشان‌دهنده یک تغییر بنیادین در نحوه مدیریت هویت فلاتر است. با جداسازی کتابخانه‌های UI، فلاتر از یک فریم‌ورک یکپارچه (Monolithic) به یک اکوسیستم مدولار تبدیل می‌شود. این کار «قفل نسخه‌ای» (Version lock) را که اغلب اپلیکیشن‌های بزرگ سازمانی را دچار مشکل می‌کند، کاهش می‌دهد؛ جایی که یک تیم ممکن است از ارتقای فریم‌ورک بترسد چون تنها یک تغییر ناپایدار در یک ویجت رخ داده است.

برای توسعه‌دهندگان، پیش‌فرض شدن Impeller در دسکتاپ یک پیروزی واقعی است. این تغییر آخرین مانع بزرگ برای اپلیکیشن‌های دسکتاپ با کیفیت بالا — یعنی لرزش انیمیشن‌ها — را از بین می‌برد. فشار به سمت Wasm و حذف تدریجی مک‌های اینتل، مسیر روشنی را نشان می‌دهد: فلاتر در حال بهینه‌سازی برای آینده‌ای با عملکرد بالا، مبتنی بر ARM و بومی وب است.

گام بعدی

توسعه‌دهندگان باید فوراً flutter upgrade را اجرا کرده و اپلیکیشن‌های خود را با بتای اپل تست کنند تا از کرش‌های روز اول در iOS 27 جلوگیری نمایند. همچنین می‌توانید بسته جدید material_ui را در pub.dev بررسی کنید تا اولین موج به‌روزرسانی‌های جداسازی شده را ببینید و صفحه Breaking Changes را برای آماده‌سازی جهت مهاجرت به بسته‌های UI مستقل مطالعه کنید.

چرا این موضوع مهم است؟

این به‌روزرسانی با حذف لگ‌های رندرینگ در دسکتاپ و تسریع چرخه به‌روزرسانی UI، اعتبار فلاتر را به عنوان ابزاری برای اپلیکیشن‌های High-fidelity افزایش می‌دهد. جداسازی کتابخانه‌ها، ریسک ارتقای نسخه‌های بزرگ را برای تیم‌های توسعه کاهش می‌دهد.

تأثیر برای ایران

برای توسعه‌دهندگان ایرانی که در پروژه‌های بزرگ سازمانی فعال‌اند، این تغییر ریسک به‌روزرسانی فریم‌ورک را کم می‌کند. همچنین بهینه‌سازی‌های Wasm فرصتی برای اجرای سریع‌تر اپلیکیشن‌های وب در زیرساخت‌های اینترنتی ایران است.

·نگاه ما
تحریریه دات‌هوش

فلاتر با این حرکت، از یک فریم‌ورک یکپارچه (Monolithic) به یک اکوسیستم مدولار تبدیل می‌شود. این تغییر استراتژیک، «قفل نسخه‌ای» را که در پروژه‌های سازمانی بزرگ باعث ترس از ارتقا می‌شد، می‌شکند. تمرکز شدید روی Wasm و حذف تدریجی اینتل نشان می‌دهد گوگل فلاتر را برای آینده‌ای مبتنی بر ARM و وب-نیتیو بازتعریف می‌کند.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.