FutureBuilder — এটি কী, ফ্লাটারে Future নিয়ে কাজ করা

লেখক: IT Sectr প্রকাশিত: 2026-07-02 পড়ার সময়: 8 মিনিট

FutureBuilder হলো ফ্লাটারের একটি উইজেট যা প্রদত্ত Future থেকে প্রাপ্ত AsyncSnapshot-এর বর্তমান অবস্থার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে তার ইন্টারফেস পুনর্নির্মাণ করে। await-এর পর ম্যানুয়ালি setState কল করার বিপরীতে, FutureBuilder একটি ডিক্লারেটিভ পদ্ধতি প্রদান করে: এটি প্রথম রেন্ডারে Future-এ সাবস্ক্রাইব করে এবং প্রতিটি অবস্থা পরিবর্তনে — লোডিং, ত্রুটি বা প্রস্তুত ডেটা — builder ফাংশন কল করে। Flutter API Reference (2026) অনুসারে, FutureBuilder নেটওয়ার্ক থেকে ডেটা লোড করা, ডেটাবেস থেকে পড়া এবং যেকোনো অ্যাসিঙ্ক্রোনাস অপারেশনের জন্য বিশেষভাবে উপযোগী যেখানে UI-কে লোডিং ইন্ডিকেটর, ত্রুটি বার্তা বা প্রস্তুত কন্টেন্ট প্রদর্শন করতে হবে।

মূল পয়েন্ট

  • FutureBuilder — AsyncSnapshot (none, waiting, active, done) এর মাধ্যমে Future অবস্থার উপর ভিত্তি করে UI তৈরির জন্য ফ্লাটার উইজেট
  • AsyncSnapshot — একটি অবজেক্ট যা অ্যাসিঙ্ক্রোনাস অপারেশনের বর্তমান অবস্থা ধারণ করে: connectionState, data এবং error
  • builder — একটি কলব্যাক ফাংশন যা UI পুনর্নির্মাণের জন্য প্রতিটি Future অবস্থা পরিবর্তনে আহ্বান করা হয়
  • ত্রুটি ব্যবস্থাপনা — AsyncSnapshot.hasError অ্যাসিঙ্ক্রোনাস অপারেশন ব্যর্থ হলে ফলব্যাক UI দেখানোর অনুমতি দেয়
  • ConnectionState — চারটি মান সহ একটি এনাম: none (কোনো অপারেশন নেই), waiting (অপেক্ষা), active (স্ট্রিম), done (সম্পন্ন)

ফ্লাটারে FutureBuilder কী

FutureBuilder হলো widgets প্যাকেজের একটি অন্তর্নির্মিত ফ্লাটার উইজেট যা Future এবং একটি builder ফাংশন গ্রহণ করে। যখন Future-এর অবস্থা পরিবর্তিত হয় (চলমান, ডেটা সহ সম্পন্ন, ত্রুটি সহ সম্পন্ন), FutureBuilder স্বয়ংক্রিয়ভাবে একটি নতুন AsyncSnapshot সহ builder কল করে UI পুনর্নির্মাণ করে। এটি setState এবং ফ্ল্যাগের মাধ্যমে ম্যানুয়ালি লোডিং অবস্থা পরিচালনার প্রয়োজনীয়তা দূর করে।

StreamBuilder-এর বিপরীতে, যা ডেটা স্ট্রিম (Stream) নিয়ে কাজ করে, FutureBuilder এককালীন অ্যাসিঙ্ক্রোনাস অপারেশনের জন্য ডিজাইন করা হয়েছে: HTTP অনুরোধ, ফাইল পড়া, ডেটাবেস কোয়েরি। FutureBuilder নিজেই Future-এ সাবস্ক্রিপশন পরিচালনা করে: প্রথম বিল্ডে, এটি Future শুরু করে এবং এর সমাপ্তি ট্র্যাক করে। যখন উইজেট ধ্বংস হয়, FutureBuilder Future বাতিল করে না — এটি ডেভেলপারের দায়িত্ব।

