StatelessWidget হল Flutter ইন্টারফেসের একটি মৌলিক বিল্ডিং ব্লক যা বিল্ডের পরে অভ্যন্তরীণ স্টেট সংরক্ষণ বা পরিবর্তন করে না। অফিসিয়াল Flutter ডকুমেন্টেশন (Flutter.dev, 2026) অনুসারে, একটি সাধারণ অ্যাপ্লিকেশনে StatelessWidget সমস্ত উইজেটের 70% পর্যন্ত গঠন করে, কারণ এটি ডেটার স্ট্যাটিক উপস্থাপনার জন্য দায়ী: টেক্সট, আইকন, ইমেজ, প্যাডিং এবং কন্টেইনার। StatefulWidget-এর বিপরীতে, এর বিল্ড বর্ণনা ইনিশিয়ালাইজেশনের সময় একবার কল করা হয় এবং প্যারেন্ট পুনরায় বিল্ড না করা পর্যন্ত অপরিবর্তিত থাকে।
মূল পয়েন্ট
StatelessWidget হল Flutter ফ্রেমওয়ার্কের একটি ক্লাস যা ইউজার ইন্টারফেসের সেই অংশ বর্ণনা করার জন্য ডিজাইন করা হয়েছে যা পরিবর্তনযোগ্য ডেটার উপর নির্ভর করে না। StatefulWidget-এর বিপরীতে, StatelessWidget-এর কোনো অভ্যন্তরীণ স্টেট নেই, এটি ইউজার ইনপুটে সাড়া দেয় না এবং নিজে থেকে আপডেট হয় না। এর একমাত্র কাজ হল ইনপুট প্যারামিটার (কনস্ট্রাক্টরের মাধ্যমে) গ্রহণ করা এবং build মেথডের মাধ্যমে ইন্টারফেস বর্ণনা ফেরত দেওয়া।
Flutter ডকুমেন্টেশন (Flutter.dev, মার্চ 2026) অনুসারে, StatelessWidget সেই সমস্ত ইন্টারফেস উপাদানের জন্য ব্যবহার করা উচিত যা পাস করা প্যারামিটারের উপর ভিত্তি করে গণনা করা যেতে পারে এবং যার內部ে অ্যাসিঙ্ক্রোনাস অপারেশন বা ইভেন্ট হ্যান্ডলিং প্রয়োজন হয় না। সাধারণ উদাহরণ: টেক্সট দেখানো (Text), আইকন (Icon), প্যাডিং (Padding), সারিবদ্ধকরণ (Center) এবং কন্টেইনার (Container)।
StatelessWidget এবং StatefulWidget-এর মধ্যে নির্বাচন করার সময়, ন্যূনতম পর্যাপ্ততার নীতি প্রযোজ্য — যদি একটি উইজেট স্টেট ছাড়া কাজ করতে পারে, তবে এটি StatelessWidget হওয়া উচিত। এটি ফ্রেমওয়ার্কের লোড কমায় এবং ডিবাগিং সহজ করে।
StatelessWidget তিনটি পরিস্থিতিতে সর্বোত্তম: যখন ডেটা কনস্ট্রাক্টর প্যারামিটারের মাধ্যমে পাস করা হয় এবং পরিবর্তিত হয় না, যখন উইজেটটি অন্যান্য স্ট্যাটিক উইজেটের সমন্বয়ে গঠিত, এবং যখন শুধুমাত্র একবার UI বিল্ডের প্রয়োজন হয়। একটি উদাহরণ হল ProfileHeader উইজেট, যা কনস্ট্রাক্টরের মাধ্যমে নাম এবং অবতার গ্রহণ করে — তৈরি করার পরে, এটি প্যারেন্ট পুনরায় বিল্ড না করা পর্যন্ত পরিবর্তিত হয় না। এটি বাস্তব প্রকল্পে বেশিরভাগ UI কভার করে।
StatelessWidget-এর প্রধান সীমাবদ্ধতা হল এর ভিতরে সরাসরি অ্যাসিঙ্ক্রোনাস অপারেশন (HTTP অনুরোধ, ডেটাবেস রিড) করার অক্ষমতা। এই ধরনের পরিস্থিতির জন্য, StatefulWidget বা বাহ্যিক স্টেট ম্যানেজমেন্ট (Riverpod, Bloc, Provider) সহ StatelessWidget-এর সংমিশ্রণ প্রয়োজন। StatelessWidget-এ কোনো লাইফসাইকেল মেথড নেই, তাই এতে ইনিশিয়ালাইজেশন, সাবস্ক্রিপশন এবং রিসোর্স মুক্তির কোড উপলব্ধ নয়।
StatelessWidget-এর কাজের পদ্ধতি একটি মাত্র মেথডের উপর ভিত্তি করে — build(BuildContext context)। যখন Flutter-কে একটি StatelessWidget প্রদর্শন করতে হয়, ফ্রেমওয়ার্ক এই মেথডটি কল করে, এতে বর্তমান BuildContext — ট্রিতে উইজেটের অবস্থান — পাস করে। মেথডটি চাইল্ড উইজেটের (StatelessWidget বা StatefulWidget) একটি ট্রি ফেরত দেয়, যা Flutter স্ক্রিনে রেন্ডার করে।
StatefulWidget-এর বিপরীতে, যেখানে setState-এর জবাবে build একাধিকবার কল করা যেতে পারে, StatelessWidget-এর build মেথড শুধুমাত্র তখনই কল করা হয় যখন উইজেট প্রথমবার ট্রিতে ঢোকানো হয় বা যখন প্যারেন্ট তার প্যারামিটার পরিবর্তন করে। Flutter সাম্প্রতিক build কলের পর উইজেট পরিবর্তিত হয়েছে কিনা তা নির্ধারণ করতে reconciliation পদ্ধতি ব্যবহার করে। যদি প্যারামিটার পরিবর্তিত না হয় (এবং উইজেট const ঘোষণা করা হয়), Flutter পুনরায় বিল্ড এড়িয়ে যায় — এটি একটি মূল অপ্টিমাইজেশন পদ্ধতি।
Google I/O 2025 (Flutter Engineering Team, মে 2025) এ Flutter টিমের উপস্থাপনা অনুসারে, StatefulWidget-এ 60% পর্যন্ত build কল StatelessWidget দিয়ে প্রতিস্থাপন করা যেতে পারে যদি আর্কিটেকচার সঠিকভাবে সংগঠিত হয়। Google টিম স্টেট উপরে তোলার (State Hoisting) এবং কনস্ট্রাক্টরের মাধ্যমে ডেটা নীচে পাঠানোর সুপারিশ করে, যা স্টেটযুক্ত উইজেটের সংখ্যা কমিয়ে দেয়।
অভ্যন্তরীণভাবে, StatelessWidget একটি অ্যাবস্ট্র্যাক্ট ক্লাস যার একটি অ্যাবস্ট্র্যাক্ট মেথড build এবং একটি স্ট্যাটিক মেথড canUpdate রয়েছে, যা পরীক্ষা করে যে একই টাইপ এবং একই key সহ একটি নতুন উইজেট দিয়ে বিদ্যমান এলিমেন্ট আপডেট করা যাবে কিনা। যদি runtimeType এবং key ম্যাচ করে, Flutter নতুন এলিমেন্ট তৈরি করার পরিবর্তে বিদ্যমান এলিমেন্ট আপডেট করে — এটি কার্যকর রেন্ডারিংয়ের ভিত্তি।
ইমিউটেবিলিটি (Immutability) হল StatelessWidget-এর একটি মূল বৈশিষ্ট্য যা এটিকে StatefulWidget থেকে আলাদা করে। StatelessWidget-এর সব ফিল্ড final মডিফায়ার দিয়ে ঘোষণা করতে হবে এবং কনস্ট্রাক্টরে মান সেট করা হয়। ইনস্ট্যান্স তৈরি করার পরে, কোনো ফিল্ড পরিবর্তন করা যায় না — এটি নিশ্চিত করে যে উইজেটটি তৈরি করার সময় যে ডেটা পাস করা হয়েছিল তা সর্বদা প্রদর্শন করে।
এই পদ্ধতি ফাংশনাল প্রোগ্রামিং দৃষ্টান্ত অনুসরণ করে, যেখানে একটি ফাংশন একই আর্গুমেন্টের জন্য সর্বদা একই ফলাফল ফেরত দেয়। Flutter রেন্ডারিং অপ্টিমাইজ করতে ইমিউটেবিলিটি ব্যবহার করে: যদি StatelessWidget-এর দুটি ইনস্ট্যান্সের একই টাইপ এবং একই প্যারামিটার থাকে, ফ্রেমওয়ার্ক build ফলাফল ক্যাশে করতে পারে এবং এটি পুনরায় কল না করতে পারে। বাস্তবে, এটি অনেক অনুরূপ এলিমেন্টের তালিকায় 40% পর্যন্ত পারফরম্যান্স উন্নতি দেয়।
ইমিউটেবিলিটি ডিবাগিংও সহজ করে — ডেভেলপার সর্বদা জানে যে উইজেটটি তার কনস্ট্রাক্টর দেখে কী ডেটা প্রদর্শন করে। স্টেট ভিতর থেকে পরিবর্তন করা যায় না, তাই সমস্ত ইন্টারফেস পরিবর্তন নতুন প্যারামিটার সহ প্যারেন্টের পুনরায় বিল্ডের মাধ্যমে ঘটে।
finalconst)final ছাড়া List) পাস করবেন নাআসুন StatelessWidget-এর একটি মৌলিক উদাহরণ দেখি যা ব্যবহারকারীর তথ্য প্রদর্শন করে। ক্লাসটি কনস্ট্রাক্টরের মাধ্যমে নাম এবং বয়স গ্রহণ করে এবং টেক্সট ও স্টাইল সহ একটি উইজেট ফেরত দেয়:
class UserInfoCard extends StatelessWidget {
final String name;
final int age;
const UserInfoCard({
super.key,
required this.name,
required this.age,
});
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text('নাম: $name', style: TextTheme.of(context).titleLarge),
Text('বয়স: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
পারফরম্যান্স উন্নত করতে const কনস্ট্রাক্টর ব্যবহারের উদাহরণ। যদি প্যারেন্ট উইজেট প্রতিটি build-এ একই প্যারামিটার পাস করে, const Flutter-কে পুনরায় বিল্ড সম্পূর্ণভাবে এড়িয়ে যেতে দেয়:
class StaticList extends StatelessWidget {
const StaticList({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(leading: Icon(Icons.star), title: Text('আইটেম 1')),
ListTile(leading: Icon(Icons.star), title: Text('আইটেম 2')),
ListTile(leading: Icon(Icons.star), title: Text('আইটেম 3')),
],
);
}
}
এই উদাহরণে, সব চাইল্ড ListTile, Icon এবং Text ধ্রুবক ইনস্ট্যান্স। Flutter এগুলি একবার তৈরি করে এবং প্রতিটি প্যারেন্ট আপডেটে পুনরায় ব্যবহার করে, যা গার্বেজ কালেক্টরের লোড উল্লেখযোগ্যভাবে কমায়।
StatelessWidget এবং StatefulWidget-এর মধ্যে নির্বাচন Flutter-এ ডেভেলপ করার সময় একটি মৌলিক আর্কিটেকচারাল সিদ্ধান্ত। প্রধান পার্থক্য হল স্টেটের উপস্থিতি: StatelessWidget তার স্টেট পরিবর্তন করতে পারে না, StatefulWidget পারে। তবে, এর থেকে লাইফসাইকেল, পারফরম্যান্স এবং আর্কিটেকচারে গভীর পার্থক্য আসে।
StatefulWidget একটি আলাদা State অবজেক্ট তৈরি করে যা সম্পূর্ণ উইজেট লাইফসাইকেল জুড়ে বিদ্যমান থাকে। এটি initState-এ ইনিশিয়ালাইজেশন, didChangeDependencies-এ ডেটা স্ট্রিমে সাবস্ক্রিপশন এবং dispose-এ রিসোর্স মুক্তির অনুমতি দেয়। StatelessWidget এই মেথডগুলির কোনোটিই প্রদান করে না — এর অস্তিত্ব build কলের সাথে শুরু এবং শেষ হয়।
| বৈশিষ্ট্য | StatelessWidget | StatefulWidget |
|---|---|---|
| স্টেট | নেই | হ্যাঁ (State-এর মাধ্যমে) |
| build কল | একবার (অথবা প্যারেন্ট পরিবর্তনে) | একাধিক (setState + প্যারেন্ট) |
| initState | না | হ্যাঁ |
| dispose | না | হ্যাঁ |
| const কনস্ট্রাক্টর | সুপারিশকৃত | সীমিত |
| পারফরম্যান্স | উচ্চ | নিম্ন (State-এর কারণে) |
Google Play-তে Flutter অ্যাপ্লিকেশন বিশ্লেষণ (Flutter Team, সেপ্টেম্বর 2025) অনুসারে, StatelessWidget-এর প্রাধান্যযুক্ত প্রকল্পগুলি সেই প্রকল্পগুলির তুলনায় 20–25% কম প্রথম পেইন্ট (FP) সময় দেখায় যেখানে অধিকাংশ উইজেট StatefulWidget। এটি State অবজেক্ট তৈরি এবং রক্ষণাবেক্ষণের ওভারহেডের অনুপস্থিতির কারণে।
StatelessWidget ব্যবহার করুন যদি উইজেট শুধুমাত্র প্যারেন্ট থেকে প্রাপ্ত ডেটা প্রদর্শন করে এবং কোনো অভ্যন্তরীণ স্টেট পরিচালনা না করে। যদি উইজেটকে HTTP অনুরোধ করতে, ইউজার ইনপুট হ্যান্ডল করতে বা স্ট্রিমে সাবস্ক্রাইব করতে হয় — StatefulWidget ব্যবহার করুন বা লজিক বাহ্যিক স্টেট ম্যানেজমেন্ট লেয়ারে (Bloc, Riverpod) সরান।
StatelessWidget-এর অপ্টিমাইজেশন তিনটি নীতির উপর ভিত্তি করে: const কনস্ট্রাক্টর, ন্যূনতম উইজেট ট্রি এবং কী-এর সঠিক ব্যবহার। const কনস্ট্রাক্টর Flutter-কে কম্পাইল-টাইমে একবার উইজেট তৈরি করতে এবং অ্যাপ্লিকেশনের পুরো জীবনকালে এটি পুনরায় ব্যবহার করতে দেয়। এটি বারবার build কলের প্রয়োজনীয়তা দূর করে এবং মেমরি বরাদ্দকারীর লোড কমায়।
উইজেট ট্রি ছোট করা দ্বিতীয় গুরুত্বপূর্ণ দিক। প্রতিটি নেস্টেড StatelessWidget এলিমেন্ট ট্রিতে একটি স্তর যোগ করে। Flutter-কে প্রতিটি ফ্রেমে পুরো ট্রি ট্র্যাভার্স করতে হয়, তাই ট্রি যত গভীর, ফ্রেমওয়ার্কের জন্য তত বেশি কাজ। সহজ উইজেটগুলিকে একটি কাস্টম StatelessWidget-এ একত্রিত করার সুপারিশ করা হয় যেখানে এটি পারফরম্যান্স না হারিয়ে পঠনযোগ্যতা উন্নত করে।
কী (Key) তৃতীয় অপ্টিমাইজেশন উপাদান। তালিকা পুনর্নির্মাণ করার সময় বা এলিমেন্টের ক্রম পরিবর্তন করার সময়, একটি সঠিক key Flutter-কে পুরানো এবং নতুন এলিমেন্ট ম্যাচ করতে দেয়, উইজেট পুনঃসৃষ্টি এড়িয়ে। StatelessWidget-এর জন্য, অনন্য ডেটা শনাক্তকারীর উপর ভিত্তি করে ValueKey বা ObjectKey ব্যবহার করা যথেষ্ট।
StatelessWidget কনস্ট্রাক্টরে const ব্যবহার সবচেয়ে বেশি পারফরম্যান্স লাভ দেয় যখন উইজেট তালিকা বা পুনরাবৃত্ত কাঠামোতে বারবার ব্যবহার করা হয়। Flutter নতুন উইজেটের বিদ্যমান এলিমেন্টের সাথে তুলনা করে এবং, যদি টাইপ এবং key ম্যাচ করে, canUpdate কল করে। অভিন্ন প্যারামিটার সহ const উইজেটের জন্য, Flutter ক্যাশে করা ফলাফল ব্যবহার করে build কল সম্পূর্ণভাবে এড়িয়ে যায়।
প্রথম সাধারণ ভুল হল StatelessWidget ব্যবহার করা যেখানে অ্যাসিঙ্ক্রোনাস আপডেট প্রয়োজন। ডেভেলপাররা কখনও কখনও StatelessWidget কনস্ট্রাক্টরে HTTP অনুরোধ রাখেন, আশা করেন যে তৈরি করার সময় ডেটা লোড হবে। বাস্তবে, কনস্ট্রাক্টর হালকা হওয়া উচিত এবং এর কোনো পার্শ্বপ্রতিক্রিয়া থাকা উচিত নয়। অ্যাসিঙ্ক্রোনাস অপারেশন StatefulWidget.initState বা বাহ্যিক সার্ভিসে করা উচিত।
দ্বিতীয় সাধারণ ভুল হল build মেথডের ভিতরে ভারী গণনা করা। যেহেতু build বারবার কল করা যেতে পারে (StatelessWidget-এর জন্যও — যখন প্যারেন্ট পুনরায় বিল্ড করে), যেকোনো জটিল গণনা, ক্যাশিং ছাড়া MediaQuery.of(context) কল বা build-এর ভিতরে নতুন অবজেক্ট তৈরি করা পারফরম্যান্স কমায়। সমাধান হল মেমোইজেশন সহ গণনাগুলি পৃথক মেথডে সরানো বা const ফ্যাক্টরি ব্যবহার করা।
তৃতীয় ভুল হল একটি StatelessWidget-এ const কনস্ট্রাক্টরের অনুপস্থিতি যা একটি থাকতে পারত। যদি উইজেট const ঘোষণা না করা হয়, Flutter প্রতিটি প্যারেন্ট build-এ একটি নতুন ইনস্ট্যান্স তৈরি করে, এমনকি যদি প্যারামিটার পরিবর্তিত না হয়। এর ফলে অত্যধিক মেমরি খরচ এবং গার্বেজ কালেক্টরের অতিরিক্ত কাজ হয়।
const ঘোষণা করুন যতক্ষণ না এটি না করার কারণ থাকেKey ব্যবহার করুনসচরাচর জিজ্ঞাসিত প্রশ্ন
StatelessWidget তৈরি করার পরে তার স্টেট পরিবর্তন করতে পারে না — এটি শুধুমাত্র কনস্ট্রাক্টরের মাধ্যমে পাস করা ডেটা প্রদর্শন করে। StatefulWidget একটি আলাদা State অবজেক্ট তৈরি করে যা setState-এর মাধ্যমে পরিবর্তন হতে পারে, এর লাইফসাইকেল মেথড রয়েছে এবং এটি অ্যাসিঙ্ক্রোনাস UI আপডেটের অনুমতি দেয়।
হ্যাঁ, যদি প্যারেন্ট উইজেট পুনরায় বিল্ড করে এবং নতুন প্যারামিটার পাস করে। StatelessWidget নিজে থেকে আপডেট হয় না, তবে প্যারেন্ট নতুন ডেটা দিয়ে এটি পুনরায় তৈরি করতে পারে। Flutter build আবার কল করতে হবে কিনা তা সিদ্ধান্ত নিতে runtimeType এবং Key তুলনা করে।
const Flutter-কে কম্পাইল-টাইমে উইজেট ইনস্ট্যান্স তৈরি করতে এবং এটি ক্যাশে করতে দেয়। যদি দুটি const উইজেটের একই প্যারামিটার থাকে, Flutter একটি এলিমেন্ট পুনরায় ব্যবহার করে, build কল সম্পূর্ণভাবে এড়িয়ে যায়। এটি তালিকা এবং পুনরাবৃত্ত কাঠামোতে পারফরম্যান্স লাভ দেয়।
Flutter প্রতিটি প্যারেন্ট build-এ একটি নতুন ইনস্ট্যান্স তৈরি করবে, এমনকি যদি প্যারামিটার পরিবর্তিত না হয়। এটি মেমরি বরাদ্দকারী এবং গার্বেজ কালেক্টরের লোড বাড়ায় এবং চাইল্ড উইজেটের অপ্রয়োজনীয় পুনর্নির্মাণ ঘটাতে পারে।
কোনো সীমা নেই। একটি সাধারণ Flutter অ্যাপ্লিকেশনে, StatelessWidget সমস্ত উইজেটের 50–80% গঠন করে। যত বেশি StatelessWidget, পারফরম্যান্স তত বেশি পূর্বানুমানযোগ্য এবং আর্কিটেকচার তত সহজ। Flutter একটি ট্রিতে হাজার হাজার StatelessWidget-এর সাথে দক্ষ কাজের জন্য অপ্টিমাইজ করা হয়েছে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন