تغییرات جدید دارت 3.7

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

Wildcard variables language feature

متغیرهای محلی و پارامترهایی که با نام _ تعریف می‌شوند، اکنون در زبان دارت مشابه چیزی هستند که در زبان‌های تابعی "wildcards" (کارت‌های جایگزین) نامیده می‌شوند. این بدان معناست که این نام فقط به‌عنوان یک جای‌نگهدار عمل می‌کند و هیچ متغیر واقعی‌ای را اعلام نمی‌کند.

در حال حاضر در دارت، رایج است که اگر بدنه‌ی یک callback نیازی به استفاده از آرگومان نداشته باشد، از _ به‌عنوان نام پارامتر callback استفاده شود، مانند مثال زیر:

void announceCompletion(Future future) {
  future.then((_) { // <--
    print('Complete!');
  });
}

اما اگر یک callback دارای چندین پارامتر باشد که نیازی به استفاده از آن‌ها ندارید، معمولاً آن‌ها را به صورت _، __، ___ و ... نام‌گذاری می‌کنید، زیرا در غیر این صورت نام‌ها با یکدیگر تداخل پیدا می‌کنند.

اکنون، در Dart 3.7، پارامترها و متغیرهای محلی که با نام _ تعریف می‌شوند، در واقع هیچ متغیری ایجاد نمی‌کنند، بنابراین دیگر امکان تداخل نام وجود ندارد. می‌توانید از _ برای چندین پارامتر استفاده کنید، مانند:

void announceFailure(Future future) {
  future.onError((_, _) { // <--
    print('Error!');
  });
}

اگر کدی دارید که یک پارامتر یا متغیر با نام _ تعریف کرده و از آن استفاده می‌کند، این کد دیگر در Dart 3.7 کار نخواهد کرد. برای مثال:

var [1, 2, 3].map((_) {
  return _.toString(); // ^ Error! Reference to unknown variable.
});

در چنین شرایطی، باید نام پارامتر یا متغیر محلی را تغییر دهید. این تغییر زبانی فقط بر پارامترها و متغیرهای محلی تأثیر می‌گذارد و شامل متغیرهای سطح بالا (top-level) یا اعضای کلاس (class members) نمی‌شود. بنابراین، می‌توانید نام‌گذاری را بدون ایجاد تغییر در API عمومی کتابخانه خود انجام دهید.

متغیرهای Wildcard یک ویژگی کوچک هستند که زبان را منسجم‌تر می‌کنند. در واقع، متغیرهایی که در الگوها (patterns) با نام _ تعریف می‌شوند، همیشه به این شکل رفتار کرده‌اند:

var [_, _, third, _, _] = [1, 2, 3, 4, 5];
print(third); // Prints "3".


New formatting style in the Dart formatter

در Dart 3.7، فرمت‌کننده Dart (دستور dart format) به‌طور کامل بازنویسی شده و از سبک قالب‌بندی جدیدی پشتیبانی می‌کند. سبک جدید شبیه به حالتی است که وقتی به لیست آرگومان‌ها کاماهای انتهایی (trailing commas) اضافه می‌کنید، مشاهده می‌شود.

اکنون فرمت‌کننده به‌طور خودکار این کاماها را اضافه یا حذف می‌کند. برای مثال:

// Old style:
void writeArgumentList(
    Token leftBracket, List elements, Token rightBracket) {
  writeList(
      leftBracket: leftBracket,
      elements,
      rightBracket: rightBracket,
      allowBlockArgument: true);
}

// New style:
void writeArgumentList(
  Token leftBracket,
  List elements,
  Token rightBracket,
) {
  writeList(
    leftBracket: leftBracket,
    elements,
    rightBracket: rightBracket,
    allowBlockArgument: true,
  );
}

این تغییر، تغییر بزرگی در ابزار dart format، خروجی آن و نحوه‌ی عملکردش ایجاد کرده است. برای اینکه این انتقال به‌صورت هموار انجام شود، سبک قالب‌بندی که دریافت می‌کنید به نسخه‌ی زبان (language version) وابسته است:

  • اگر نسخه‌ی زبان 3.6 یا قبل‌تر باشد، کد با سبک قدیمی قالب‌بندی می‌شود.
  • اگر نسخه‌ی زبان 3.7 یا بالاتر باشد، سبک جدید اعمال می‌شود.