Flutter Cookbook (2026) অনুসারে, FutureBuilder সুপারিশ করা হয় যখন স্ক্রিন আরম্ভে একবার অ্যাসিঙ্ক্রোনাস অপারেশন চলে। পুনরাবৃত্ত অপারেশন বা ডেটা স্ট্রিমের জন্য StreamBuilder ব্যবহার করুন। উভয় উইজেট একই রিঅ্যাকটিভ UI প্যাটার্ন অনুসরণ করে, কিন্তু FutureBuilder এককালীন অনুরোধের জন্য অপ্টিমাইজ করা।

FutureBuilder অভ্যন্তরীণভাবে কীভাবে কাজ করে

FutureBuilder-এর অভ্যন্তরীণ বাস্তবায়ন Future.then এবং catchError ব্যবহার করে Future-এ সাবস্ক্রাইব করে। FutureBuilder শুরু হলে, এটি connectionState-কে ConnectionState.waiting-এ সেট করে এবং খালি ডেটা সহ builder কল করে। সফল সমাপ্তিতে, connectionState ডেটা সহ ConnectionState.done-এ পরিবর্তিত হয়। ত্রুটিতে, snapshot.error ত্রুটি অবজেক্ট দিয়ে পূর্ণ হয়। প্রতিটি পরিবর্তন উইজেট পুনর্নির্মাণ ট্রিগার করে।

AsyncSnapshot: অবস্থা এবং বৈশিষ্ট্য

AsyncSnapshot একটি কন্টেইনার অবজেক্ট যা FutureBuilder প্রতিটি অবস্থা পরিবর্তনে builder ফাংশনে পাঠায়। এতে অ্যাসিঙ্ক্রোনাস অপারেশনের বর্তমান স্থিতি সম্পর্কে সমস্ত তথ্য থাকে: লোডিং চলছে কিনা, কী ডেটা প্রাপ্ত হয়েছে বা কোনো ত্রুটি ঘটেছে কিনা। AsyncSnapshot বোঝা FutureBuilder-এর সাথে সঠিকভাবে UI তৈরির চাবিকাঠি।

বৈশিষ্ট্যটাইপবর্ণনা
connectionStateConnectionStateবর্তমান সংযোগের অবস্থা (none, waiting, active, done)
dataT?Future থেকে প্রাপ্ত ডেটা (সম্পন্ন হওয়া পর্যন্ত বা ত্রুটিতে null)
errorObject?ত্রুটি অবজেক্ট যদি Future ব্যতিক্রম সহ সম্পন্ন হয়
hasDatabooltrue যদি data null না হয় এবং connectionState ConnectionState.done হয়
hasErrorbooltrue যদি Future ত্রুটি সহ সম্পন্ন হয়

ConnectionState: একটি অ্যাসিঙ্ক্রোনাস অপারেশনের চারটি অবস্থা

ConnectionState এনাম অ্যাসিঙ্ক্রোনাস অপারেশনের পর্যায় নির্ধারণ করে। None — প্রাথমিক অবস্থা যখন Future এখনও শুরু হয়নি (বিরলভাবে ব্যবহৃত, সাধারণত initialData ছাড়া প্রথম বিল্ডে)। Waiting — Future চলছে, ডেটা এখনও প্রাপ্ত হয়নি। Active — শুধুমাত্র StreamBuilder আংশিক ডেটা সহ স্ট্রিমের জন্য ব্যবহার করে। Done — Future সম্পন্ন হয়েছে, ডেটা snapshot.data বা ত্রুটি snapshot.error-এর মাধ্যমে উপলব্ধ।

builder ফাংশনে সমস্ত AsyncSnapshot অবস্থার সঠিক পরিচালনা প্রোডাকশন কোডের জন্য বাধ্যতামূলক প্রয়োজনীয়তা। যদি আপনি waiting অবস্থা না সামলান, ব্যবহারকারী লোডিংয়ের সময় একটি খালি স্ক্রিন দেখবেন। যদি আপনি hasError না সামলান, ব্যবহারকারী ব্যাখ্যা ছাড়াই একটি ব্যতিক্রম পাবেন। প্রস্তাবিত প্যাটার্ন: hasError চেক করুন → hasData চেক করুন → ডিফল্টভাবে লোডিং দেখান।

