Dart হল Google-এর একটি প্রোগ্রামিং ভাষা, যা বিশেষভাবে ক্রস-প্ল্যাটফর্ম Flutter ফ্রেমওয়ার্কের জন্য তৈরি। এটি দ্রুত হট রিলোডের জন্য JIT কম্পাইলেশন এবং রিলিজ বিল্ডে নেটিভ পারফরম্যান্সের জন্য AOT কম্পাইলেশনকে একত্রিত করে। Dart শুধু মোবাইল ডেভেলপমেন্টেই নয়, ওয়েব অ্যাপ্লিকেশন (AngularDart) এবং সার্ভার-সাইড সমাধানের জন্যও ব্যবহৃত হয়। ভাষার সম্ভাবনা সম্পর্কে আরও জানতে অফিসিয়াল Dart ডকুমেন্টেশন দেখুন।
মূল বিষয়
Dart হল C-সদৃশ সিনট্যাক্স সহ একটি প্রোগ্রামিং ভাষা, যা Google লার্স বাকের (Eclipse-এর নির্মাতা) নেতৃত্বে তৈরি করেছে। প্রথম রিলিজ 2011 সালে হয়েছিল, কিন্তু Dart প্রকৃত জনপ্রিয়তা পায় 2018 সালে Flutter 1.0 রিলিজের মাধ্যমে। ভাষাটি ইউজার ইন্টারফেস তৈরির জন্য ডিজাইন করা হয়েছে: এতে স্ট্রিম, ফিউচার এবং রিঅ্যাক্টিভ প্যাটার্নের জন্য বিল্ট-ইন সাপোর্ট রয়েছে।
Dart-এর দর্শন হল «কর্মক্ষমতা এবং উৎপাদনশীলতার ভারসাম্য»। ভাষা দুটি কম্পাইলেশন কৌশল সমর্থন করে: হট রিলোড সহ ডেভেলপমেন্টের জন্য JIT (Just-In-Time) এবং নেটিভ পারফরম্যান্স সহ রিলিজ বিল্ডের জন্য AOT (Ahead-Of-Time)। JIT কম্পাইলার মিলিসেকেন্ডের মধ্যে চলমান অ্যাপ্লিকেশনে পরিবর্তিত কোড ইনজেক্ট করে, APK পুনঃকম্পাইলেশনের প্রয়োজন ছাড়াই — মোবাইল ডেভেলপমেন্টে অন্যান্য ভাষার তুলনায় এটি Dart-এর মূল সুবিধা।
Dart-এর একটি মূল বৈশিষ্ট্য হল sound null safety, যা Dart 2.12 (2021)-এ প্রবর্তিত হয়েছে। টাইপ সিস্টেম নিশ্চিত করে যে একটি ভেরিয়েবল স্পষ্ট ঘোষণা (int?) ছাড়া null হতে পারে না। এটি কম্পাইল সময়ে NullPointerException দূর করে। Google-এর মতে, null safety গ্রহণ প্রোডাকশন পরিবেশে Flutter অ্যাপ্লিকেশনে ক্র্যাশের হার 30% কমিয়েছে।
Dart ইকোসিস্টেম-এ তিনটি প্রধান ক্ষেত্র অন্তর্ভুক্ত: Flutter (মোবাইল এবং ডেস্কটপ অ্যাপ্লিকেশন), AngularDart (ওয়েব অ্যাপ্লিকেশন) এবং Dart Server (সার্ভার-সাইড সমাধান)। Flutter প্রভাবশালী প্ল্যাটফর্ম: Statista (2025) অনুযায়ী, 46% ক্রস-প্ল্যাটফর্ম মোবাইল প্রকল্পে Flutter ব্যবহৃত হয়, যা React Native (38%) এবং Xamarin (8%)-এর চেয়ে এগিয়ে।
Dart সিনট্যাক্স Java এবং JavaScript-এর মতো কিন্তু এর নিজস্ব অনন্য কাঠামো রয়েছে। Dart-এ সবকিছুই একটি অবজেক্ট — এমনকি int, double এবং bool Object থেকে ইনহেরিট করে। টাইপিং ঐচ্ছিক: var হিসেবে ঘোষিত ভেরিয়েবল স্বয়ংক্রিয়ভাবে টাইপ অনুমান করে, কিন্তু পড়ার সুবিধা এবং কর্মক্ষমতার জন্য স্পষ্টভাবে টাইপ নির্দিষ্ট করার পরামর্শ দেওয়া হয়।
Dart int, double, String, bool, List, Set, Map, Record, Symbol এবং Runes সমর্থন করে। Nullable টাইপ — ? প্রত্যয় সহ যেকোনো টাইপ (int?, String?)। ?? অপারেটর (null-aware) বাম পাশে null হলে ডান পাশের মান ফেরত দেয়। ক্যাসকেড নোটেশন (..) একই অবজেক্টে রেফারেন্স পুনরাবৃত্তি না করে একাধিক মেথড কল করার অনুমতি দেয়।
// Dart-এ মৌলিক টাইপ এবং ঘোষণা
void main() {
// স্পষ্ট টাইপিং
int age = 25;
double price = 19.99;
String name = 'Dart';
bool isValid = true;
// Null safety — ভেরিয়েবল null হতে পারে
int? nullableAge = null;
int result = nullableAge ?? 0; // null-aware অপারেটর
// জেনেরিক সহ সংগ্রহ
List<String> items = ['Dart', 'Flutter', 'Mobile'];
Map<String, dynamic> config = {
'version': '3.0',
'mode': 'debug',
};
// ক্যাসকেড নোটেশন
final list = <String>[]
..add('one')
..add('two')
..sort();
}
// Record — বেনামী অপরিবর্তনীয় টাইপ
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'dynamic টাইপ টাইপ চেকিং নিষ্ক্রিয় করে — এটি শুধুমাত্র JSON বা ডায়নামিক ডেটার সাথে কাজ করার সময় ব্যবহার করুন। Record হল Dart 3.0-এ একটি নতুন টাইপ যা আলাদা ক্লাস তৈরি না করে মানগুলিকে গ্রুপ করার অনুমতি দেয়। Null-aware অপারেটর ?? দীর্ঘ if-else চেক প্রতিস্থাপন করে nullable মানগুলির সাথে কাজ করার আদর্শ উপায়।
Dart-এ ক্লাস — একক ইনহেরিটেন্স (extends), মিক্সিন (mixin) এর মাধ্যমে একাধিক। Dart ইন্টারফেসকে আলাদা ধারণা হিসেবে সমর্থন করে না — যেকোনো ক্লাস implement করা যেতে পারে (implements)। মিক্সিন হল একটি কনস্ট্রাক্টর ছাড়া ক্লাস যার মেথড এবং ফিল্ড with কীওয়ার্ড ব্যবহার করে যেকোনো ক্লাসে যোগ করা যেতে পারে।
// Dart-এ ক্লাস, ইনহেরিটেন্স এবং মিক্সিন
abstract class Animal {
void sound(); // অ্যাবস্ট্রাক্ট মেথড
}
mixin Swimmer {
void swim() => print('Swimming...');
}
mixin Flyer {
void fly() => print('Flying...');
}
class Duck extends Animal with Swimmer, Flyer {
@override
void sound() => print('Quack!');
}
void main() {
final duck = Duck();
duck.sound(); // Quack!
duck.swim(); // Swimming...
duck.fly(); // Flying...
}
// নামকৃত কনস্ট্রাক্টর
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}Duck ক্লাস Animal থেকে ইনহেরিট করে এবং দুটি মিক্সিন — Swimmer এবং Flyer ব্যবহার করে। এটি ডায়মন্ড সমস্যা ছাড়াই একাধিক ইনহেরিটেন্স প্রদর্শন করে: মিক্সিন রৈখিকভাবে সমাধান করা হয় (super chain)। নামকৃত কনস্ট্রাক্টর (Config.development) পূর্বনির্ধারিত প্যারামিটার সহ অবজেক্ট তৈরির জন্য স্ট্যাটিক ফ্যাক্টরি মেথডের বিকল্প।
Dart-এ অ্যাসিঙ্ক্রোনাস Future (একক মান), Stream (মানের ক্রম) এবং async/await-এর মাধ্যমে বাস্তবায়িত হয়। Dart JavaScript-এর মতো ইভেন্ট লুপ সহ একটি একক-থ্রেডেড মডেল ব্যবহার করে, কিন্তু একটি গুরুত্বপূর্ণ পার্থক্যের সাথে: দীর্ঘ গণনা UI ব্লক করে না কারণ Dart কোড Isolate-এ চলে — শেয়ার্ড মেমোরি ছাড়া একটি আলাদা থ্রেড।
Future একটি অ্যাসিঙ্ক্রোনাস অপারেশন উপস্থাপন করে যা কিছু সময় পরে সম্পূর্ণ হবে। Future অপেক্ষমাণ, মান সহ সম্পূর্ণ বা ত্রুটি সহ সম্পূর্ণ অবস্থায় থাকতে পারে। .then().catchError() চেইন async/await-এর বিকল্প, কিন্তু পড়ার সুবিধার জন্য await ব্যবহার করার পরামর্শ দেওয়া হয়।
// Future এবং Stream-এর সাথে অ্যাসিঙ্ক্রোনাস ডেটা লোডিং
import 'dart:convert';
import 'package:http/http.dart' as http;
class ApiService {
final String baseUrl;
ApiService(this.baseUrl);
// একক অনুরোধের জন্য Future
Future<Map<String, dynamic>> fetchUser(int id) async {
final response = await http.get(
Uri.parse('$baseUrl/users/$id'),
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to load user: ${response.statusCode}');
}
}
// ডেটার ক্রমের জন্য Stream
Stream<int> countStream(int max) async* {
for (var i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
void main() async {
final api = ApiService('https://api.example.com');
// await ব্যবহার
final user = await api.fetchUser(1);
print('User: ${user['name']}');
// await for-এর সাথে Stream প্রক্রিয়াকরণ
await for (final count in api.countStream(5)) {
print('Count: $count');
}
}ApiService ক্লাস দুই ধরনের অ্যাসিঙ্ক্রোনাস প্রদর্শন করে: HTTP অনুরোধের জন্য Future (একক প্রতিক্রিয়া) এবং অনুক্রমিক কাউন্টারের জন্য Stream (async* এবং yield সহ জেনারেটর)। Stream সেন্সর, জিওলোকেশন, Firebase Realtime Database-এর সাথে কাজ করার জন্য কার্যকর — যেখানেই ডেটা ক্রমাগত আসে। Isolate আলাদা মেমোরি ব্যবহার করে — ডেটা SendPort/ReceivePort-এর মাধ্যমে প্রেরিত হয়।
Dart এবং Flutter একটি একক স্ট্যাক গঠন করে: Flutter হল UI ফ্রেমওয়ার্ক, Dart হল UI বর্ণনার ভাষা। Flutter-এ, সবকিছুই একটি উইজেট (Widget) — একটি বাটন থেকে পুরো অ্যাপ্লিকেশন পর্যন্ত। উইজেট stateful (পরিবর্তনযোগ্য অবস্থা সহ) এবং stateless (অপরিবর্তনীয়) হতে পারে। Dart ডিক্লারেটিভ UI বর্ণনা করে: build() একটি উইজেট ট্রি ফেরত দেয় যা Flutter Skia (বা iOS-এ Impeller) ব্যবহার করে রেন্ডার করে।
Dart-এ Flutter অ্যাপ্লিকেশন main() → runApp(MyApp()) → MaterialApp নিয়ে গঠিত। MaterialApp-এ রাউটিং (routes), থিম (theme) এবং লোকালাইজেশন অন্তর্ভুক্ত। প্রতিটি স্ক্রিন একটি Scaffold যাতে AppBar, Body (সাধারণত Column/ListView) এবং BottomNavigationBar থাকে। Navigator.push/pop বা নামকৃত রুটের মাধ্যমে নেভিগেশন।
// Dart-এ সহজ Flutter অ্যাপ্লিকেশন
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dart + Flutter')),
body: Center(
child: Text('Counter: $_counter'),
),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: Icon(Icons.add),
),
);
}
}HomeScreen উইজেটটি অভ্যন্তরীণ অবস্থা _counter সহ একটি StatefulWidget। setState() কল করা Flutter-কে UI পুনর্নির্মাণের জন্য জানায় — Dart কোড build() পুনরায় চালায়, একটি নতুন উইজেট ট্রি তৈরি করে। Flutter দক্ষতার সাথে পুরানো এবং নতুন ট্রির তুলনা (diff) করে, শুধুমাত্র পর্দার পরিবর্তিত অংশগুলি আপডেট করে। Hot Reload _counter অবস্থা রিসেট না করেই build() প্রতিস্থাপন করে।
Dart কম্পাইলেশন হাইব্রিড: ডেভেলপমেন্টের জন্য JIT এবং প্রোডাকশনের জন্য AOT। ডিবাগ মোডে, Dart VM একটি JIT কম্পাইলার চালায় যা কোডের হট-সোয়াপ ক্ষমতা সহ বাইটকোড ব্যাখ্যা করে। রিলিজ মোডে, dart compile exe বা flutter build একটি নির্দিষ্ট আর্কিটেকচারের (arm64, x86_64, armv7) জন্য একটি নেটিভ AOT বাইনারি তৈরি করে।
| মোড | কম্পাইলেশন | নিষ্পাদনের গতি | বাইনারি আকার | হট রিলোড |
|---|---|---|---|---|
| Debug | JIT (VM) | মাঝারি | ~50 MB | হ্যাঁ |
| Release | AOT (নেটিভ) | সর্বোচ্চ | ~15-20 MB | না |
| Web | dart2js | ব্রাউজারের উপর নির্ভর করে | পরিবর্তনশীল | ডেভ সার্ভার |
ডিবাগ মোডে Dart JIT কম্পাইলেশন ~1 সেকেন্ডে হট রিলোড প্রদান করে — ডেভেলপাররা অ্যাপ্লিকেশন অবস্থা না হারিয়ে UI পরিবর্তন দেখতে পান। AOT কম্পাইলেশন নেটিভ Swift/Kotlin অ্যাপ্লিকেশনের কাছাকাছি কর্মক্ষমতা দেয়। Google-এর মতে, Dart AOT-তে Flutter মধ্যম-রেঞ্জের ডিভাইসেও 60 FPS অ্যানিমেশন অর্জন করে।
Dart ডেভেলপার টুলস-এর মধ্যে রয়েছে Dart SDK (dart কম্পাইলার, dartanalyzer, dartfmt, pub), Flutter SDK এবং IDE প্লাগইন। Dart SDK Flutter SDK-এর সাথে flutter/bin/cache/dart-sdk ফোল্ডারে ইনস্টল হয়। Pub হল প্যাকেজ ম্যানেজার যা pubspec.yaml পড়ে এবং pub.dev থেকে ডিপেন্ডেন্সি ডাউনলোড করে।
dart analyze — স্ট্যাটিক বিশ্লেষক যা টাইপ, অব্যবহৃত ইম্পোর্ট এবং সম্ভাব্য ত্রুটি পরীক্ষা করে। dart format — ফর্ম্যাটার যা স্বয়ংক্রিয়ভাবে কোডকে একটি সামঞ্জস্যপূর্ণ শৈলীতে ফর্ম্যাট করে। dart doc — /// মন্তব্য থেকে ডকুমেন্টেশন জেনারেটর। Flutter DevTools — উইজেট ট্রি ইন্সপেক্টর, লগ, মেমোরি এবং নেটওয়ার্ক সহ প্রোফাইলার। Dart VM Service — WebSocket-এর মাধ্যমে চলমান অ্যাপ্লিকেশন ডিবাগ করা।
# pubspec.yaml — Dart প্রকল্প কনফিগারেশন
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
http: ^1.2.0
provider: ^6.1.0
shared_preferences: ^2.2.0
json_annotation: ^4.8.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.0
json_serializable: ^6.7.0
flutter_lints: ^3.0.0pubspec.yaml ফাইল Dart প্রকল্পের ডিপেন্ডেন্সি বর্ণনা করে। environment:sdk ফিল্ড Dart সংস্করণ নির্দিষ্ট করে — বর্তমান স্থিতিশীল 3.x। Dependencies হল প্রধান লাইব্রেরি, dev_dependencies টেস্টিং এবং কোড জেনারেশনের জন্য। json_annotation + json_serializable build_runner-এর মাধ্যমে JSON সিরিয়ালাইজেশন কোড জেনারেট করে। flutter_lints বিশ্লেষকের জন্য নিয়মের একটি সেট।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Dart হল Google-এর (2011) একটি প্রোগ্রামিং ভাষা, যা Flutter-এর সাথে ক্রস-প্ল্যাটফর্ম ডেভেলপমেন্টের জন্য ডিজাইন করা হয়েছে। C-সদৃশ সিনট্যাক্স, শক্তিশালী টাইপিং, JIT এবং AOT কম্পাইলেশন সমর্থন করে। sound null safety (Dart 2.12 থেকে) এবং Future ও Stream-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস দ্বারা বৈশিষ্ট্যযুক্ত। মোবাইল, ওয়েব এবং ডেস্কটপ অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়।
Dart নেটিভ কোড (AOT) বা JS (dart2js)-এ কম্পাইল হয়, JavaScript ব্যাখ্যা করা হয়। Dart-এ sound null safety সহ শক্তিশালী টাইপিং, বিল্ট-ইন ক্লাস এবং মিক্সিন রয়েছে। Dart-এর অ্যাসিঙ্ক্রোনাস Isolate (শেয়ার্ড মেমোরি ছাড়া আলাদা থ্রেড) ভিত্তিক, JS — Web Workers সহ ইভেন্ট লুপ ভিত্তিক। মোবাইল দৃশ্যে Dart AOT কর্মক্ষমতা V8 JIT-এর থেকে 30-50% বেশি।
Dart Dart Native-এর মাধ্যমে AOT-তে নেটিভ ARM কোডে কম্পাইল হয়। ডিবাগ মোডে, Dart VM হট রিলোড সহ JIT ব্যবহার করে। Flutter Engine (C++) Skia/Impeller-এর মাধ্যমে UI রেন্ডার করে। Android-এর জন্য — flutter build apk, iOS-এর জন্য — flutter build ios। ওয়েব বিল্ড dart2js বা dart2wasm ব্যবহার করে। রিলিজ APK-এর আকার 15-20 MB (AAB বিভাজন ছাড়া)।
Dart প্রিমিটিভ সমর্থন করে: int, double, String, bool। সংগ্রহ: List, Set, Map, Record। বিশেষ: Symbol, Runes, Null। সবকিছুই একটি অবজেক্ট, প্রিমিটিভ সহ। Null safety: int? null অনুমতি দেয়, int কখনো null নয়। ??, ??= অপারেটর নিরাপদ null হ্যান্ডলিং-এর জন্য। জেনেরিক: List<String>, Map<String, dynamic>।
Flutter SDK-তে Dart SDK, Flutter Engine এবং উইজেট লাইব্রেরি অন্তর্ভুক্ত। IDE — Flutter প্লাগইন সহ Android Studio বা VS Code। DevTools — উইজেট ইন্সপেক্টর সহ প্রোফাইলার। Pub.dev — 45,000+ লাইব্রেরি সহ প্যাকেজ ম্যানেজার। dart analyze এবং dart format টুল কোডের গুণমান নিশ্চিত করে। JSON মডেলের কোড জেনারেশনের জন্য Build_runner।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।