برای تعیین نسخه‌ی زبان هر فایل، ابزار dart format به دنبال فایل package_config.json می‌گردد. این یعنی برای قالب‌بندی صحیح کدهای یک پکیج، باید ابتدا دستور زیر را اجرا کنید:

dart pub get

چرا این مرحله مهم است؟

dart pub get وابستگی‌های پروژه را دریافت کرده و فایل package_config.json را ایجاد یا به‌روز می‌کند. بدون این فایل، dart format نمی‌تواند نسخه‌ی زبان را شناسایی کرده و ممکن است از سبک قالب‌بندی اشتباه استفاده کند.


Updated quick fixes and new lints in the Dart analyzer

ما همیشه در حال بهبود Dart برای افزایش بهره‌وری توسعه‌دهندگان هستیم، و این شامل بهبود آنالایزر (analyzer) با lint‌های جدید، رفع سریع (quick fixes) و دستیارها (assists) در Dart 3.7 نیز می‌شود.

یکی از تغییرات مهم در این نسخه، افزودن unnecessary_underscores lint است که از ویژگی متغیرهای جای‌نگهدار (wildcard variables) پشتیبانی می‌کند.

در Dart 3.7، علاوه بر مجموعه گسترده‌ای از رفع سریع‌ها (quick fixes) و دستیارها (assists) جدید، اصلاحاتی برای مشکلات رایج نیز اضافه شده است. این شامل اصلاحات برای مشکلاتی مانند کلمات کلیدی await گم‌شده، پیشوندهای واردات نادرست و نقض قوانین lint مانند cascade_invocations است. همچنین، دستیارهای مفیدی برای رفکتور کردن کد (refactoring) وجود دارد، مانند تبدیل بلوک‌های else به else if و محصور کردن ویجت‌های Flutter با Expanded یا Flexible.


Moving forward on the Dart web platform

یک سال پیش، ما کتابخانه‌ها و پکیج‌های جدیدی را برای تعامل با JavaScript و APIهای مرورگر از Dart معرفی کردیم. از این به بعد، کتابخانه اصلی JavaScript برای تعامل با JavaScript در Dart، dart:js_interop خواهد بود. برای تعامل با APIهای مرورگر، باید از پکیج package:web استفاده کنید.

به‌عنوان بخشی از تلاش‌های مستمر ما برای انتقال اکوسیستم‌های Dart و Flutter به APIهای سازگار با WebAssembly، در نسخه Dart 3.7، هفت کتابخانه‌ مرتبط با APIهای قدیمی که دیگر از آن‌ها پشتیبانی نمی‌شود، منسوخ شده‌اند. این تغییرات به هدف هماهنگی بیشتر با استانداردهای وب و افزایش پشتیبانی از WebAssembly انجام شده است.

کتابخانه‌های منسوخ‌شده در Dart 3.7:

  1. dart:html
  2. dart:indexed_db
  3. dart:js
  4. dart:js_util
  5. dart:web_audio
  6. dart:web_gl

چرا این تغییرات انجام شده است؟

این تغییرات به دلیل حرکت به سوی استفاده از APIهای سازگار با WebAssembly است که از نظر عملکرد و سازگاری بهتر با مرورگرها و پلتفرم‌های مختلف عمل می‌کنند. هدف این است که اکوسیستم Dart به سمت معیاری جهانی حرکت کند که با فناوری‌های نوظهور مانند WebAssembly و Web3 سازگاری داشته باشد.


New productivity features on the pub.dev package site

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

امروز، ما این ویژگی را گسترش داده‌ایم و امکان مشاهده تعداد دانلودها برای هر نسخه از پکیج را اضافه کرده‌ایم. اکنون می‌توانیم بررسی کنیم که چه تعداد از کاربران یک پکیج به آخرین نسخه (یا حداقل به آخرین نسخه اصلی) ارتقاء یافته‌اند. این اطلاعات می‌توانند به نویسندگان پکیج کمک کنند تا ارزش بازگشت اصلاحات به نسخه‌های اصلی قدیمی‌تر را ارزیابی کنند.


Dark mode for pub.dev

مدت‌ها بود که حالت تاریک (Dark Mode) برای pub.dev درخواست زیادی داشت و از امروز این ویژگی در دسترس است. اکنون می‌توانید pub.dev را به حالت تاریک تغییر دهید. این تغییرات شامل صفحات پکیج و مستندات API پکیج‌ها می‌شود که در pub.dev میزبانی می‌شوند.

1 🔥
1 🎉
1 😮
1 👍
1 💜
1 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