FutureBuilder ব্যবহারের প্যাটার্ন

FutureBuilder বেশ কয়েকটি স্ট্যান্ডার্ড প্যাটার্নে ব্যবহার করা যেতে পারে, প্রতিটি একটি নির্দিষ্ট কাজ সমাধান করে। আসুন প্রধান পরিস্থিতিগুলি দেখি: আরম্ভে ডেটা লোড করা, ক্যাশিং সহ লোড করা, সমান্তরাল অনুরোধ এবং পুনরায় চেষ্টা সহ ত্রুটি ব্যবস্থাপনা।

স্ক্রিন আরম্ভে ডেটা লোড করা

সবচেয়ে সাধারণ প্যাটার্ন — StatefulWidget বা StatelessWidget-এর build পদ্ধতিতে FutureBuilder। Future initState থেকে পাঠানো হয় বা সরাসরি build-এ তৈরি করা হয়। প্রতিটি পুনর্নির্মাণে build পদ্ধতিতে Future না তৈরি করা গুরুত্বপূর্ণ — এটি বারবার অনুরোধের দিকে নিয়ে যাবে। State ফিল্ডে সংরক্ষিত Future ব্যবহার করুন।

ক্যাশিং এবং রিফ্রেশ সহ লোড করা

বারবার অনুরোধ রোধ করতে, FutureBuilder-কে CachedNetworkImage বা স্থানীয় ক্যাশের সাথে যুক্ত করা যেতে পারে। প্রথম লোডের পরে, ডেটা মেমোরি বা SharedPreferences-এ সংরক্ষিত হয়, এবং FutureBuilder সমান্তরালে নেটওয়ার্ক থেকে রিফ্রেশ করার সময় তাত্ক্ষণিকভাবে ক্যাশে করা ডেটা প্রদর্শন করে। এটি তাত্ক্ষণিক প্রতিক্রিয়ার মাধ্যমে UX উন্নত করে।

pub.dev (2026) অনুসারে, ক্যাশিং বিশেষ করে ছবি এবং ডেটা তালিকার জন্য প্রাসঙ্গিক। CachedNetworkImageProvider সহ FutureBuilder স্বয়ংক্রিয়ভাবে ক্যাশে করা ছবি প্রদর্শন করে, এবং এর অনুপস্থিতিতে — ডাউনলোড করা ফাইলের পরে একটি লোডিং ইন্ডিকেটর দেখায়।

FutureBuilder বনাম setState: কী বেছে নেবেন

FutureBuilder এবং setState-এর মাধ্যমে ম্যানুয়াল অবস্থা পরিচালনা — ফ্লাটারে অ্যাসিঙ্ক্রোনাস UI-এর দুটি পদ্ধতি। প্রতিটির নিজস্ব সুবিধা এবং সীমাবদ্ধতা রয়েছে। পছন্দটি স্ক্রিনের জটিলতা এবং অ্যাসিঙ্ক্রোনাস অপারেশনের সংখ্যার উপর নির্ভর করে।

FutureBuilder সরলতায় জয়ী হয়: লোডিং অবস্থা, ডেটা এবং ত্রুটির জন্য ফিল্ড ঘোষণা করার প্রয়োজন নেই — সবকিছু AsyncSnapshot-এর মাধ্যমে পরিচালিত হয়। এটি একটি অ্যাসিঙ্ক্রোনাস অপারেশন (একটি HTTP অনুরোধ, ডেটাবেস পড়া) সহ সহজ স্ক্রিনের জন্য আদর্শ। তবে, একটি স্ক্রিনে 5+ অ্যাসিঙ্ক্রোনাস অপারেশনের সাথে, FutureBuilder অত্যধিক নেস্টিং তৈরি করে — ফলে নেস্টেড FutureBuilders-এর একটি “পিরামিড” তৈরি হয়।

ম্যানুয়াল অবস্থা ফ্ল্যাগ সহ setState জটিল যুক্তির জন্য আরও নিয়ন্ত্রণ এবং পঠনযোগ্যতা দেয়। একাধিক নির্ভরশীল অনুরোধ সহ স্ক্রিনের (ব্যবহারকারী লোড করুন → তাদের অর্ডার লোড করুন → অর্ডার বিবরণ লোড করুন) জন্য ChangeNotifier বা Bloc সহ setState ব্যবহার করা ভাল। Flutter State Management Guide (2026) অনুসারে, জটিল পরিস্থিতিতে FutureBuilder-এর পরিবর্তে Riverpod বা Bloc সুপারিশ করা হয়, কারণ তারা যুক্তি এবং উপস্থাপনার ভাল বিচ্ছেদ প্রদান করে।

নেটওয়ার্ক ডেটা লোডিং সহ FutureBuilder উদাহরণ

আসুন REST API থেকে ব্যবহারকারীদের তালিকা লোড করার জন্য একটি ব্যবহারিক FutureBuilder উদাহরণ দেখি। কোডটি তিনটি AsyncSnapshot অবস্থার: লোডিং, ত্রুটি এবং প্রস্তুত ডেটার সঠিক পরিচালনা প্রদর্শন করে।

dart
class UserListPage extends StatefulWidget {
  const UserListPage({super.key});

  @override
  State<UserListPage> createState() => _UserListPageState();
}

class _UserListPageState extends State<UserListPage> {
  final Future<List<User>> usersFuture = UserRepository().fetchUsers();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ব্যবহারকারী')),
      body: FutureBuilder<List<User>>(
        future: usersFuture,
        builder: (context, AsyncSnapshot<List<User>> snapshot) {
          if (snapshot.hasError) {
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  const Icon(Icons.error_outline, size: 48, color: Colors.red),
                  const SizedBox(height: 16),
                  Text('ত্রুটি: ${snapshot.error}'),
                ],
              ),
            );
          }

          if (snapshot.hasData) {
            final users = snapshot.data!;
            return ListView.builder(
              itemCount: users.length,
              itemBuilder: (context, index) {
                return ListTile(
                  leading: CircleAvatar(backgroundImage: NetworkImage(users[index].avatarUrl)),
                  title: Text(users[index].name),
                  subtitle: Text(users[index].email),
                );
              },
            );
          }

          return const Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}

উদাহরণে, FutureBuilder তিনটি অবস্থাই সামলায়। ত্রুটিতে, ত্রুটি বার্তা সহ একটি আইকন প্রদর্শিত হয়। সফল লোডে — অ্যাভাটার এবং নাম সহ ListView। লোডিংয়ের সময় — CircularProgressIndicator। Future একটি ক্লাস ফিল্ড হিসাবে ঘোষণা করা হয়, যা পুনর্নির্মাণে বারবার আহ্বান রোধ করে। এই প্যাটার্নটি মোবাইল অ্যাপে FutureBuilder ব্যবহারের 90% পরিস্থিতি কভার করে।

সচরাচর জিজ্ঞাসা

কেন FutureBuilder builder-কে একাধিকবার কল করে?

FutureBuilder প্রতিটি Future অবস্থা পরিবর্তনে builder-কে কল করে: প্রথমবার তৈরি করার সময় (connectionState: none বা waiting), দ্বিতীয়বার সম্পন্ন হলে (connectionState: done)। যদি প্যারেন্ট উইজেট পুনর্নির্মিত হয়, FutureBuilder-ও পুনর্নির্মিত হয়। বারবার কল রোধ করতে নিশ্চিত করুন যে Future build পদ্ধতির বাইরে তৈরি করা হয়েছে — অন্যথায় প্রতিটি build কল একটি নতুন Future তৈরি করবে।

পুনর্নির্মাণে বারবার অনুরোধ কীভাবে রোধ করবেন?

Future StatefulWidget ফিল্ডে (initState-এ) সংরক্ষণ করুন বা মেমোইজেশন ব্যবহার করুন। যদি Future build পদ্ধতির ভিতরে তৈরি করা হয়, প্রতিটি build কল একটি নতুন Future তৈরি করবে, এবং FutureBuilder অ্যাসিঙ্ক্রোনাস অপারেশন পুনরায় শুরু করবে। StatelessWidget-এর জন্য, cached_future প্যাকেজ বা keep-alive উইজেট ব্যবহার করুন যাতে Future পুনর্নির্মাণ নির্বিশেষে একবার চলে।

