۱ Hale Asgari
متغیر و کلاس
جامعه فلاتر ایجاد شده در ۳۰ شهریور ۱۴۰۱

سلام.من یک سوال مفهومی در مورد متغیر و کلاسها دارم.

در بخش آموزش دارت برای instance گرفتن از یک کلاس از عباراتی مشابه ;() Car car = Car استفاده میکردیم.

از زمان شروع فلاتر داخل VSCode از عباراتی مشابه ,prefixIcon : Icon(CupertinoIcons.at) برای instance گرفتن مثلا از کلاس Icon استفاده میکنیم

در سمت راست عبارت بالا اگر کلاسمان ورودی constructor داشته باشد داخل پرانتز ورودی را به کلاس میدهیم و اگر از متد یا متغیر کلاس خواستیم استفاده کنیم از دات در انتهای نام کلاس استفاده میکینم.

یک : لطفا بفرمایید تا اینجا درست گفتم؟

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

دو : این () که بدون اسم مینویسیم به چه معناست مثل کد زیر:

 myOnTap: () {
                        updateSelectedSkill(_SkillType.photoshop);
                      },

سه : چرا updateSelectedSkill را مستقیم به myOnTap نداد مثل بقیه موارد؟ هر دو myOnTap و updateSelectedSkill در کلاس MyHomePageState_ هستند. چرا مثل زیر ننوشت :

 myOnTap: updateSelectedSkill(_SkillType.photoshop);
            

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

چهار: برای استفاده از متغیرهای یک کلاس در کلاس دیگر:

مثلا متغیر surfaceColor داخل کلاس MyApp تعریف شده است (private هم نیست)  :

class MyApp extends StatelessWidget {
 const MyApp({Key? key}) : super(key: key);
 
 // This widget is the root of your application.
 @override
 Widget build(BuildContext context) {
  
  Color surfaceColor = Color(0x0dffffff);
  return MaterialApp(
   title: 'Flutter Demo',
 

حال اگر بخواهیم داخل کلاس MyHomePageState_ از متغیر surfaceColor استفاده کنیم، امکان استفاده مستقیم نیست و اول باید یک instance از کلاس MyApp بگیریم تا به متعیرهای آن دسترسی داشته باشیم:

class _MyHomePageState extends State<MyHomePage> {
.
.
.
TextField(
          decoration: InputDecoration(
           prefixIcon : Icon(CupertinoIcons.at),
           labelText: 'Email',
           filled: true,
           fillColor: MyApp.surfaceColor
 

 

پس چرا به صورت fillColor: MyApp.surfaceColor دسترسی نداریم؟

مگر این خط یک نمونه گرفتن از کلاس MyApp و دستیابی به متغیرش نیست؟

سلام. وقت شما بخیر

مورد 1: بله، درسته.

مورد2: فیلد myOnTap یک function دریافت میکنه، که این function در اینجا پارامتر ورودی دریافت نمیکنه (در جاهای دیگه ممکنه ورودی داشته باشه). () هم برای دریافت ورودی هاست که چون اینجا ورودی نداره، پرانتر خالی هست.

مورد3: ضمن اشاره به توضیحات مورد2، در این مورد هر دو حالتی که نوشتید درست هستند.

مورد4: به طور کلی این روش که شما از یک widget نمونه بسازید که به رنگی که اونجا تعریف شده دسترسی پیدا کنید صحیح نیست. علاوه بر اون، این شیوه دسترسی به متغیر (MyApp.surfaceColor) زمانی درست هست که surfaceColor متغیر کلاس شما باشه و به صورت static تعریف شده باشه. اما در کد شما surfaceColor یک متغیر است که صرفاً در تابع build قابل دسترسی و تعریف شده است. در مورد scope‌ها مطالعاتی داشته باشید.

نکته دیگه اینکه، برای نمونه گرفتن از یک کلاس باید سازنده اون کلاس فراخوانی بشه (مشابه مورد 1 که گفتید). همچنین برای موارد این چنینی مثل رنگ‌های پروژه، تم، فونت و.. در صورتی که قصد دارید در جاهای مختلف ازش استفاده کنید، باید به صورت global(سراسری) تعریف بشن. البته اگه بخواید کدتون تمیزتر باشه بهتره که در یک کلاس جدا مثلاً تحت عنوان AppColors (یا هر اسم مناسبی) اون‌ها رو تعریف کنید.

بهترین پاسخ
یلدا محصلی ۳۰ شهریور ۱۴۰۱، ۰۹:۱۶