FutureBuilder Flutter میں ایک ویجیٹ ہے جو فراہم کردہ Future سے حاصل کردہ AsyncSnapshot کی موجودہ حالت کی بنیاد پر خود بخود اپنے انٹرفیس کو دوبارہ تعمیر کرتا ہے۔ await کے بعد دستی طور پر setState کو کال کرنے کے برعکس، FutureBuilder ایک اعلانیہ طریقہ فراہم کرتا ہے: یہ پہلے رینڈر پر Future کو سبسکرائب کرتا ہے اور ہر حالت کی تبدیلی — لوڈنگ، خرابی یا تیار ڈیٹا — پر builder فنکشن کو کال کرتا ہے۔ Flutter API Reference (2026) کے مطابق، FutureBuilder نیٹ ورک سے ڈیٹا لوڈ کرنے، ڈیٹابیس سے پڑھنے اور کسی بھی غیر متزامن آپریشن کے لیے خاص طور پر مفید ہے جہاں UI کو لوڈنگ انڈیکیٹر، خرابی کا پیغام یا تیار مواد دکھانا ہو۔
اہم نکات
FutureBuilder widgets پیکیج کا ایک بلٹ ان Flutter ویجیٹ ہے جو Future
StreamBuilder کے برعکس، جو ڈیٹا سٹریمز (Stream) کے ساتھ کام کرتا ہے، FutureBuilder ایک بار کے غیر متزامن آپریشنز کے لیے ڈیزائن کیا گیا ہے: HTTP درخواست، فائل پڑھنا، ڈیٹابیس سوال۔ FutureBuilder خود Future کی سبسکرپشن کا انتظام کرتا ہے: پہلی تعمیر پر، یہ Future شروع کرتا ہے اور اس کی تکمیل کو ٹریک کرتا ہے۔ جب ویجیٹ تباہ ہو جاتا ہے، FutureBuilder Future کو منسوخ نہیں کرتا — یہ ڈیویلپر کی ذمہ داری ہے۔
Flutter Cookbook (2026) کے مطابق، FutureBuilder ان صورتوں کے لیے تجویز کیا جاتا ہے جہاں اسکرین کی ابتدا میں ایک بار غیر متزامن آپریشن چلتا ہے۔ بار بار ہونے والے آپریشنز یا ڈیٹا سٹریمز کے لیے StreamBuilder استعمال کریں۔ دونوں ویجیٹس ایک ہی ری ایکٹیو UI پیٹرن کی پیروی کرتے ہیں، لیکن FutureBuilder ایک بار کی درخواستوں کے لیے بہتر بنایا گیا ہے۔
FutureBuilder کا اندرونی نفاذ Future.then اور catchError کا استعمال کرتے ہوئے Future کو سبسکرائب کرتا ہے۔ جب FutureBuilder شروع ہوتا ہے، یہ connectionState کو ConnectionState.waiting پر سیٹ کرتا ہے اور خالی ڈیٹا کے ساتھ builder کو کال کرتا ہے۔ کامیاب تکمیل پر، connectionState ڈیٹا کے ساتھ ConnectionState.done میں بدل جاتا ہے۔ خرابی پر، snapshot.error خرابی آبجیکٹ سے بھر جاتا ہے۔ ہر تبدیلی ویجیٹ کی دوبارہ تعمیر کو متحرک کرتی ہے۔
AsyncSnapshot ایک کنٹینر آبجیکٹ ہے جسے FutureBuilder ہر حالت کی تبدیلی پر builder فنکشن کو دیتا ہے۔ اس میں غیر متزامن آپریشن کی موجودہ حیثیت کے بارے میں تمام معلومات ہوتی ہیں: کیا لوڈنگ جاری ہے، کیا ڈیٹا موصول ہوا، یا کیا خرابی ہوئی۔ AsyncSnapshot کو سمجھنا FutureBuilder کے ساتھ UI کو صحیح طریقے سے تعمیر کرنے کی کلید ہے۔
| خصوصیت | قسم | تفصیل |
|---|---|---|
| connectionState | ConnectionState | موجودہ کنکشن حالت (none, waiting, active, done) |
| data | T? | Future سے موصول کردہ ڈیٹا (تکمیل تک یا خرابی پر null) |
| error | Object? | خرابی آبجیکٹ اگر Future استثنا کے ساتھ مکمل ہوا |
| hasData | bool | true اگر data null نہیں ہے اور connectionState ConnectionState.done ہے |
| hasError | bool | true اگر Future خرابی کے ساتھ مکمل ہوا |
ConnectionState enum غیر متزامن آپریشن کے مرحلے کی وضاحت کرتا ہے۔ None — ابتدائی حالت جب Future ابھی شروع نہیں ہوا (شاذ و نادر ہی استعمال ہوتا ہے، عام طور پر initialData کے بغیر پہلی تعمیر پر)۔ Waiting — Future چل رہا ہے، ڈیٹا ابھی موصول نہیں ہوا۔ Active — صرف StreamBuilder کے ذریعے جزوی ڈیٹا والے سٹریمز کے لیے استعمال ہوتا ہے۔ Done — Future مکمل ہوگیا، ڈیٹا snapshot.data یا خرابی snapshot.error کے ذریعے دستیاب ہے۔
builder فنکشن میں تمام AsyncSnapshot حالتوں کا مناسب انتظام پروڈکشن کوڈ کے لیے لازمی شرط ہے۔ اگر آپ waiting حالت کو نہیں سنبھالتے، صارف لوڈنگ کے دوران خالی اسکرین دیکھے گا۔ اگر آپ hasError کو نہیں سنبھالتے، صارف بغیر وضاحت کے ایک استثنا حاصل کرے گا۔ تجویز کردہ پیٹرن: hasError چیک کریں → hasData چیک کریں → ڈیفالٹ طور پر لوڈنگ دکھائیں۔
FutureBuilder کئی معیاری پیٹرن میں استعمال کیا جا سکتا ہے، ہر ایک مخصوص کام حل کرتا ہے۔ آئیے اہم منظرنامے دیکھتے ہیں: ابتدا میں ڈیٹا لوڈ کرنا، کیشنگ کے ساتھ لوڈ کرنا، متوازی درخواستیں اور دوبارہ کوشش کے ساتھ خرابی کا انتظام۔
سب سے عام پیٹرن — StatefulWidget یا StatelessWidget کے build طریقہ میں FutureBuilder۔ Future initState سے منتقل کیا جاتا ہے یا براہ راست build میں بنایا جاتا ہے۔ ہر دوبارہ تعمیر پر build طریقہ میں Future کو نہ بنانا ضروری ہے — یہ بار بار درخواستوں کا باعث بنے گا۔ State فیلڈ میں محفوظ کردہ Future استعمال کریں۔
بار بار درخواستوں کو روکنے کے لیے، FutureBuilder کو CachedNetworkImage یا مقامی کیش کے ساتھ ملایا جا سکتا ہے۔ پہلی لوڈنگ کے بعد، ڈیٹا میموری یا SharedPreferences میں محفوظ ہو جاتا ہے، اور FutureBuilder نیٹ ورک سے متوازی طور پر ریفریش کرتے ہوئے کیشڈ ڈیٹا کو فوری طور پر دکھاتا ہے۔ یہ فوری ردعمل کے ذریعے صارف کے تجربے کو بہتر بناتا ہے۔
pub.dev (2026) کے مطابق، کیشنگ خاص طور پر تصاویر اور ڈیٹا کی فہرستوں کے لیے اہم ہے۔ CachedNetworkImageProvider کے ساتھ FutureBuilder خود بخود کیشڈ تصویر دکھاتا ہے، اور اس کی عدم موجودگی میں — ڈاؤن لوڈ کردہ فائل کے بعد لوڈنگ انڈیکیٹر۔
FutureBuilder اور setState کے ذریعے دستی حالت کا انتظام — Flutter میں غیر متزامن UI کے دو طریقے ہیں۔ ہر ایک کے اپنے فوائد اور حدود ہیں۔ انتخاب اسکرین کی پیچیدگی اور غیر متزامن آپریشنز کی تعداد پر منحصر ہے۔
FutureBuilder سادگی میں جیتتا ہے: آپ کو لوڈنگ حالت، ڈیٹا اور خرابی کے لیے فیلڈز اعلان کرنے کی ضرورت نہیں — سب کچھ AsyncSnapshot کے ذریعے منظم ہوتا ہے۔ یہ ایک غیر متزامن آپریشن (ایک HTTP درخواست، ڈیٹابیس پڑھنا) والی سادہ اسکرینوں کے لیے مثالی ہے۔ تاہم، ایک اسکرین پر 5+ غیر متزامن آپریشنز کے ساتھ، FutureBuilder ضرورت سے زیادہ گھریلو پن پیدا کرتا ہے — جس کے نتیجے میں گھریلے FutureBuilders کا ایک “پرامڈ” بنتا ہے۔
دستی حالت کے جھنڈوں کے ساتھ setState پیچیدہ منطق کے لیے زیادہ کنٹرول اور پڑھنے کی اہلیت دیتا ہے۔ متعدد منحصر درخواستوں والی اسکرینوں (صارف لوڈ کریں → ان کے آرڈر لوڈ کریں → آرڈر کی تفصیلات لوڈ کریں) کے لیے ChangeNotifier یا Bloc کے ساتھ setState استعمال کرنا بہتر ہے۔ Flutter State Management Guide (2026) کے مطابق، پیچیدہ منظرناموں کے لیے FutureBuilder کے بجائے Riverpod یا Bloc تجویز کیا جاتا ہے، کیونکہ وہ منطق اور پیشکش کی بہتر علیحدگی فراہم کرتے ہیں۔
آئیے REST API سے صارفین کی فہرست لوڈ کرنے کی ایک عملی FutureBuilder مثال دیکھتے ہیں۔ کوڈ AsyncSnapshot کی تینوں حالتوں: لوڈنگ، خرابی اور تیار ڈیٹا کے صحیح انتظام کو ظاہر کرتا ہے۔
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 ہر 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 ایک بار کے غیر متزامن آپریشنز (ایک HTTP درخواست، ایک ڈیٹابیس پڑھنا) کے لیے ڈیزائن کیا گیا ہے۔ StreamBuilder ڈیٹا سٹریمز کے ساتھ کام کرتا ہے جو وقت کے ساتھ متعدد اقدار خارج کر سکتے ہیں (چیٹ، قیمت کی تازہ کاری، جغرافیائی محل وقوع)۔ StreamBuilder جزوی ڈیٹا کے لیے ConnectionState.active کو سپورٹ کرتا ہے، جبکہ FutureBuilder صرف waiting اور done کو سپورٹ کرتا ہے۔
متعدد متوازی Futures کے لیے، Future.wait استعمال کریں اور نتیجہ ایک FutureBuilder کو دیں۔ Future.wait Futures کی فہرست لیتا ہے اور Future لوٹاتا ہے — جب تمام Futures مکمل ہو جائیں، builder نتائج کی ایک صف حاصل کرتا ہے۔ ترتیب وار درخواستوں کے لیے، ایک Future کے اندر Future.then چین یا گھریلے FutureBuilder (کم پڑھنے کے قابل) استعمال کریں۔ متبادل متعدد غیر متزامن حالتوں کے لیے AsyncValue کے ساتھ riverpod پیکیج ہے۔
FutureBuilder خود بخود Future کو منسوخ نہیں کرتا۔ منسوخ کرنے کے لیے، async پیکیج سے CancelableOperation یا State میں cancelled جھنڈے کے ذریعے حسب ضرورت طریقہ کار استعمال کریں۔ جھنڈا dispose() میں سیٹ کریں، اور setState کال کرنے سے پہلے Future مکمل ہونے کے بعد اسے چیک کریں۔ متبادل طور پر، AutoDispose کے ساتھ riverpod پیکیج استعمال کریں، جو اسکرین سے نکلتے وقت خود بخود غیر متزامن آپریشنز منسوخ کر دیتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں