স্টেটফুল উইজেট বনাম স্টেটলেস উইজেট।
স্টেটলেস উইজেট - এমন একটি উইজেট যার পক্ষে পরিবর্তনীয় রাষ্ট্রের প্রয়োজন হয় না।
স্টেটলেস উইজেট হ'ল একটি উইজেট যা ইউজার ইন্টারফেসের অংশটিকে অন্যান্য উইজেটের একটি নক্ষত্র স্থাপন করে যা ব্যবহারকারী ইন্টারফেসকে আরও দৃ concrete়তার সাথে বর্ণনা করে। ব্যবহারকারী ইন্টারফেসের বর্ণনা সম্পূর্ণরূপে কংক্রিট না হওয়া পর্যন্ত বিল্ডিং প্রক্রিয়াটি পুনরাবৃত্তভাবে চলতে থাকে (উদাহরণস্বরূপ, রেন্ডারঅবজেক্ট উইজেটগুলি সম্পূর্ণরূপে গঠিত, যা কংক্রিট রেন্ডারঅবজেক্টস বর্ণনা করে)।
stateless
যখন ব্যবহারকারী ইন্টারফেস আপনাকে বর্ণনা অংশ বস্তুর নিজেই এবং কনফিগারেশন সংক্রান্ত তথ্য ছাড়া আর কিছু উপর নির্ভর করে না উইজেট দরকারী
BuildContext যা উইজেট স্ফীত হয়। গতিশীল পরিবর্তন করতে পারে এমন রচনাগুলির জন্য, যেমন অভ্যন্তরীণ ক্লক-চালিত রাষ্ট্র থাকার কারণে বা কোনও সিস্টেমের অবস্থার উপর নির্ভর করে, ব্যবহার বিবেচনা করুন
StatefulWidget
।
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
স্টেটফুল উইজেট - এমন একটি উইজেট যাতে পারস্পরিক পরিবর্তনযোগ্য অবস্থা রয়েছে।
- আপনি বর্ণনা করছেন এমন ইউজার ইন্টারফেসের অংশটি পরিবর্তনশীলভাবে পরিবর্তন করতে পারে তখন রাষ্ট্রীয় উইজেটগুলি কার্যকর হয়।
ঝাঁকুনি যখন a StatefulWidget
, এটি একটি স্টেট অবজেক্ট তৈরি করে। এই অবজেক্টটি যেখানে সেই উইজেটের জন্য সমস্ত পরিবর্তনীয় স্থিতি অনুষ্ঠিত হয়।
রাষ্ট্র ধারণা দুটি জিনিস দ্বারা সংজ্ঞায়িত:
1) উইজেট দ্বারা ব্যবহৃত ডেটা পরিবর্তন হতে পারে।
2) উইজেটটি তৈরি করা হলে ডেটা সমকালীনভাবে পড়া যায় না। (বিল্ড পদ্ধতিটি বলা হওয়ার সাথে সাথে সমস্ত রাজ্য প্রতিষ্ঠিত হতে হবে)।
স্টেটফুল উইজেট জীবনচক্র
জীবনচক্রের নিম্নলিখিত সরলীকৃত পদক্ষেপ রয়েছে:
- ক্রিয়েস্টেট () - যখন স্টার্টফুল উইজেট তৈরির জন্য যখন ফ্লার্টকে নির্দেশ দেওয়া হয়, তখন এটি তত্ক্ষণাত কল করে
createState()
।
@override
_MyState createState() => _MyState();
- মাউন্ট করা == সত্য - সমস্ত উইজেটের একটি বুল
this.mounted
সম্পত্তি রয়েছে। এটি buildContext
বরাদ্দ করা হলে সত্য হয়ে যায় turns setState
উইজেটটি আনমাউন্ট করা হলে কল করা ত্রুটি । এই স্টেট অবজেক্টটি বর্তমানে কোনও গাছে রয়েছে কিনা।
একটি স্টেট অবজেক্ট তৈরি করার পরে এবং কল করার আগে initState
, ফ্রেমওয়ার্কটি রাষ্ট্রের সাথে এটির সাথে যুক্ত করে "বস্তু" চাপায়
BuildContext
। কাঠামো
কল না হওয়া পর্যন্ত স্টেট অবজেক্ট মাউন্ট থাকে dispose()
, এর পরে ফ্রেমওয়ার্ক আর কখনও
রাজ্য অবজেক্টটিকে পুনর্নির্মাণ করতে বলবে না ।
মাউন্ট করা সত্য না হলে সেট স্টেট কল করা ত্রুটি।
bool get mounted => _element != null;
- initState () - উইজেট তৈরি হওয়ার পরে এটি অবশ্যই প্রথম পদ্ধতি বলা হয় (অবশ্যই ক্লাস কনস্ট্রাক্টরের পরে।)
initState
একবার এবং শুধুমাত্র একবার বলা হয়। এটা কল করতে হবেsuper.initState().
ডেটা সূচনা করুন যা উইজেটের তৈরি ইভেন্টের জন্য নির্দিষ্ট বিল্ডকন্টেক্সটে নির্ভর করে।
গাছগুলিতে এই উইজেটগুলি 'পিতামাতার' উপর নির্ভর করে এমন বৈশিষ্ট্যগুলি আরম্ভ করুন।
স্ট্রিম, ChangeNotifiers
বা অন্য কোনও অবজেক্টের সাবস্ক্রাইব করুন যা এই উইজেটের ডেটা পরিবর্তন করতে পারে।
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeD dependency () - যখন এই রাজ্যের অবজেক্টের নির্ভরতা পরিবর্তিত হয় তখনই ডাকা হয়।
এই পদ্ধতিটি সঙ্গে সঙ্গে বলা হয় initState
। BuildContext.inheritFromWidgetOfExactType
এই পদ্ধতি থেকে কল করা নিরাপদ ।
সাবক্লাসগুলি খুব কমই এই পদ্ধতিটিকে ওভাররাইড করে কারণ ফ্রেমওয়ার্ক সর্বদা নির্ভরতা পরিবর্তনের পরে বিল্ডকে কল করে। কিছু উপশ্রেণী এই পদ্ধতিটিকে ওভাররাইড করে কারণ তাদের নির্ভরতা পরিবর্তিত হলে তাদের কিছু ব্যয়বহুল কাজ করা উচিত (যেমন, নেটওয়ার্ক আনতে) এবং সেই কাজটি প্রতিটি বিল্ডের জন্য করা ব্যয়বহুল হবে।
@protected
@mustCallSuper
void didChangeDependencies() { }
- বিল্ড () - উইজেট দ্বারা প্রতিনিধিত্ব করা ব্যবহারকারী ইন্টারফেসের অংশ বর্ণনা করে।
কাঠামোটি বিভিন্ন পদ্ধতিতে এই পদ্ধতিটিকে কল করে:
- ফোন করার পরে
initState
।
- ফোন করার পরে
didUpdateWidget
।
- একটি কল পাওয়ার পরে
setState
।
- এই রাজ্য অবজেক্টের নির্ভরতার পরে (উদাহরণস্বরূপ, পূর্ববর্তী বিল্ড পরিবর্তনের দ্বারা উল্লিখিত একটি উত্তরাধিকারী উইজেট)।
- নিষ্ক্রিয় কল করার পরে এবং তারপরে অন্য কোনও স্থানে স্টেট অবজেক্টটিকে গাছের মধ্যে পুনরায় প্রবেশের পরে।
কাঠামোটি এই পদ্ধতিতে ফিরে আসা উইজেটের সাথে এই উইজেটের নীচে সাবট্রিকে প্রতিস্থাপন করে, হয় বিদ্যমান সাবট্রিকে আপডেট করে অথবা সাবট্রিটি সরিয়ে এবং নতুন সাবট্রি স্ফীত করে, এই পদ্ধতিতে ফিরে আসা উইজেটটি বিদ্যমান সাবট্রির মূল আপডেট করতে পারে কিনা তার উপর নির্ভর করে কল হিসাবে নির্ধারিত
Widget.canUpdate
।
সাধারণত বাস্তবায়নগুলি এই উইজেটের নির্মাতা , প্রদত্ত বিল্ডকন্টেক্সট এবং এই স্টেট অবজেক্টের অভ্যন্তরীণ অবস্থার তথ্য দিয়ে কনফিগার করা উইজেটগুলির একটি নতুন তৈরি নক্ষত্রকে ফিরিয়ে দেয় ।
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget () - উইজেট কনফিগারেশন পরিবর্তন যখনই বলা হয়।
যদি প্যারেন্ট উইজেটটি পুনর্নির্মাণ করে এবং অনুরূপ রানটাইম টাইপ এবং উইজেট.কি সহ নতুন উইজেট প্রদর্শন করার জন্য ট্রি আপডেটে এই অবস্থানটি অনুরোধ করে, তবে ফ্রেমওয়ার্কটি নতুন উইজেটের উল্লেখ করার জন্য এই স্টেট অবজেক্টের উইজেট সম্পত্তি আপডেট করবে এবং তারপরে এটিকে কল করবে আর্গুমেন্ট হিসাবে পূর্ববর্তী উইজেট সহ পদ্ধতি।
উইজেট পরিবর্তন হলে (যেমন, অন্তর্নিহিত অ্যানিমেশনগুলি শুরু করতে) প্রতিক্রিয়া জানাতে এই পদ্ধতিটি ওভাররাইড করুন।
ফ্রেমওয়ার্কটি সর্বদা ডু ইউপডেট উইজেট কল করার পরে বিল্ড কল করে, যার অর্থ ডিডউপডেট উইজেটে সেটস্টেটের কোনও কল রিডানড্যান্ট।
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- সেটস্টেট () - আপনি যখনই কোনও স্টেট অবজেক্টের অভ্যন্তরীণ স্থিতি পরিবর্তন করেন, এমন কোনও ফাংশনে পরিবর্তন করুন যা আপনি পাস করেছেন
setState
:
কল স্টেট স্টেট ফ্রেমওয়ার্কটি সূচিত করে যে এই অবজেক্টের অভ্যন্তরীণ পরিস্থিতি এমন উপায়ে পরিবর্তিত হয়েছে যা এই সাবট্রির ব্যবহারকারীর ইন্টারফেসকে প্রভাবিত করতে পারে, যার ফলে ফ্রেমওয়ার্কটি
এই স্টেট অবজেক্টের জন্য কোনও বিল্ড নির্ধারিত করে ।
আপনি যদি কেবল সেটস্টেটকে কল না করে সরাসরি রাজ্যটি পরিবর্তন করেন তবে ফ্রেমওয়ার্কটি কোনও বিল্ড নির্ধারিত করতে পারে না এবং এই সাবট্রির জন্য ব্যবহারকারী ইন্টারফেসটি নতুন রাষ্ট্রের প্রতিফলনের জন্য আপডেট নাও হতে পারে।
setState(() { _myState = newValue });
- নিষ্ক্রিয় () - গাছ থেকে স্টেট সরিয়ে ফেলা হলে নিষ্ক্রিয় বলা হয়, তবে বর্তমান ফ্রেমের পরিবর্তন শেষ হওয়ার আগে এটি পুনরায় সজ্জিত করা যেতে পারে। এই পদ্ধতিটি মূলত বিদ্যমান কারণ রাজ্য অবজেক্টগুলি গাছের এক বিন্দু থেকে অন্য বিন্দুতে স্থানান্তরিত হতে পারে।
- কাঠামো এই পদ্ধতিটিকে কল করে যখনই এটি গাছ থেকে এই রাজ্য অবজেক্টটিকে সরিয়ে দেয়। কিছু ক্ষেত্রে, কাঠামোটি গাছের অন্য অংশে রাজ্য অবজেক্টটিকে পুনরায় সন্নিবেশ করবে (উদাহরণস্বরূপ, যদি এই রাজ্য অবজেক্টযুক্ত সাবট্রি গাছের এক স্থান থেকে অন্য স্থানে গ্রাফ করা হয়)। যদি এটি হয়, কাঠামোটি নিশ্চিত করবে যে এটি রাজ্যটির বস্তুকে গাছের মধ্যে নতুন অবস্থানে খাপ খাইয়ে নেওয়ার সুযোগ দেয় give যদি কাঠামোটি এই সাবট্রিটিকে পুনরায় সজ্জিত করে তবে এটি অ্যানিমেশন ফ্রেমের সমাপ্তির আগে এটি করবে যেখানে সাবট্রিটি গাছ থেকে সরানো হয়েছিল। এই কারণে, রাষ্ট্রীয় অবজেক্টগুলি যতক্ষণ না ফ্রেমওয়ার্ক তাদের নিষ্পত্তি পদ্ধতিটি কল না করে সর্বাধিক সংস্থানগুলি ছাড়িয়ে দিতে পারে le
এটি খুব কমই ব্যবহৃত হয়।
@protected
@mustCallSuper
void deactivate() { }
- নিষ্পত্তি () - যখন এই বস্তুকে স্থায়ীভাবে গাছ থেকে সরানো হয় তখন কল করা হয়।
ফ্রেমওয়ার্কটি এই পদ্ধতিটিকে কল করে যখন এই রাজ্য অবজেক্টটি আর কখনও তৈরি করে না। ফ্রেমওয়ার্ক কল করার পরে dispose()
, রাজ্য অবজেক্টটিকে আনমাউন্ট হিসাবে বিবেচনা করা হয় এবং মাউন্ট করা সম্পত্তিটি মিথ্যা। এই স্থানে সেটস্টেট কল করা একটি ত্রুটি। জীবনচক্রের এই পর্যায়টি টার্মিনাল: নিষ্পত্তি হয়েছে এমন কোনও রাজ্য অবজেক্টকে পুনঃনির্মাণের কোনও উপায় নেই।
এই অবজেক্টটি ধরে রাখা কোনও সংস্থান (যেমন, কোনও সক্রিয় অ্যানিমেশনগুলি বন্ধ করুন) প্রকাশের জন্য সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করে।
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
আরও তথ্যের জন্য যান এখানে এখানে , এখানে