در مقالهی قبل، برخی مفاهیم پایه در رابطه با ویجتها را بررسی کردیم. در این مقاله به شرح و بررسی چرخهی حیات ویجتها در فلاتر میپردازیم.
فرایند ایجاد و بروزرسانی ویجتها، بارها و بارها در طول اجرای برنامه توسط فلاتر انجام میشود. بسته به نوع ویجت (Stateless یا Stateful)، متدهای متفاوتی اجرا خواهند شد اما چیزی که ثابت است این است که ما همیشه از فلاتر (به وسیلهی callback) نوتیفیکیشن دریافت میکنیم و این به ما کمک میکند تا رفتار ویجت را سفارشی کنیم. در ادامه چرخهی حیات هر یک از انواع ویجت را بررسی خواهیم کرد.
ویجتهای Stateless
متدهایی که در هنگام مدیریت ویجتهای Stateless فراخوانی میشوند سرراست هستند:
1- برای شروع، سازندهی ویجت فراخوانی میشود.
2- پس از اینکه سازنده اجرا شد، متد ()build بصورت خودکار توسط سیستم صدا زده میشود. این متد یک عنصر بصری جدید برمیگرداند که به درخت ویجت (در موقعیتی که آبجکت BuildContext که به عنوان پارامتر ورودی دریافت شده است، مشخص میکند) اضافه میشود .
class MyWidget extends StatelessWidget { //XXX: called 1st... MyWidget(); //XXX: called 2nd... @override Widget build(BuildContext cntxt) { return Row(...); } }
در نتیجه نمودار توالی ساده و به صورت زیر است:
ویجت های Stateful
class MyOtherWidget extends StatefulWidget { MyOtherWidget(); @override State createState() { return _MyOtherWidgetState(); } } class _MyOtherWidgetState extends State<MyOtherWidget> { ... }
به خاطر داشته باشید که ویجتهای Stateful همواره دارای state (داده های پویایی که در طول زمان حیات ویجت آپدیت می شوند) هستند بنابراین به یک کلاس جدید نیاز است که آن را کپسوله سازی کند.
کلاس state که همواره از <>State ارث بری می کند، نوع ویجت را به عنوان یک پارامتر generic دریافت میکند. علاوه بر این، ویجت وابسته از طریق مشخصهی widget در این کلاس قابل دسترسی است.
با این توضیح، نمودار این سناریو واضح خواهد بود:
اگر این نمودار را با نمودار قبل مقایسه کنید حتما این سوال برای شما پیش می آید که چه کسی مسئول ایجاد ویو برای ویجت خواهد یود؟ چون در حال حاضر فقط یک آبجکت state را ایجاد کرده ایم.
آبجکت State
آبجکتهای State حاوی چندین متد در چرخهی حیات خود هستند که یکی از آنها همان دوست قدیمی، متد ()build است:
class _MyOtherWidgetState extends State<MyOtherWidget> { @override Widget build(BuildContext cntxt) { return Column(...); } }
بنابراین آبجکتهای State در حقیقت مسئول ساخت واسط کاربری ویجتهای وابسته به خود هستند. گرچه این ممکن است در ابتدا عجیب به نظر برسد، در نظر داشته باشید که آبجکت های State:
اینطور به موضوع نگاه کنید که تصمیم گیری در مورد چگونگی نمایش داده را انجام میدهند. برای مثال، وقتی یک آبجکت State یک مجموعه داده از اطلاعات کاربران را نگهداری میکند باید مشخص کند که واسط کاربری آن بصورت یک لیست است یا جدول.
جریان اجرا در چرخه حیات آبجکت state با فراخوانی متدها (یا callbackهای) زیر شکل میگیرد:
نکته: اگر از مخزن داده استفاده کرده باشید، این متد هر گاه دادهی جدیدی منتشر شود فراخوانی خواهد شد. این یعنی بر خلاف ()initState این متد ممکن است بارها فراخوانی شود.
برای ویجت Stateful جریانهای اجرای دیگری هم ممکن است اتفاق بیفتد:
اگر تمامی جریان های اجرا را در کنار هم بگذاریم و State های داخلی را هم درنظر بگیریم نمودار زیر را خواهیم داشت:
جمعبندی