1. مقدمه
دارت زبان برنامه نویسی Flutter است، جعبه ابزار UI گوگل برای ساخت اپلیکیشن های زیبا و بومی موبایل، وب و دسکتاپ از یک پایگاه کد واحد.
این نرم افزار کد دارت را با تمرکز بر ویژگی هایی که توسعه دهندگان جاوا انتظار ندارند، به شما معرفی می کند. شما می توانید توابع دارت را در 1 دقیقه، اسکریپت ها را در 5 دقیقه و برنامه ها را در 10 دقیقه بنویسید!
چیزی که یاد خواهید گرفت
- نحوه ایجاد سازنده
- روش های مختلف برای تعیین پارامترها
- زمان و نحوه ایجاد گیرنده و ستتر
- چگونه دارت حریم خصوصی را کنترل می کند
- نحوه ایجاد کارخانه ها
- نحوه عملکرد برنامه نویسی تابعی در دارت
- سایر مفاهیم اصلی دارت
آنچه شما نیاز دارید
برای تکمیل این کد لبه، تنها چیزی که نیاز دارید یک مرورگر است!
همه نمونه ها را در DartPad می نویسید و اجرا می کنید، یک ابزار تعاملی مبتنی بر مرورگر که به شما امکان می دهد با ویژگی های زبان دارت و کتابخانه های اصلی بازی کنید. اگر ترجیح می دهید، می توانید به جای آن از یک IDE مانند WebStorm، IntelliJ با افزونه Dart یا کد ویژوال استودیو با پسوند Dart Code استفاده کنید.
دوست دارید از این کد لبه چه چیزی یاد بگیرید؟
2. یک کلاس دارت ساده ایجاد کنید
شما با ساختن یک کلاس دارت ساده با عملکردی مشابه کلاس Bicycle
از آموزش جاوا شروع خواهید کرد. کلاس Bicycle
شامل برخی از متغیرهای نمونه خصوصی با گیرنده و تنظیم کننده است. یک متد main()
یک Bicycle
را نمونهسازی میکند و آن را در کنسول چاپ میکند.
DartPad را راه اندازی کنید
این نرم افزار کد یک نمونه دارت پد جدید را برای هر مجموعه تمرین ارائه می دهد. پیوند زیر یک نمونه جدید را باز می کند که شامل یک مثال پیش فرض "Hello" است. میتوانید به استفاده از همان DartPad در سراسر کد لبه ادامه دهید، اما اگر روی Reset کلیک کنید، DartPad شما را به مثال پیشفرض برمیگرداند و کارتان را از دست میدهید.
کلاس دوچرخه را تعریف کنید
بالای تابع
main()
یک کلاس Bicycle
با سه متغیر نمونه اضافه کنید. همچنین محتویات را از main()
حذف کنید، همانطور که در قطعه کد زیر نشان داده شده است:
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
}
مشاهدات
- با این مثال، تحلیلگر Dart خطایی ایجاد میکند که به شما اطلاع میدهد که متغیرها باید مقداردهی اولیه شوند زیرا غیر قابل تهی هستند. در بخش بعدی آن را برطرف خواهید کرد.
- متد اصلی دارت
main()
نام دارد. اگر نیاز به دسترسی به آرگومان های خط فرمان دارید، می توانید آنها را اضافه کنید:main(List<String> args)
. - متد
main()
در سطح بالا زندگی می کند. در Dart می توانید کدهای خارج از کلاس ها را تعریف کنید. متغیرها، توابع، دریافتکنندهها و تنظیمکنندهها همگی میتوانند خارج از کلاسها زندگی کنند. - مثال اصلی جاوا، متغیرهای نمونه خصوصی را با استفاده از تگ
private
، که دارت از آن استفاده نمیکند، اعلام میکند. کمی بعد در «افزودن یک متغیر فقط خواندنی» درباره حریم خصوصی اطلاعات بیشتری کسب خواهید کرد. - نه
main()
و نهBicycle
به عنوانpublic
اعلام نمی شوند، زیرا همه شناسه ها به طور پیش فرض عمومی هستند. دارت کلمات کلیدیpublic
،private
یاprotected
ندارد. - دارت از تورفتگی دو کاراکتری بر اساس قرارداد به جای چهار کاراکتر استفاده می کند. به لطف ابزار مفیدی به نام قالب دارت ، نیازی به نگرانی در مورد قراردادهای فضای خالی Dart ندارید. همانطور که قراردادهای کد دارت ( دارت موثر ) میگویند، "قوانین رسمی مدیریت فضای خالی برای دارت، هر فرمت دارت تولید میکند ."
سازنده دوچرخه را تعریف کنید
سازنده زیر را به کلاس
Bicycle
اضافه کنید:
Bicycle(this.cadence, this.speed, this.gear);
مشاهدات
- این سازنده بدنه ندارد که در دارت معتبر است.
- اگر نقطه ویرگول (
;
) در انتهای یک سازنده بدون بدنه را فراموش کنید، DartPad خطای زیر را نمایش می دهد: "یک بدنه تابع باید ارائه شود." - استفاده از
this
در لیست پارامترهای سازنده یک میانبر مفید برای تخصیص مقادیر به متغیرهای نمونه است. - کد بالا معادل کد زیر است که از یک لیست اولیه استفاده می کند:
Bicycle(int cadence, int speed, int gear)
: this.cadence = cadence,
this.speed = speed,
this.gear = gear;
کد را فرمت کنید
در هر زمان که بخواهید با کلیک بر روی Format در بالای رابط کاربری DartPad، کد Dart را دوباره فرمت کنید. فرمت مجدد به ویژه زمانی مفید است که کد را در DartPad قرار می دهید و توجیه خاموش است.
روی Format کلیک کنید.
نمونهسازی و چاپ یک نمونه دوچرخه
کد زیر را به تابع
main()
اضافه کنید:
void main() {
var bike = new Bicycle(2, 0, 1);
print(bike);
}
کلمه کلیدی
new
اختیاری را حذف کنید:
var bike = Bicycle(2, 0, 1);
مشاهده
- کلمه کلیدی
new
در Dart 2 اختیاری شد. - اگر می دانید که مقدار متغیر تغییر نمی کند، می توانید از
final
به جایvar
استفاده کنید. - تابع
print()
هر شی (نه فقط رشته ها) را می پذیرد. با استفاده ازtoString()
شی، آن را به یکString
تبدیل می کند.
مثال را اجرا کنید
مثال را با کلیک روی Run در بالای پنجره DartPad اجرا کنید. اگر Run فعال نیست، بخش مشکلات را بعداً در این صفحه ببینید.
شما باید خروجی زیر را ببینید:
Instance of 'Bicycle'
مشاهده
- هیچ خطا یا اخطاری نباید ظاهر شود، که نشان می دهد استنتاج نوع کار می کند، و تحلیلگر استنباط می کند که عبارتی که با
var bike =
شروع می شود، یک نمونه Bicycle را تعریف می کند.
خروجی را بهبود بخشید
اگرچه خروجی "نمونه "دوچرخه" درست است، اما چندان آموزنده نیست. همه کلاسهای دارت دارای یک toString()
هستند که میتوانید برای ارائه خروجی مفیدتر آن را لغو کنید.
toString()
زیر را در هر جایی از کلاس Bicycle
اضافه کنید:
@override
String toString() => 'Bicycle: $speed mph';
مشاهدات
- حاشیه نویسی
@override
به تحلیلگر می گوید که شما عمداً یک عضو را لغو می کنید. اگر نتوانید به درستی نادیده گرفتن را انجام دهید، آنالیزور با خطا مواجه می شود. - Dart هنگام تعیین رشته ها از نقل قول های تک یا دوتایی پشتیبانی می کند.
- از درون یابی رشته ای برای قرار دادن مقدار یک عبارت در یک رشته واقعی استفاده کنید:
${expression}
. اگر عبارت یک شناسه است، میتوانید از پرانتزها بگذرید:$variableName
. - توابع یا روش های یک خطی را با استفاده از علامت پیکان چربی (
=>
) کوتاه کنید.
مثال را اجرا کنید
روی Run کلیک کنید.
شما باید خروجی زیر را ببینید:
Bicycle: 0 mph
چالش ها و مسائل؟ کد خود را بررسی کنید .
یک متغیر فقط خواندنی اضافه کنید
مثال اصلی جاوا speed
را به عنوان یک متغیر فقط خواندنی تعریف می کند - آن را به عنوان خصوصی اعلام می کند و فقط یک گیرنده ارائه می دهد. در مرحله بعد، همان عملکرد را در Dart ارائه خواهید کرد.
bicycle.dart را در
bicycle.dart
باز کنید (یا به استفاده از کپی خود ادامه دهید).
برای علامت گذاری یک شناسه دارت به عنوان خصوصی در کتابخانه آن، نام آن را با زیرخط ( _
) شروع کنید. میتوانید با تغییر نام و اضافه کردن یک گیرنده، speed
را به فقط خواندنی تبدیل کنید.
سرعت را به یک متغیر نمونه خصوصی و فقط خواندنی تبدیل کنید
در سازنده
Bicycle
، پارامتر speed
را حذف کنید:
Bicycle(this.cadence, this.gear);
در
main()
) پارامتر دوم ( speed
) را از فراخوانی سازنده Bicycle
حذف کنید:
var bike = Bicycle(2, 1);
موارد باقیمانده از
speed
را به _speed
. (دو مکان)
Initialize
_speed
به 0:
int _speed = 0;
گیرنده زیر را به کلاس
Bicycle
اضافه کنید:
int get speed => _speed;
مشاهدات
- هر متغیر (حتی اگر یک عدد باشد) یا باید مقداردهی اولیه شود یا با اضافه کردن
?
به اعلان نوع آن - کامپایلر دارت حریم خصوصی کتابخانه را برای هر شناسهای که پیشوند آن زیرخط باشد، اعمال میکند. حریم خصوصی کتابخانه به طور کلی به این معنی است که شناسه فقط در داخل فایل (نه فقط کلاس) که شناسه در آن تعریف شده است قابل مشاهده است.
- به طور پیش فرض، دارت گیرنده ها و تنظیم کننده های ضمنی را برای همه متغیرهای نمونه عمومی فراهم می کند. شما نیازی به تعریف گیرنده یا تنظیم کننده خود ندارید، مگر اینکه بخواهید متغیرهای فقط خواندنی یا فقط نوشتنی را اعمال کنید، یک مقدار را محاسبه یا تأیید کنید، یا یک مقدار را در جای دیگری به روز کنید.
- نمونه اصلی جاوا گیرنده ها و تنظیم کننده ها را برای
cadence
وgear
ارائه می کرد. نمونه دارت به گیرندهها و تنظیمکنندههای واضح برای آنها نیاز ندارد، بنابراین فقط از متغیرهای نمونه استفاده میکند. - میتوانید با یک فیلد ساده مانند
bike.cadence
و بعداً آن را برای استفاده از گیرندهها و تنظیمکنندهها تغییر دهید. API ثابت می ماند. به عبارت دیگر، رفتن از یک میدان به یک گیرنده و تنظیم کننده یک تغییر شکستن در دارت نیست.
اجرای سرعت را به عنوان یک متغیر نمونه فقط خواندنی به پایان برسانید
متدهای زیر را به کلاس
Bicycle
اضافه کنید:
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
نمونه نهایی Dart شبیه جاوا اصلی به نظر می رسد، اما در 23 خط به جای 40 فشرده تر است:
class Bicycle {
int cadence;
int _speed = 0;
int get speed => _speed;
int gear;
Bicycle(this.cadence, this.gear);
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
@override
String toString() => 'Bicycle: $_speed mph';
}
void main() {
var bike = Bicycle(2, 1);
print(bike);
}
چالش ها و مسائل؟ کد خود را بررسی کنید .
3. از پارامترهای اختیاری استفاده کنید (به جای اضافه بار)
تمرین بعدی یک کلاس Rectangle
را تعریف می کند، مثال دیگری از آموزش جاوا.
کد جاوا بارگذاری بیش از حد سازنده ها را نشان می دهد، یک روش رایج در جاوا که در آن سازنده ها نام یکسانی دارند، اما در تعداد یا نوع پارامترها متفاوت هستند. همانطور که در این بخش خواهید دید، دارت از سازنده های اضافه بار پشتیبانی نمی کند و به طور متفاوتی با این وضعیت برخورد می کند.
مثال Rectangle را در DartPad باز کنید.
یک سازنده مستطیل اضافه کنید
یک سازنده خالی و منفرد اضافه کنید که جایگزین هر چهار سازنده در مثال جاوا شود:
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
این سازنده از پارامترهای اختیاری با نام استفاده می کند .
مشاهدات
-
this.origin
،this.width
، وthis.height
از ترفند کوتاه نویسی برای تخصیص متغیرهای نمونه در داخل اعلان سازنده استفاده می کنند. -
this.origin
،this.width
، وthis.height
پارامترهای نامگذاری شده اختیاری هستند. پارامترهای نامگذاری شده در پرانتزهای فرفری ({}
) قرار می گیرند. -
this.origin = const Point(0, 0)
مقدار پیش فرضPoint(0,0)
را برای متغیر نمونهorigin
می کند. پیش فرض مشخص شده باید یک ثابت زمان کامپایل باشد. این سازنده مقادیر پیش فرض را برای هر سه متغیر نمونه ارائه می کند.
خروجی را بهبود بخشید
تابع
toString()
زیر را به کلاس Rectangle
اضافه کنید:
@override
String toString() =>
'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';
از سازنده استفاده کنید
main()
با کد زیر جایگزین کنید تا مطمئن شوید که می توانید Rectangle
را تنها با استفاده از پارامترهای مورد نیاز خود نمونه سازی کنید:
main() {
print(Rectangle(origin: const Point(10, 20), width: 100, height: 200));
print(Rectangle(origin: const Point(10, 10)));
print(Rectangle(width: 200));
print(Rectangle());
}
مشاهده
- سازنده Dart برای
Rectangle
یک خط کد است، در مقایسه با 16 خط کد برای سازنده های معادل در نسخه جاوا.
مثال را اجرا کنید
شما باید خروجی زیر را ببینید:
Origin: (10, 20), width: 100, height: 200
Origin: (10, 10), width: 0, height: 0
Origin: (0, 0), width: 200, height: 0
Origin: (0, 0), width: 0, height: 0
چالش ها و مسائل؟ کد خود را بررسی کنید .
4. یک کارخانه ایجاد کنید
Factories، یک الگوی طراحی متداول در جاوا، دارای چندین مزیت نسبت به نمونه سازی مستقیم شیء است، مانند پنهان کردن جزئیات نمونه سازی، ارائه توانایی برگرداندن یک نوع فرعی از نوع بازگشتی کارخانه و بازگرداندن اختیاری یک شی موجود به جای یک شی جدید. .
این مرحله دو راه را برای اجرای یک کارخانه ایجاد شکل نشان می دهد:
- گزینه 1: یک تابع سطح بالا ایجاد کنید.
- گزینه 2: یک سازنده کارخانه ایجاد کنید.
برای این تمرین، از مثال Shapes استفاده خواهید کرد که شکل ها را نمونه می کند و ناحیه محاسبه شده آنها را چاپ می کند:
import 'dart:math';
abstract class Shape {
num get area;
}
class Circle implements Shape {
final num radius;
Circle(this.radius);
num get area => pi * pow(radius, 2);
}
class Square implements Shape {
final num side;
Square(this.side);
num get area => pow(side, 2);
}
main() {
final circle = Circle(2);
final square = Square(2);
print(circle.area);
print(square.area);
}
مثال Shapes را در DartPad باز کنید.
در قسمت کنسول، باید ناحیه های محاسبه شده یک دایره و یک مربع را ببینید:
12.566370614359172
4
مشاهدات
- دارت از کلاس های انتزاعی پشتیبانی می کند.
- شما می توانید چندین کلاس را در یک فایل تعریف کنید.
-
dart:math
یکی از کتابخانه های اصلی دارت است. دیگر کتابخانههای اصلی عبارتند ازdart:core
،dart:async
،dart:convert
وdart:collection
. - طبق قرارداد، ثابتهای کتابخانه دارت
lowerCamelCase
هستند (برای مثال،pi
به جایPI)
. اگر در مورد استدلال کنجکاو هستید، به دستورالعمل سبک PREFER با استفاده از LowCamelCase برای نام های ثابت مراجعه کنید. - کد زیر دو گیرنده را نشان می دهد که یک مقدار را محاسبه می کنند:
num get area => pi * pow(radius, 2); // Circle num get area => pow(side, 2); // Square
گزینه 1: یک تابع سطح بالا ایجاد کنید
با افزودن تابع زیر در بالاترین سطح (خارج از هر کلاس) یک کارخانه را به عنوان یک تابع سطح بالا پیاده کنید:
Shape shapeFactory(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
با جایگزین کردن دو خط اول در متد
main()
تابع کارخانه را فراخوانی کنید:
final circle = shapeFactory('circle');
final square = shapeFactory('square');
مثال را اجرا کنید
خروجی باید مانند قبل باشد.
مشاهدات
- اگر تابع با هر رشته ای غیر از
'circle'
یا'square'
فراخوانی شود، یک استثنا ایجاد می کند. - Dart SDK کلاسهایی را برای بسیاری از استثناهای رایج تعریف میکند، یا میتوانید کلاس
Exception
را برای ایجاد استثناهای خاصتر پیادهسازی کنید یا (مانند این مثال) میتوانید رشتهای را پرتاب کنید که مشکل پیشآمده را توصیف میکند. - هنگامی که با یک استثنا مواجه می شوید، DartPad
Uncaught
را گزارش می کند. برای مشاهده اطلاعات مفیدتر، کد را در یک دستورtry-catch
بپیچید و استثنا را چاپ کنید. به عنوان یک تمرین اختیاری، این مثال DartPad را بررسی کنید. - برای استفاده از یک نقل قول منفرد در داخل یک رشته، یا با استفاده از اسلش از نقل قول جاسازی شده فرار کنید (
'Can\'t create $type.'
) یا رشته را با دو گیومه مشخص کنید ("Can't create $type."
).
چالش ها و مسائل؟ کد خود را بررسی کنید .
گزینه 2: یک سازنده کارخانه ایجاد کنید
از کلمه کلیدی factory
دارت برای ایجاد یک سازنده کارخانه استفاده کنید.
یک سازنده کارخانه به کلاس
Shape
انتزاعی اضافه کنید:
abstract class Shape {
factory Shape(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
num get area;
}
برای نمونه سازی اشکال، دو خط اول
main()
را با کد زیر جایگزین کنید:
final circle = Shape('circle');
final square = Shape('square');
تابع
shapeFactory()
را که قبلا اضافه کرده اید حذف کنید.
مشاهده
- کد موجود در سازنده کارخانه با کد استفاده شده در تابع
shapeFactory()
یکسان است.
چالش ها و مسائل؟ کد خود را بررسی کنید .
5. یک رابط پیاده سازی کنید
زبان دارت یک کلمه کلیدی interface
را شامل نمی شود زیرا هر کلاس یک رابط را تعریف می کند .
مثال Shapes را در DartPad باز کنید (یا به استفاده از کپی خود ادامه دهید).
یک کلاس
CircleMock
اضافه کنید که رابط Circle
را پیاده سازی می کند:
class CircleMock implements Circle {}
شما باید یک خطای "Missing konkret implements" را ببینید زیرا
CircleMock
اجرای Circle
را به ارث نمی برد - فقط از رابط آن استفاده می کند. این خطا را با تعریف متغیرهای نمونه area
و radius
برطرف کنید:
class CircleMock implements Circle {
num area = 0;
num radius = 0;
}
مشاهده
- حتی اگر کلاس
CircleMock
هیچ رفتاری را تعریف نمی کند، دارت معتبر است - تحلیلگر هیچ خطایی ایجاد نمی کند. - متغیر نمونه
area
CircleMock
گیرندهarea
Circle
را پیاده سازی می کند.
چالش ها و مسائل؟ کد خود را بررسی کنید .
6. از Dart برای برنامه نویسی کاربردی استفاده کنید
در برنامه نویسی تابعی می توانید کارهایی مانند موارد زیر را انجام دهید:
- پاس توابع به عنوان آرگومان.
- یک تابع به یک متغیر اختصاص دهید.
- تابعی را که چندین آرگومان را به دنبالهای از توابع میبرد که هر کدام یک آرگومان واحد را میگیرند (که به آن currying نیز میگویند) واسازی کنید.
- یک تابع بی نام ایجاد کنید که می تواند به عنوان یک مقدار ثابت استفاده شود (که عبارت lambda نیز نامیده می شود؛ عبارات لامبدا در نسخه JDK 8 به جاوا اضافه شدند).
دارت از تمام این ویژگی ها پشتیبانی می کند. در دارت، توابع زوج، اشیا هستند و یک نوع دارند، Function
. این بدان معنی است که توابع را می توان به متغیرها اختصاص داد یا به عنوان آرگومان به توابع دیگر ارسال کرد. همچنین میتوانید نمونهای از کلاس Dart را طوری فراخوانی کنید که گویی یک تابع است، مانند این مثال .
مثال زیر از کد امری (نه به سبک عملکردی) استفاده می کند:
String scream(int length) => "A${'a' * length}h!";
main() {
final values = [1, 2, 3, 5, 10, 50];
for (var length in values) {
print(scream(length));
}
}
مثال Scream را در DartPad باز کنید.
خروجی باید به شکل زیر باشد:
Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!
مشاهده
- هنگام استفاده از درون یابی رشته ای، رشته
${'a' * length}
به "کاراکتر'a'
بارهایlength
تکرار شده ارزیابی می شود.
کد دستوری را به تابعی تبدیل کنید
حلقه اجباری
for() {...}
را در main()
حذف کنید و آن را با یک خط کد که از زنجیره متد استفاده می کند جایگزین کنید:
values.map(scream).forEach(print);
مثال را اجرا کنید
رویکرد کاربردی همان شش فریاد را به عنوان مثال ضروری چاپ می کند.
چالش ها و مسائل؟ کد خود را بررسی کنید .
از ویژگی های تکرارپذیر بیشتری استفاده کنید
کلاس های اصلی List
و Iterable
از fold()
، where()
، join()
، skip()
و موارد دیگر پشتیبانی می کنند. دارت همچنین دارای پشتیبانی داخلی برای نقشه ها و مجموعه ها است.
خط
values.map()
را در main()
با زیر جایگزین کنید:
values.skip(1).take(3).map(scream).forEach(print);
مثال را اجرا کنید
خروجی باید به شکل زیر باشد:
Aaah!
Aaaah!
Aaaaaah!
مشاهدات
-
skip(1)
از اولین مقدار، 1، در لیستvalues
به معنای واقعی کلمه عبور می کند. -
take(3)
3 مقدار بعدی 2، 3 و 5 را در لیستvalues
تحت اللفظی دریافت می کند. - مقادیر باقیمانده نادیده گرفته می شوند.
چالش ها و مسائل؟ کد خود را بررسی کنید .
7. تبریک می گویم!
با تکمیل این کد لبه، شما با برخی از تفاوت های جاوا و دارت آشنا شدید. یادگیری دارت آسان است و علاوه بر این، کتابخانه های اصلی و مجموعه غنی از بسته های موجود بهره وری شما را افزایش می دهد. دارت به خوبی برای برنامه های بزرگ مقیاس می شود. صدها مهندس گوگل از دارت برای نوشتن برنامه های مهم ماموریتی استفاده می کنند که بیشتر درآمد گوگل را به ارمغان می آورد.
مراحل بعدی
یک کد 20 دقیقه ای برای نشان دادن تمام تفاوت های جاوا و دارت کافی نیست. برای مثال، این کد لبه موارد زیر را پوشش نداده است:
- async/wait، که به شما امکان می دهد کد ناهمزمان را طوری بنویسید که گویی همزمان است. این مثال DartPad را بررسی کنید، که محاسبه پنج اعشار اول π را متحرک می کند.
- روش آبشار، که در آن همه چیز یک سازنده است !
- اپراتورهای تهی آگاه
اگر میخواهید فنآوریهای Dart را در عمل ببینید، کدهای Flutter را امتحان کنید.
بیشتر بدانید
با مقالات، منابع و وب سایت های زیر می توانید اطلاعات بیشتری در مورد دارت بیاموزید.
مقالات
- چرا فلاتر از دارت استفاده می کند؟
- اعلام دارت 2: بهینه شده برای توسعه سمت مشتری
- چرا از جاوا به دارت نقل مکان کردم
منابع
وب سایت ها