ورود و عضویت
0
سبد خرید شما خالی است
0
سبد خرید شما خالی است

آشنایی با ویژگی های فلاتر 2.8 و دارت 2.15

3 دیدگاه
5 دقیقه برای مطالعه

فریم ورک برنامه نویسی فلاتر به سرعت در حال رشد و گسترش است. گوگل با معرفی فلاتر و زبان دارت در نحوه طراحی اپلیکیشن های موبایل تغییرات بسیار زیادی ایجاد کرد و اکنون بیش از 370,000 اپلیکیشن موبایلی توسعه داده شده به وسیله این فریمورک در گوگل پلی وجود دارد.

اگر اطلاعاتی درباره این فریمورک ندارید میتوانید به مقاله فلاتر چیست مراجعه کنید.

در این مقاله به بررسی امکانات جدید آخرین نسخه منتشر Flutter 2.8 و زبان Dart 2.15 میپردازیم.

ابتدا با زبان برنامه نویسی دارت شروع میکنیم, جایی که مهم ترین تغییرات را داشته است.

این تغییرات شامل معرفی نوع جدید متدهای سازنده و امکانات جدید برای enum ها و برنامه نویسی همزمان concurrency میباشد.

سرعت بیشتر برنامه نویسی همزمان concurrency 

امروزه تمام پردازنده شامل چندین هسته میباشند که این ویژگی باعث افزایش سرعت کار کردن با نرم افزارها و اجرای همزمان تعداد بیشتری برنامه میباشد. در زبان دارت به طور پیش فرض تمام کدها روی یک هسته اجرا میشود. اما عملیات های اضافی مانند I/O, ارتباط با سرور و… روی هسته ای جداگانه بصورت async  اجرا میشود.

اما گاهی نیاز تا کدهای اصلی نیز به شکل همزمان و موازی اجرا شوند. برای مثال در هنگام تجزیه کردن یک فایل جیسون عظیم میخواهید انیمشنی هم تا اتمام عملیات به کاربر نمایش دهید. این عملیات ممکن است زمان زیادی برای پردازش نیاز داشته باشد و این کار باعث شود تا حافظه زیادی اشغال شود و رابط کاربری دچار کندی و لگ شود. با انتقال این عملیات های زمانبر به یک هسته جدا در این حالت انیمیشن مورد نظر میتواند در Thread اصلی بدون مشکل کار کند.

مقایسه فلاتر و زبان کاتلین

مدل پیاده سازی همزمانی یا کانکارنسی در زبان دارت با کمک isolates انجام میشود که از واحدهای کوچکی تشکیل شده است که به شکل مستقل اجرا میشوند. این حالت از تشکیل یک کلاس با اطلاعات حجیم جلوگیری میکند و در مصرف حافظه بهینه تر میباشد.

زبان دارت برای رفع مشکلات حافظه به isloatesها امکان اشتراک گذاری نمونه هایی که قابلیت تغییر اطلاعات را دارند را نمیدهد و به جای آن از سیستمی به نام message passing استفاده میکند.

نسخه 2.15 دارت شامل بهبودهای بسیاری در بخش isolate میباشد. به طور کلی با معرفی مفهوم جدیدی تحت عنوان isolate groups روش کار isolate در نسخه جدید زبان دارت تغییر کرده است. Isolate ها در گروه اطلاعات ساختاری داخلی متنوعی را به اشتراک میگذراند که نمایان کننده برنامه در حال اجرا میباشد. این قابلیت باعث میشود ایجاد یک Isolate جدید و اضافه کردن آن به گروه با مرتبه زمانی بسیار کمتر و سرعت بیشتری انجام شود.

با اینکه امکان اشتراک گذاری نمونه ها در بین Isolateها وجود ندارد که در این روش جدید isolate groups شامل یک پشته میباشد که امکانات بسیاری را در اختیار توسعه دهندگان قرار میدهد.

برای مثال در یک سناریو درخواستی به سرور ارسال میشود و یک فایل جیسون بازگردانده میشود. این جیسون را تجزیه میکنیم به گراف جیسون بزرگتری اضافه میکنیم و در نهایت این گراف را به isolate اصلی ارسال میکنیم. در نسخه های قبلی باید از نتیجه عملیات یک کپی ایجاد میشد و آن را استفاده میکردیم اما در این حالت نیازی به انجام کپی نیست و حافظه کمتری برای عملیات مورد نیاز است.

در نسخه 2.15 دارت با فراخوانی متد Isolate.exit() توسط یک isolate در حال کار و ارسال نتیجه عملیات به عنوان پارامتر ورودی به متد سیستم حافظه این بخش را به همراه نتیجه کار به isolate اصلی ارسال میکند و این کار بدون نیاز به کپی انجام میشود. بنابراین isolate اصلی در یک زمان ثابت میتواند به نتیجه کار دسترسی داشته باشد.

همچنین برای بهبود عملکرد بهتر این بخش متد compute() نیز شامل تغییراتی در نحوه کار خود شده است. در نهایت دریافت اطلاعات 8 برابر سریعتر اتفاق میفتاد.

متدهای سازنده tear-offs در دارت

در زبان برنامه نویسی دارت میتوانید یک نمونه از تابع ایجاد کنید که به یک تابعی در نمونه دیگر اشاره میکند. به مثال زیر توجه کنید.

class Greeter {
  final String name;
  Greeter(this.name);
  
  void greet(String who) {
    print('$name says: Hello $who!');
  }
}
void main() {
  final m = Greeter('Michael');
  final g = m.greet; t.
  g('Leaf'); //  "Michael says: Hello Leaf!"
}

در خط دوم متد main متغیر g به تابعی که در نمونه m قرار دارد اشاره میکند. به این نوع توابع tear-offs نیز گفته میشود که استفاده زیادی در کتابخانه های هسته دارت دارد.

به مثال دیگر توجه کنید.

final m = Greeter('Michael');
['Lasse', 'Bob', 'Erik'].forEach(m.greet);
// Prints "Michael says: Hello Lasse!", "Michael says: Hello Bob!",
// "Michael says: Hello Erik!"

در این مثال از یک اشاره گر متد برای foreach() روی یک لیست استفاده کرده ایم. تابع m.greet برای تک تک اعضای لیست به عنوان پارامتر ورودی اجرا میشود.

تا قبل از این نمیتوانستیم برای متدهای سازنده از این قابلیت tear-offs استفاده کنیم اما در دارت 2.15 این امکان وجود دارد.

در مثال زیر مشاهده میکنید که چگونه با استفاده از متد .map() و قرار دادن یک متد سازنده tear-off از کلاس Text سه ویجت متن را داخل یک ویجت Column قرار میدهیم.

class FruitWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
        children: ['Apple', 'Orange'].map(Text.new).toList());
  }
}

Text.new به متدسازنده پیشفرض کلاس Text اشاره دارد.

ویژگی جدید ارائه شده در بخش generic میباشد. در این نسخه از زبان دارت میتوانید متدهای از نوع generic را در حالت های غیر generic استفاده کنید.

T id<T>(T value) => value;
var intId = id<int>; // New in 2.15.
int Function(int) intId = id; // Pre-2.15 workaround.


var y = List; // Already supported.
var z = List<int>; // New in 2.15.

قابلیت های جدید Enum

بهبودهای مفیدی در نحوه استفاده از enum در زبان دارت به وجود آمده است. برای مثال هم اکنون میتوانید نام مقادیر یک enum را به شکل رشته دریافت کنید.

enum MyEnum {
  one, two, three
}
void main() {
  print(MyEnum.one.name);  // Prints "one".
}

همچنین میتوانید به شکل یک map تمام نام های موجود را دریافت کنید.

final map = MyEnum.values.asNameMap(); 
print(map['three'] == MyEnum.three);  // Prints "true".

امکانات جدید توسعه دهندگان پکیج

تغییر به وجود آمده مهم دیگر مربوط به توسعه دهندگانی است که در بخش تولید پکیج های مختلف فعالیت میکنند.

برای امنیت بیشتر امکانات بیشتری در بخش اعتبار سنجی قبل از انتشار پکیج ها قرار گرفته است که تا به اشتباه اطلاعات حیاتی توسعه دهندگان داخل کدها قرار نداشته باشد.

امکان جدید دیگر که در این بخش قرار گرفته است به توسعه دهندگان این امکان را میدهد تا نسخه های مختلف منتشر شده از پکیج را حذف کنند. تا قبل از این گوگل فقط پیشنهاد میکرد تا نسخه جدیدی برای پکیج منتشر شود و امکان حذف نسخه های منتشر شده وجود نداشت.

اما در ادامه بپردازیم به تغییرات و امکانات جدید فریمورک فلاتر 2.8

بازی سازی در فلاتر با Flame

ساخت بازی در فلاتر Flame

برای خیلی از افراد فلاتر یک فریمورک مخصوص طراحی اپلیکیشن های موبایل و وب میباشد. اما با بزرگ شدن این اکوسیستم اکنون میتوانید از موتور بازی سازی Flame که نسخه 1.0 آن منتشر شده است برای ساخت بازی های دو بعدی استفاده کنید.

تقریبا هر امکاناتی که برای ساخت یک بازی دو بعدی نیاز دارید را به وسیله فلاتر و Flame میتوانید برطرف کنید. از گرافیک و رابط کاربری گرفته تا مدیریت حالت های مختلف دوربین و تشخیص برخورد به اشیا.

همچنین امکان استفاده از پکیج هایی مثل Rive برای ایجاد انیمیشن, audioplayers  برای پخش موسیقی و… را نیز دارید.

فلاتر DevTools

DevTools Flutter

از امروز به بعد دیگر نیازی به دانلود DevTools به شکل جداگانه ندارید و در قالب SDK همه موارد مورد نیاز را میتوانید نصب کنید.

قابلیت جدیدی هم که به آن اضافه شده است Enhance Tracing نام دارد که با کمک آن میتوانید مواردی که در طراحی رابط کاربری باعث ایجاد مشکل در عملکر برنامه میشوند را شناسایی کنید. با فعال کردن هر یک از این گزینه ها یک رویداد جدیدی به تایم لاین اضافه میشود که شامل ساخته شدن ویجت, رندر شدن و.. میباشد.

پکیج فلاتر WebView 3.0

همزمان با انتشار فلاتر 2.8 نسخه 3.0 پلاگین webview_flutter نیز منتشر شد. این پلاگین امکان نمایش صفحات وب را در برنامه ممکن میسازد. در این نسخه امکان ارسال درخواست POST نیز در کنار درخواست GET فراهم شده است.

ویژگی جدید دیگر به شما این امکان را میدهد تا از یک رشته یا فایل برای نمایش محتویات HTML استفاده کنید.

نوشتن کوکی و استفاده از پس زمینه شفاف از دیگر تغییرات این پکیج میباشد.

برای بخش وب هم یک پکیچ دیگر تحت عنوان webview_flutter_web منتشر شده است که در وب اپلیکیشن های میتوانید از وب ویو استفاده کنید.

طراحی رابط کاربری Firebase UI

سرویس فایربیس گوگل شامل امکانات فوق العاده ای میباشد که استفاده از آن حتی در حالت رایگان هم باعث میشود زمان مورد نیاز برای توسعه یک اپلیکیشن کاهش پیدا کند. یکی از امکانات جذاب فایربیس سرویس ثبت نام و ورود از طریق ایمیل, شماره موبایل و اکانت شبکه های اجتماعی میباشد.به طور کلی احراز هویت و ثبت نام شامل مراحی مختلفی است که علاوه بر ورود اطلاعات در حالت هایی نیاز به بازیابی رمز عبور, ارسال کد تایید, ورود دو مرحله و… نیز هست. برای سرعت بخشیدن به این مراحل گوگل در نسخه فلاتر 2.8 پکیج جدیدی به نام flutterfire_ui معرفی کرده است که شامل ویجت های آماده ای میباشد که با کدنویسی بسیار کمی برای شما یک صفحه ثبت و ورود به همراه سایر مراحل طراحی میکند.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => MaterialApp(
        home: AuthenticationGate(),
      );
}

class AuthenticationGate extends StatelessWidget {
  const AuthenticationGate({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => StreamBuilder<User?>(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (context, snapshot) {
          // User is not signed in - show a sign-in screen
          if (!snapshot.hasData) {
            return SignInScreen(
              providerConfigs: [
                EmailProviderConfiguration(),
                GoogleProviderConfiguration(
                  clientId: 'xxxx-xxxx.apps.googleusercontent.com',
                ),
              ],
            );
          }

          return HomePage(); // show your app’s home page after login
        },
      );
}

خروجی کد بالا در حالت نسخه وب فلاتر بصورت زیر خواهد بود. رابط کاربری ایجاد شده کاملا واکنشگرا میباشد و در همه پلتفرم ها قابل استفاده است.

فلاتر Firebase UI

نسخه فلاتر 2.8 برخلاف بروزرسانی های قبلی شامل معرفی ویجت های جدیدی نمیباشد اما در بخش عملکرد و بهینه تر شدن اپلیکیشن های طراحی شده قدم های بسیار خوبی برداشته شده است.

حذف نسخه Dev channel

فریمورک فلاتر شامل نسخه های مختلفی میباشد که در زمان توسعه نوع آن را میتوانید انتخاب کنید.

یکی از این نسخه ها حالت Dev channel میباشد که از امروز به بعد در اختیار توسعه دهندگان نیست و از فلاتر 2.8 حذف شده است. دلیل آن هم تعداد اندک کاربران این نسخه میباشد که کمتر از 3% بود.

تیم توسعه فلاتر با هدف تمرکز بروی نسخه های اصلی تصمیم به حذف این مورد گرفته است.

در حال حاضر 90% کاربران از نسخه Stable استفاده میکنند. بروزرسانی های این نسخه آرام و همراه با مشکلات و باگ های کمتری است به همین دلیل برای توسعه محصولات نهایی حتما از این نسخه استفاده کنید.

حالت beta شامل بروزرسانی های ماهیانه است و تغییرات ابتدا برای این نسخه از فلاتر ارائه میشود به همین دلیل ممکن با مشکلات و باگ های مختلفی دست و پنجه نرم کنید.

حالت master نیز نسخه اصلی توسعه فلاتر است که شامل پشتیبانی کاربران نمیباشد و برای تست های مختلف از آن معمولا استفاده میشود.

3 پاسخ به “آشنایی با ویژگی های فلاتر 2.8 و دارت 2.15”

  1. A.H گفت:

    ممنون از مقاله مفیدتون. استفاده از پکیج flutterfire_ui در ایران قابل استفادست؟یعنی مشکل تحریم نداره؟

  2. sam گفت:

    نسخه جدید فلاتر که تازه هم اومده رو میشه معرفی کنید

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Hesam
09 دسامبر 2021
آموزش فارسی فلاتر
آموزش فارسی flutter