FutureBuilder StreamBuilder থেকে কীভাবে আলাদা?

FutureBuilder এককালীন অ্যাসিঙ্ক্রোনাস অপারেশনের জন্য ডিজাইন করা হয়েছে (একটি HTTP অনুরোধ, একটি ডেটাবেস পড়া)। StreamBuilder ডেটা স্ট্রিমের সাথে কাজ করে যা সময়ের সাথে একাধিক মান নির্গত করতে পারে (চ্যাট, মূল্য আপডেট, জিওলোকেশন)। StreamBuilder আংশিক ডেটার জন্য ConnectionState.active সমর্থন করে, যেখানে FutureBuilder শুধুমাত্র waiting এবং done সমর্থন করে।

একাধিক Future-এর সাথে FutureBuilder কীভাবে ব্যবহার করবেন?

একাধিক সমান্তরাল Future-এর জন্য, Future.wait ব্যবহার করুন এবং ফলাফল একটি একক FutureBuilder-এ পাঠান। Future.wait Future-এর একটি তালিকা নেয় এবং Future ফেরত দেয় — যখন সমস্ত Future সম্পন্ন হয়, builder ফলাফলের একটি অ্যারে পায়। অনুক্রমিক অনুরোধের জন্য, একটি Future-এর ভিতরে Future.then চেইন বা নেস্টেড FutureBuilders (কম পঠনযোগ্য) ব্যবহার করুন। বিকল্প একাধিক অ্যাসিঙ্ক্রোনাস অবস্থার জন্য AsyncValue সহ riverpod প্যাকেজ।

স্ক্রিন থেকে বের হলে Future কীভাবে বাতিল করবেন?

FutureBuilder স্বয়ংক্রিয়ভাবে Future বাতিল করে না। বাতিল করতে, async প্যাকেজ থেকে CancelableOperation বা State-এ cancelled ফ্ল্যাগের মাধ্যমে কাস্টম প্রক্রিয়া ব্যবহার করুন। dispose()-এ ফ্ল্যাগ সেট করুন, এবং setState কল করার আগে Future সম্পন্ন হওয়ার পরে এটি পরীক্ষা করুন। বিকল্পভাবে, AutoDispose সহ riverpod প্যাকেজ ব্যবহার করুন, যা স্ক্রিন থেকে বের হলে স্বয়ংক্রিয়ভাবে অ্যাসিঙ্ক্রোনাস অপারেশন বাতিল করে।

সারাংশ

  • FutureBuilder — AsyncSnapshot (waiting, done, error) এর মাধ্যমে Future অবস্থার ভিত্তিতে ডিক্লারেটিভ UI তৈরির জন্য ফ্লাটার উইজেট
  • AsyncSnapshot — connectionState, data এবং error সহ কন্টেইনার; সমস্ত অ্যাসিঙ্ক্রোনাস অপারেশন অবস্থার সঠিক পরিচালনার জন্য অপরিহার্য
  • builder — তিনটি শাখা সহ কলব্যাক: hasError (ত্রুটি দেখান), hasData (ডেটা দেখান), default (লোডিং ইন্ডিকেটর)
  • FutureBuilder বনাম setState — FutureBuilder একটি অপারেশনের জন্য সহজ, জটিল যুক্তির জন্য setState Bloc/Riverpod সহ একাধিক অনুরোধের জন্য ভাল
  • বারবার অনুরোধ রোধ — Future একটি State ফিল্ড হওয়া উচিত, প্রতিটি পুনর্নির্মাণে পুনরায় শুরু এড়াতে build পদ্ধতিতে এটি তৈরি করবেন না
  • Future বাতিল — FutureBuilder dispose-এ Future বাতিল করে না; ধ্বংসের পরে setState রোধ করতে CancelableOperation বা বাতিল ফ্ল্যাগ ব্যবহার করুন
  • একাধিক Future — সমান্তরাল অনুরোধের জন্য একটি একক FutureBuilder-এর সাথে Future.wait ব্যবহার করুন; অনুক্রমিকের জন্য — একটি একক Future-এ চেইন

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন