Flutter এ Asynchronous প্রোগ্রামিং: async/await এর জাদু!

মোবাইল অ্যাপ ডেভেলপমেন্টে অনেক সময়ই আমাদের অ্যাসিনক্রোনাস টাস্ক (Asynchronous Tasks) হ্যান্ডেল করতে হয়। যেমন: নেটওয়ার্ক রিকুয়েস্ট, ডাটাবেস রিড/রাইট, বা ফাইল ডাউনলোড। এই টাস্কগুলো সাধারণত সময়সাপেক্ষ, এবং এগুলোকে ব্লকিং না করে ব্যাকগ্রাউন্ডে প্রসেস করাটাই লক্ষ্য। Flutter/Dart-এ এই কাজটি সহজ করতে async এবং await কিওয়ার্ড ব্যবহার করা হয়। চলুন বিস্তারিত শিখি!

Asynchronous প্রোগ্রামিং কেন প্রয়োজন?

ধরুন, আপনি রান্না করছেন। আপনি চাল সেদ্ধ করার পাশাপাশি সবজি কাটতে পারেন। এখানে চাল সেদ্ধ হওয়ার জন্য অপেক্ষা করার সময় অন্য কাজ করা যায়। ঠিক তেমনই অ্যাপে যখন কোনো টাস্ক (যেমন: API থেকে ডাটা ফেচ) চলতে থাকে, তখন UI কে ফ্রিজ না করে বাকি কাজ চালিয়ে যাওয়াই Asynchronous প্রোগ্রামিং এর উদ্দেশ্য।

async/await কি?

  • async: একটি ফাংশনকে অ্যাসিনক্রোনাস ডিফাইন করে। এই ফাংশনটি একটি Future ভ্যালু রিটার্ন করে।
  • awaitasync ফাংশনের ভিতরে ব্যবহৃত হয়। এটি ফাংশনের এক্সিকিউশন থামিয়ে রাখে যতক্ষণ না 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 এর সুবিধা

  1. কোডের রিডাবিলিটি.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');
}
  1. UI ব্লকিং এড়ানো: অ্যাসিনক্রোনাস টাস্ক ব্যাকগ্রাউন্ডে চলায় UI রেস্পন্সিভ থাকে।

async/await ব্যবহারের নিয়ম

  1. async ফাংশন সবসময় Future রিটার্ন করে।
  2. await শুধুমাত্র async ফাংশনের ভিতরে ব্যবহার করা যায়।
  3. একাধিক Future একসাথে রান করতে Future.wait() ব্যবহার করুন:
var results = await Future.wait([fetchData1(), fetchData2()]);

সতর্কতা!

  • লং-রানিং টাস্ক: মেইন থ্রেডে ভারী কাজ (যেমন: ইমেজ প্রসেসিং) করবেন না। এর জন্য Isolate ব্যবহার করুন।
  • মেমরি লিকawait চলাকালীন উইজেট ডিসপোজ হলে mounted প্রোপার্টি চেক করুন।
if (mounted) {
  setState(() {});
}

এই ব্লগটি আপনাকে সাহায্য করলে শেয়ার করতে ভুলবেন না! কোনো প্রশ্ন থাকলে কমেন্টে জানান। 😊

Spread the love

1 thought on “Flutter এ Asynchronous প্রোগ্রামিং: async/await এর জাদু!”

Leave a Comment