মোবাইল অ্যাপ ডেভেলপমেন্টে অনেক সময়ই আমাদের অ্যাসিনক্রোনাস টাস্ক (Asynchronous Tasks) হ্যান্ডেল করতে হয়। যেমন: নেটওয়ার্ক রিকুয়েস্ট, ডাটাবেস রিড/রাইট, বা ফাইল ডাউনলোড। এই টাস্কগুলো সাধারণত সময়সাপেক্ষ, এবং এগুলোকে ব্লকিং না করে ব্যাকগ্রাউন্ডে প্রসেস করাটাই লক্ষ্য। Flutter/Dart-এ এই কাজটি সহজ করতে async
এবং await
কিওয়ার্ড ব্যবহার করা হয়। চলুন বিস্তারিত শিখি!
Asynchronous প্রোগ্রামিং কেন প্রয়োজন?
ধরুন, আপনি রান্না করছেন। আপনি চাল সেদ্ধ করার পাশাপাশি সবজি কাটতে পারেন। এখানে চাল সেদ্ধ হওয়ার জন্য অপেক্ষা করার সময় অন্য কাজ করা যায়। ঠিক তেমনই অ্যাপে যখন কোনো টাস্ক (যেমন: API থেকে ডাটা ফেচ) চলতে থাকে, তখন UI কে ফ্রিজ না করে বাকি কাজ চালিয়ে যাওয়াই Asynchronous প্রোগ্রামিং এর উদ্দেশ্য।
async/await কি?
async
: একটি ফাংশনকে অ্যাসিনক্রোনাস ডিফাইন করে। এই ফাংশনটি একটিFuture
ভ্যালু রিটার্ন করে।await
:async
ফাংশনের ভিতরে ব্যবহৃত হয়। এটি ফাংশনের এক্সিকিউশন থামিয়ে রাখে যতক্ষণ নাFuture
কমপ্লিট হয় (সাকসেস বা এরর) এই ক্ষেত্রে।
উদাহরণ ১: সাধারণ async/await ব্যবহার
import 'dart:async';
void main() async { // main ফাংশন async
print('অ্যাপ শুরু...');
await fetchData(); // fetchData শেষ হওয়া পর্যন্ত অপেক্ষা
print('অ্যাপ শেষ!');
}
Future<void> fetchData() async {
await Future.delayed(Duration(seconds: 2)); // 2 সেকেন্ড ডিলে
print('ডাটা লোড হয়েছে!');
}
আউটপুট:
অ্যাপ শুরু...
ডাটা লোড হয়েছে! (2 সেকেন্ড পর)
অ্যাপ শেষ!
ব্যাখ্যা:
fetchData()
ফাংশনটিasync
ডিফাইন্ড, এবং এটি একটিFuture
ভ্যালু রিটার্ন করে।await
ব্যবহারের কারণেmain
ফাংশনfetchData()
শেষ হওয়া পর্যন্ত অপেক্ষা করে।
API কলের বাস্তব উদাহরণ (Flutter)
Flutter অ্যাপে API কল করার সময় async/await অপরিহার্য। নিচে একটি উদাহরণ:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
String _data = 'লোড হচ্ছে...';
Future<void> _fetchData() async {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
setState(() {
_data = response.body; // UI আপডেট
});
}
@override
void initState() {
super.initState();
_fetchData(); // অ্যাসিনক্রোনাস কল
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text(_data),
),
);
}
}
ব্যাখ্যা:
_fetchData()
ফাংশনটি API থেকে ডাটা ফেচ করে।await http.get()
দিয়ে রেস্পন্সের জন্য অপেক্ষা করা হচ্ছে।- ডাটা লোড হলে
setState()
দিয়ে UI আপডেট করা হয়েছে।
async/await এর সুবিধা
- কোডের রিডাবিলিটি:
.then()
চেইনের বদলে সহজে কোড লেখা যায়।
// Without async/await
fetchData().then((data) {
process(data).then((result) {
print(result);
});
});
// With async/await
var data = await fetchData();
var result = await process(data);
print(result);
এরর হ্যান্ডলিং: try-catch
ব্লক দিয়ে সহজে এরর ম্যানেজ করা যায়।
try {
var data = await fetchData();
} catch (e) {
print('এরর: $e');
}
- UI ব্লকিং এড়ানো: অ্যাসিনক্রোনাস টাস্ক ব্যাকগ্রাউন্ডে চলায় UI রেস্পন্সিভ থাকে।
async/await ব্যবহারের নিয়ম
async
ফাংশন সবসময়Future
রিটার্ন করে।await
শুধুমাত্রasync
ফাংশনের ভিতরে ব্যবহার করা যায়।- একাধিক
Future
একসাথে রান করতেFuture.wait()
ব্যবহার করুন:
var results = await Future.wait([fetchData1(), fetchData2()]);
সতর্কতা!
- লং-রানিং টাস্ক: মেইন থ্রেডে ভারী কাজ (যেমন: ইমেজ প্রসেসিং) করবেন না। এর জন্য
Isolate
ব্যবহার করুন। - মেমরি লিক:
await
চলাকালীন উইজেট ডিসপোজ হলেmounted
প্রোপার্টি চেক করুন।
if (mounted) {
setState(() {});
}
এই ব্লগটি আপনাকে সাহায্য করলে শেয়ার করতে ভুলবেন না! কোনো প্রশ্ন থাকলে কমেন্টে জানান। 😊
1 thought on “Flutter এ Asynchronous প্রোগ্রামিং: async/await এর জাদু!”