Flutter Tutorial
Flutter Tutorial
.1ﻣﻘﺪﻣﺔ
ﺳﻨﺘﻌﻠﻢ ﻓﻲ ھﺬه اﻟﻤﺎدة اﻟﺘﻌﻠﯿﻤﯿﺔ اﻟﻤﻔﺎھﯿﻢ اﻷﺳﺎﺳﯿﺔ واﻟﻤﺘﻘﺪﻣﺔ ﻹطﺎر ﻋﻤﻞ .Flutterﺗﻢ اﻹﻋﻼن ﻋﻦ اﻹﺻﺪار اﻷول ﻣﻦ Flutterﻓﻲ ﻋﺎم 2015ﻓﻲ ﻗﻤﺔ
.Dart Developer Summitﻛﺎن ﯾُﻌﺮف ﻓﻲ اﻟﺒﺪاﯾﺔ ﺑﺎﺳﻢ codename Skyوﯾﻤﻜﻦ ﺗﺸﻐﯿﻠﮫ ﻋﻠﻰ ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ .Android OSﻓﻲ دﯾﺴﻤﺒﺮ
،2018ﺗﻢ إﺻﺪار أول ﻧﺴﺨﺔ ﻣﺴﺘﻘﺮة ﻣﻦ إطﺎر ﻋﻤﻞ ،Flutterﻋﺮﻓﺖ ب .Flutter 1.0
ﻣﺎ ھﻮ Flutter؟
ھﻨﺎك اﻟﻌﺪﯾﺪ ﻣﻦ اﻷطﺮ ) (Frameworksاﻟﻤﺘﺎﺣﺔ ،واﻟﺘﻲ ﺗﻮﻓﺮ ﻣﯿﺰات ﻣﻤﺘﺎزة ﻟﺘﻄﻮﯾﺮ ﺗﻄﺒﯿﻘﺎت اﻟﮭﺎﺗﻒ اﻟﻤﺤﻤﻮل .ﯾﻮﻓﺮ Androidإطﺎر ﻋﻤﻞ أﺻﻠﯿًﺎ
إطﺎرا ﯾﻌﺘﻤﺪ ﻋﻠﻰ ﻟﻐﺔ .Objective-C / Swiftوﺑﺎﻟﺘﺎﻟﻲ ،ﻧﺤﺘﺎج إﻟﻰ ﻟﻐﺘﯿﻦ وأطﺮ ﻋﻤﻞ ﻣﺨﺘﻠﻔﺔ
ً ﯾﻌﺘﻤﺪ ﻋﻠﻰ ﻟﻐﺔ Javaو ،Kotlinﺑﯿﻨﻤﺎ ﯾﻮﻓﺮ iOS
ﻟﺘﻄﻮﯾﺮ اﻟﺘﻄﺒﯿﻘﺎت ﻟﻜﻼ ﻧﻈﺎﻣﻲ اﻟﺘﺸﻐﯿﻞ .ﻟﻘﺪ ﺗﻢ اﻟﺘﻐﻠﺐ ﻋﻠﻰ ھﺬا اﻟﺘﻌﻘﯿﺪ ﻋﺒﺮ ﺗﻘﺪﯾﻢ اﻟﻌﺪﯾﺪ ﻣﻦ اﻷطﺮ اﻟﺘﻲ ﺗﺪﻋﻢ ﻧﻈﺎﻣﻲ اﻟﺘﺸﻐﯿﻞ ﺟﻨﺒًﺎ إﻟﻰ ﺟﻨﺐ ﻣﻊ ﺗﻄﺒﯿﻘﺎت
ﺳﻄﺢ اﻟﻤﻜﺘﺐ .ﺗُﻌﺮف ھﺬه اﻷﻧﻮاع ﻣﻦ اطﺮ اﻟﻌﻤﻞ ﺑﺄدوات اﻟﺘﻄﻮﯾﺮ ﻋﺒﺮ اﻷﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ ).(cross-platform
ﯾﺘﻤﺘﻊ إطﺎر اﻟﺘﻄﻮﯾﺮ ﻋﺒﺮ اﻷﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ ) (cross-platform development toolsﺑﺎﻟﻘﺪرة ﻋﻠﻰ ﻛﺘﺎﺑﺔ رﻣﺰ واﺣﺪ وﯾﻤﻜﻦ ﻧﺸﺮه ﻋﻠﻰ اﻷﻧﻈﻤﺔ
اﻷﺳﺎﺳﯿﺔ اﻟﻤﺨﺘﻠﻔﺔ ) Androidو iOSو .(Desktopﺣﯿﺚ ﯾﻮﻓﺮ اﻟﻜﺜﯿﺮ ﻣﻦ اﻟﻮﻗﺖ واﻟﺠﮭﺪ ﻟﻠﻤﻄﻮرﯾﻦ .ھﻨﺎك اﻟﻌﺪﯾﺪ ﻣﻦ اﻷدوات اﻟﻤﺘﺎﺣﺔ ﻟﻠﺘﻄﻮﯾﺮ ﻋﺒﺮ
اﻷﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ ،ﺑﻤﺎ ﻓﻲ ذﻟﻚ اﻷدوات اﻟﻤﺴﺘﻨﺪة إﻟﻰ اﻟﻮﯾﺐ ،ﻣﺜﻞ Ionicﻣﻦ .Drifty Coﻓﻲ Phonegap ،2013ﻣﻦ Xamarin ،Adobeﻣﻦ
،Microsoftو .Native form Facebook Reactﻛﻞ ﻣﻦ ھﺬه اﻷطﺮ ﻟﮭﺎ درﺟﺎت ﻣﺘﻔﺎوﺗﺔ ﻣﻦ اﻟﻨﺠﺎح ﻓﻲ ﺻﻨﺎﻋﺔ اﻟﮭﺎﺗﻒ اﻟﻤﺤﻤﻮل .ﻓﻲ اﻵوﻧﺔ
اﻷﺧﯿﺮة ،ﺗﻢ ﺗﻘﺪﯾﻢ إطﺎر ﻋﻤﻞ ﺟﺪﯾﺪ ﻓﻲ ﻋﺎﺋﻠﺔ اﻟﺘﻄﻮﯾﺮ ﻋﺒﺮ اﻷﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ اﻟﻤﺴﻤﻰ Flutterاﻟﺬي ﺗﻢ ﺗﻄﻮﯾﺮه ﻣﻦ .Google
Flutterﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ أدوات ﻟﻮاﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم ﻹﻧﺸﺎء ﺗﻄﺒﯿﻘﺎت ﺳﺮﯾﻌﺔ وﺟﻤﯿﻠﺔ وﻣﺠﻤﻌﺔ ﻣﺤﻠﯿًﺎ ﻟﻠﺠﻮال واﻟﻮﯾﺐ وﺳﻄﺢ اﻟﻤﻜﺘﺐ ﺑﻠﻐﺔ ﺑﺮﻣﺠﺔ
واﺣﺪة وﻗﺎﻋﺪة ﺷﻔﺮة واﺣﺪة .اﻧﮫ ﻣﺼﺪر ﻣﺠﺎﻧﻲ وﻣﻔﺘﻮح .ﺗﻢ ﺗﻄﻮﯾﺮه ﻓﻲ اﻟﺒﺪاﯾﺔ ﻣﻦ Googleوﯾﺘﻢ إدارﺗﮫ اﻵن وﻓﻘًﺎ ﻟﻤﻌﯿﺎر .ECMAﺗﺴﺘﺨﺪم ﺗﻄﺒﯿﻘﺎت
Flutterﻟﻐﺔ ﺑﺮﻣﺠﺔ Dartﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ .ﺗﺸﺘﺮك ﺑﺮﻣﺠﺔ dartﻓﻲ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﻤﯿﺰات ﻣﻊ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻷﺧﺮى ،ﻣﺜﻞ Kotlinو ،Swiftوﯾﻤﻜﻦ
ﺗﺤﻮﯾﻠﮭﺎ إﻟﻰ ﻛﻮد .JavaScript
ﻀﺎ اﺳﺘﺨﺪاﻣﮫ
ﺗﻢ ﺗﺤﺴﯿﻦ Flutterﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻟﺘﻄﺒﯿﻘﺎت اﻟﮭﺎﺗﻒ اﻟﻤﺤﻤﻮل ﺛﻨﺎﺋﯿﺔ اﻷﺑﻌﺎد اﻟﺘﻲ ﯾﻤﻜﻦ ﺗﺸﻐﯿﻠﮭﺎ ﻋﻠﻰ أﻧﻈﻤﺔ Androidو .iOSﯾﻤﻜﻨﻨﺎ أﯾ ً
ﻹﻧﺸﺎء ﺗﻄﺒﯿﻘﺎت ﻛﺎﻣﻠﺔ اﻟﻤﯿﺰات ،ﺑﻤﺎ ﻓﻲ ذﻟﻚ اﻟﻜﺎﻣﯿﺮا ،واﻟﺘﺨﺰﯾﻦ ،واﻟﻤﻮﻗﻊ اﻟﺠﻐﺮاﻓﻲ ،واﻟﺸﺒﻜﺔ ،وأدوات ﺗﻄﻮﯾﺮ اﻟﺒﺮاﻣﺞ ) (SDKاﻟﺘﺎﺑﻌﺔ ﻟﺠﮭﺎت
ﺧﺎرﺟﯿﺔ ،واﻟﻤﺰﯾﺪ.
ﻣﻔﺘﻮح اﻟﻤﺼﺪر Flutter :ھﻮ إطﺎر ﻋﻤﻞ ﻣﺠﺎﻧﻲ وﻣﻔﺘﻮح اﻟﻤﺼﺪر ﻟﺘﻄﻮﯾﺮ ﺗﻄﺒﯿﻘﺎت اﻟﮭﺎﺗﻒ اﻟﻤﺤﻤﻮل.
ﻋﺎﺑﺮ ﻟﻸﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ ) :(Cross-platformﺗﺴﻤﺢ ھﺬه اﻟﻤﯿﺰة ﻟـ Flutterﺑﻜﺘﺎﺑﺔ اﻟﺸﻔﺮة ﻣﺮة واﺣﺪة واﻟﺤﻔﺎظ ﻋﻠﯿﮭﺎ وﺗﺸﻐﯿﻠﮭﺎ ﻋﻠﻰ أﻧﻈﻤﺔ
أﺳﺎﺳﯿﺔ ﻣﺨﺘﻠﻔﺔ .إﻧﮫ ﯾﻮﻓﺮ اﻟﻮﻗﺖ واﻟﺠﮭﺪ واﻟﻤﺎل ﻟﻠﻤﻄﻮرﯾﻦ.
ﺳﺮﯾﻊ اﻟﺘﻔﺎﻋﻞ ) :(Hot Reloadﻋﻨﺪﻣﺎ ﯾﻘﻮم اﻟﻤﻄﻮر ﺑﺈﺟﺮاء ﺗﻐﯿﯿﺮات ﻓﻲ اﻟﻜﻮد ،ﯾﻤﻜﻦ رؤﯾﺔ ھﺬه اﻟﺘﻐﯿﯿﺮات ﻋﻠﻰ اﻟﻔﻮر ﺑﺎﺳﺘﺨﺪام Hot
.Reloadھﺬا ﯾﻌﻨﻲ اﻟﺘﻐﯿﯿﺮات اﻟﺘﻲ ﺗﻈﮭﺮ ﻋﻠﻰ اﻟﻔﻮر ﻓﻲ اﻟﺘﻄﺒﯿﻖ ﻧﻔﺴﮫ .إﻧﮭﺎ ﻣﯿﺰة ﻣﻔﯿﺪة ﻟﻠﻐﺎﯾﺔ ،ﺗﺘﯿﺢ ﻟﻠﻤﻄﻮر إﺻﻼح اﻷﺧﻄﺎء ﻋﻠﻰ اﻟﻔﻮر.
:Accessible Native Features and SDKsﺗﺘﯿﺢ ھﺬه اﻟﻤﯿﺰة ﻋﻤﻠﯿﺔ ﺗﻄﻮﯾﺮ اﻟﺘﻄﺒﯿﻖ ﺳﮭﻠﺔ وﻣﻤﺘﻌﺔ ﻣﻦ ﺧﻼل اﻟﻜﻮد اﻷﺻﻠﻲ ﻟـ
، Flutterوﺗﻜﺎﻣﻞ اﻟﺠﮭﺎت اﻟﺨﺎرﺟﯿﺔ ،وواﺟﮭﺎت ﺑﺮﻣﺠﺔ ﺗﻄﺒﯿﻘﺎت اﻟﻨﻈﺎم اﻷﺳﺎﺳﻲ .وﺑﺎﻟﺘﺎﻟﻲ ،ﯾﻤﻜﻨﻨﺎ اﻟﻮﺻﻮل ﺑﺴﮭﻮﻟﺔ إﻟﻰ ﺣﺰم SDKﻋﻠﻰ
ﻛﻼ اﻟﻨﻈﺎﻣﯿﻦ اﻷﺳﺎﺳﯿﯿﻦ.
:Minimal codeﺗﻢ ﺗﻄﻮﯾﺮ ﺗﻄﺒﯿﻖ Flutterﺑﻮاﺳﻄﺔ ﻟﻐﺔ ﺑﺮﻣﺠﺔ ، Dartواﻟﺘﻲ ﺗﺴﺘﺨﺪم ﺗﺠﻤﯿﻊ (Just in time) JITو Ahead ) AOT
(of Timeﻟﺘﺤﺴﯿﻦ وﻗﺖ ﺑﺪء اﻟﺘﺸﻐﯿﻞ اﻟﻜﻠﻲ وﻋﻤﻠﮫ وﺗﺴﺮﯾﻊ اﻷداء .ﯾﻌﻤﻞ JITﻋﻠﻰ ﺗﺤﺴﯿﻦ ﻧﻈﺎم اﻟﺘﻄﻮﯾﺮ وﺗﺤﺪﯾﺚ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم دون
ﺑﺬل ﺟﮭﺪ إﺿﺎﻓﻲ ﻓﻲ ﺑﻨﺎء واﺣﺪة ﺟﺪﯾﺪة.
:Widgetsﯾﻮﻓﺮ إطﺎر ﻋﻤﻞ Flutterﻋﻨﺎﺻﺮ واﺟﮭﺔ ﻣﺴﺘﺨﺪم ) (widgetsﻗﺎدرة ﻋﻠﻰ ﺗﻄﻮﯾﺮ ﺗﺼﻤﯿﻤﺎت ﻣﺤﺪدة ﻗﺎﺑﻠﺔ ﻟﻠﺘﺨﺼﯿﺺ .اﻷھﻢ
ﻣﻦ ذﻟﻚ ،ﯾﺤﺘﻮي Flutterﻋﻠﻰ ﻣﺠﻤﻮﻋﺘﯿﻦ ﻣﻦ (Cupertino widgets- Material Design) widgetsاﻟﺘﻲ ﺗﺴﺎﻋﺪ ﻋﻠﻰ ﺗﻮﻓﯿﺮ ﺗﺠﺮﺑﺔ
ﺧﺎﻟﯿﺔ ﻣﻦ اﻷﺧﻄﺎء ﻋﻠﻰ ﺟﻤﯿﻊ اﻷﻧﻈﻤﺔ اﻷﺳﺎﺳﯿﺔ.
ﻋﯿﻮب Flutter
ﻟﻘﺪ رأﯾﻨﺎ ﺳﺎﺑﻘًﺎ أن Flutterﻟﮭﺎ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﻤﺰاﯾﺎ ،وﻟﻜﻨﮭﺎ ﺗﺤﺘﻮي أﯾ ً
ﻀﺎ ﻋﻠﻰ ﺑﻌﺾ اﻟﻌﯿﻮب ،واﻟﺘﻲ ﺗﺮد أدﻧﺎه.
Flutterھﻲ ﻟﻐﺔ ﺟﺪﯾﺪة ﻧﺴﺒﯿًﺎ ﺗﺤﺘﺎج إﻟﻰ دﻋﻢ ﺗﻜﺎﻣﻞ ﻣﺴﺘﻤﺮ ﻣﻦ ﺧﻼل ﺻﯿﺎﻧﺔ اﻟﺒﺮاﻣﺞ اﻟﻨﺼﯿﺔ.
ً
وﺻﻮﻻ ﻣﺤﺪودًا ﺟﺪًا إﻟﻰ ﻣﻜﺘﺒﺎت .SDKھﺬا ﯾﻌﻨﻲ أن اﻟﻤﻄﻮر ﻟﯿﺲ ﻟﺪﯾﮫ اﻟﻜﺜﯿﺮ ﻣﻦ اﻟﻮظﺎﺋﻒ ﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ ﺟﻮال .ﯾﺠﺐ ﺗﻄﻮﯾﺮ ﯾﻮﻓﺮ
ﻣﺜﻞ ھﺬه اﻷﻧﻮاع ﻣﻦ اﻟﻮظﺎﺋﻒ ﺑﻮاﺳﻄﺔ ﻣﻄﻮر Flutterأﻧﻔﺴﮭﻢ.
ﺗﻄﺒﯿﻘﺎت Flutterﻻ ﺗﺪﻋﻢ اﻟﻤﺘﺼﻔﺢ .إﻧﮫ ﯾﺪﻋﻢ ﻓﻘﻂ أﻧﻈﻤﺔ Androidو.iOS
ﯾﺴﺘﺨﺪم ﺑﺮﻣﺠﺔ Dartﻟﻠﺘﺮﻣﯿﺰ ،ﻟﺬﻟﻚ ﯾﺤﺘﺎج اﻟﻤﻄﻮر إﻟﻰ ﺗﻌﻠﻢ ﺗﻘﻨﯿﺎت ﺟﺪﯾﺪة .وﻣﻊ ذﻟﻚ ،ﻣﻦ اﻟﺴﮭﻞ اﻟﺘﻌﻠﻢ ﻟﻠﻤﻄﻮرﯾﻦ.
Operating System Windows 7 or Later (I am Windows 10. You can also use Mac or Linux OS.).
Disk Space 400 MB (It does not include disk space for IDE/tools).
ﺗﻨﺰﯾﻞ Git
ﺗﻨﺰﯾﻞFlutter SDK
اﻟﺨﻄﻮة :1ﻗﻢ ﺑﺘﻨﺰﯾﻞ ﺣﺰﻣﺔ اﻟﺘﺜﺒﯿﺖ اﻟﺨﺎﺻﺔ ﺑـ Flutter Software Development Kitﻟﻨﻈﺎم اﻟﺘﺸﻐﯿﻞ .windowsﻟﺘﻨﺰﯾﻞ ،Flutter SDK
اﻧﺘﻘﻞ إﻟﻰ ﻣﻮﻗﻌﮫ اﻟﺮﺳﻤﻲ ،واﻧﻘﺮ ﻋﻠﻰ زر ،Get startedوﺳﺘﺤﺼﻞ ﻋﻠﻰ اﻟﺸﺎﺷﺔ اﻟﺘﺎﻟﯿﺔ.
اﻟﺨﻄﻮة :2ﻟﺘﻨﺰﯾﻞ أﺣﺪث إﺻﺪار ﻣﻦ ،Flutter SDKاﻧﻘﺮ ﻓﻮق رﻣﺰ .Windowsﺳﺘﺠﺪ ھﻨﺎ راﺑﻂ اﻟﺘﻨﺰﯾﻞ ﻟـ .SDK
اﻟﺨﻄﻮة :3ﻋﻨﺪ اﻛﺘﻤﺎل اﻟﺘﻨﺰﯾﻞ ،اﺳﺘﺨﺮج اﻟﻤﻠﻒ اﻟﻤﻀﻐﻮط zipوﺿﻌﮫ ﻓﻲ ﻣﺠﻠﺪ أو اﻟﻤﻮﻗﻊ اﻟﻤﻄﻠﻮب ،ﻣﺜﺎﻻ.D: / Flutter ،
اﻟﺨﻄﻮة :4ﻟﺘﺸﻐﯿﻞ أﻣﺮ Flutterﻓﻲ وﺣﺪة ﺗﺤﻜﻢ Windowsاﻻﻋﺘﯿﺎدﯾﺔ ) ،(windows consoleﺗﺤﺘﺎج إﻟﻰ ﺗﺤﺪﯾﺚ ﻣﺴﺎر اﻟﻨﻈﺎم ﻟﺘﻀﻤﯿﻦ دﻟﯿﻞ
اﻟﻤﺠﻠﺪ binل .Flutterاﻟﺨﻄﻮات اﻟﺘﺎﻟﯿﺔ ﻣﻄﻠﻮﺑﺔ ﻟﻠﻘﯿﺎم ﺑﺬﻟﻚ:
.1اﻧﺘﻘﻞ إﻟﻰ ﺧﺼﺎﺋﺺ <- MyComputerﻋﻼﻣﺔ اﻟﺘﺒﻮﯾﺐ اﻟﻤﺘﻘﺪﻣﺔ <-ﻣﺘﻐﯿﺮات اﻟﺒﯿﺌﺔ .ﺳﻮف ﺗﺤﺼﻞ ﻋﻠﻰ اﻟﺸﺎﺷﺔ اﻟﺘﺎﻟﯿﺔ.
).(MyComputer properties -> advanced tab -> environment variables
.2اﻵن ،ﺣﺪد اﻟﻤﺴﺎر <-اﻧﻘﺮ ﻓﻮق ﺗﺤﺮﯾﺮ ) .(select path -> click on editﺗﻈﮭﺮ اﻟﺸﺎﺷﺔ اﻟﺘﺎﻟﯿﺔ.
.3ﻓﻲ اﻟﻨﺎﻓﺬة أﻋﻼه ،اﻧﻘﺮ ﻓﻮق ﺟﺪﯾﺪ <-ﻛﺘﺎﺑﺔ ﻣﺴﺎر ﻣﺠﻠﺪ Flutter binﺑﻘﯿﻤﺔ ﻣﺘﻐﯿﺮة <-ﻣﻮاﻓﻖ <-ﻣﻮاﻓﻖ <-ﻣﻮاﻓﻖ.
ﺗﻘﺮﯾﺮا ﻋﻦ ﺣﺎﻟﺔ
ً اﻟﺨﻄﻮة :5اﻵن ،ﻗﻢ ﺑﺘﺸﻐﯿﻞ اﻷﻣﺮ .flutter doctor $ﯾﺘﺤﻘﻖ ھﺬا اﻷﻣﺮ ﻣﻦ ﺟﻤﯿﻊ ﻣﺘﻄﻠﺒﺎت ﺗﻄﻮﯾﺮ ﺗﻄﺒﯿﻖ Flutterوﯾﻌﺮض
ﺗﺜﺒﯿﺖ .Flutter
اﻟﺨﻄﻮة :6ﻋﻨﺪ ﺗﺸﻐﯿﻞ اﻷﻣﺮ أﻋﻼه ،ﺳﯿﻘﻮم ﺑﺘﺤﻠﯿﻞ اﻟﻨﻈﺎم وإظﮭﺎر ﺗﻘﺮﯾﺮه ،ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه .ﺳﺘﺠﺪ ھﻨﺎ ﺗﻔﺎﺻﯿﻞ ﺟﻤﯿﻊ اﻷدوات
اﻟﻤﻔﻘﻮدة واﻟﻤﻄﻠﻮﺑﺔ ﻟﺘﺸﻐﯿﻞ Flutterﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ أدوات اﻟﺘﻄﻮﯾﺮ اﻟﻤﺘﻮﻓﺮة وﻟﻜﻨﮭﺎ ﻏﯿﺮ ﻣﺘﺼﻠﺔ ﺑﺎﻟﺠﮭﺎز.
اﻟﺨﻄﻮة :7ﻗﻢ ﺑﺘﺜﺒﯿﺖ .Android SDKإذا ﻟﻢ ﯾﻌﺜﺮ أﻣﺮ flutter doctorﻋﻠﻰ أداة Android SDKﻓﻲ ﻧﻈﺎﻣﻚ ،ﻓﺄﻧﺖ ﺑﺤﺎﺟﺔ أوﻻً إﻟﻰ ﺗﺜﺒﯿﺖ
.Android Studio IDEﻟﺘﺜﺒﯿﺖ ،Android Studio IDEﻗﻢ ﺑﺎﻟﺨﻄﻮات اﻟﺘﺎﻟﯿﺔ.
.1ﻗﻢ ﺑﺘﻨﺰﯾﻞ أﺣﺪث إﺻﺪار ﻣﻦ Android Studioاﻟﻘﺎﺑﻞ ﻟﻠﺘﻨﻔﯿﺬ أو ﻣﻠﻒ ﻣﻀﻐﻮط ﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺮﺳﻤﻲ.
.2ﻋﻨﺪ اﻛﺘﻤﺎل اﻟﺘﻨﺰﯾﻞ ،اﻓﺘﺢ ﻣﻠﻒ .exeوﻗﻢ ﺑﺘﺸﻐﯿﻠﮫ .ﺳﻮف ﺗﺤﺼﻞ ﻋﻠﻰ ﻣﺮﺑﻊ اﻟﺤﻮار اﻟﺘﺎﻟﻲ.
.3اﺗﺒﻊ ﺧﻄﻮات ﻣﻌﺎﻟﺞ اﻟﺘﺜﺒﯿﺖ .ﺑﻤﺠﺮد اﻛﺘﻤﺎل ﻣﻌﺎﻟﺞ اﻟﺘﺜﺒﯿﺖ ،ﺳﺘﻈﮭﺮ ﻟﻚ اﻟﺸﺎﺷﺔ اﻟﺘﺎﻟﯿﺔ.
.4ﻓﻲ اﻟﺸﺎﺷﺔ أﻋﻼه ،اﻧﻘﺮ ﻓﻮق اﻟﺘﺎﻟﻲ <-إﻧﮭﺎء .ﺑﻤﺠﺮد اﻟﻨﻘﺮ ﻓﻮق اﻟﺰر "إﻧﮭﺎء" ،ﺗﺤﺘﺎج إﻟﻰ ﺗﺤﺪﯾﺪ ﺧﯿﺎر "ﻋﺪم اﺳﺘﯿﺮاد اﻹﻋﺪادات" واﻟﻨﻘﺮ ﻓﻮق
"ﻣﻮاﻓﻖ" .ﺳﯿﺒﺪأ .Android Studio
اﻟﺨﻄﻮة :8ﺑﻌﺪ ذﻟﻚ ،ﺗﺤﺘﺎج إﻟﻰ إﻋﺪاد ﻣﺤﺎﻛﻲ .Androidوھﻲ ﻣﺴﺆوﻟﺔ ﻋﻦ ﺗﺸﻐﯿﻞ واﺧﺘﺒﺎر ﺗﻄﺒﯿﻖ .Flutter
اﻟﺨﻄﻮة :2اﻧﻘﺮ ﻋﻠﻰ )Settings iconﻛﻤﺎ ﻣﻮﺿﺢ ﻓﻲ اﻟﺼﻮرة أﻋﻼه ﺑﺎﻟﺴﮭﻢ اﻷﺣﻤﺮ( ﺳﺘﻈﮭﺮ ﻗﺎﺋﻤﺔ ﻛﻤﺎ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه ﻧﺨﺘﺎر Extension
settingsاﻟﻤﻮﺿﺤﺔ ﺑﺎﻟﻤﺮﺑﻊ اﻷﺣﻤﺮ.
اﻻن ﺳﻮف ﺗﺤﺼﻞ ﻋﻠﻰ اﻷﺟﮭﺰة اﻻﻓﺘﺮاﺿﯿﺔ اﻟﻤﺘﻮﻓﺮة ﻟﻚ ﻣﻦ اﺟﻞ اﻟﻌﻤﻞ ﻣﻦ ﺧﻼل اﻟﻨﻘﺮ ﻋﻠﻰ اﻟﺰر اﻟﻤﻮﺿﺢ ادﻧﺎه
اﻟﺨﻄﻮة :9اﻵن ،ﻗﻢ ﺑﺘﺜﺒﯿﺖ اﻟﻤﻜﻮن اﻹﺿﺎﻓﻲ Flutter and Dartﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ Flutterﻓﻲ Android Studioأو .visual studio code
ﺧﯿﺎرا ﻟﺘﺸﻐﯿﻞ ﺗﻄﺒﯿﻖ Flutterوﺗﺼﺤﯿﺤﮫ .ﻗﻢ ﺑﺎﻟﺨﻄﻮات اﻟﺘﺎﻟﯿﺔ ﻟﺘﺜﺒﯿﺖ ھﺬه
ً ﺗﻮﻓﺮ ھﺬه اﻟﻤﻜﻮﻧﺎت اﻹﺿﺎﻓﯿﺔ ﻧﻤﻮذ ًﺟﺎ ﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ ،Flutterوﺗﻮﻓﺮ
اﻟﻤﻜﻮﻧﺎت اﻹﺿﺎﻓﯿﺔ.
.1اﻓﺘﺢ رﻣﺰ VSﺛﻢ اﻧﺘﻘﻞ إﻟﻰ .Extensions
اﻵن ،اﺑﺤﺚ ﻓﻲ اﻟﻤﻜﻮن اﻹﺿﺎﻓﻲ .Flutterإذا وﺟﺪت ،ﺣﺪد Flutterواﻧﻘﺮ ﻓﻮق ﺗﺜﺒﯿﺖ .ﻋﻨﺪ اﻟﻨﻘﺮ ﻓﻮق ﺗﺜﺒﯿﺖ ،ﺳﯿﻄﻠﺐ ﻣﻨﻚ ﺗﺜﺒﯿﺖ ﻣﻠﺤﻖ .2
،Dartاﻧﻘﺮ ﻓﻮق ﻧﻌﻢ ﻟﻠﻤﺘﺎﺑﻌﺔ.
.3ﻟﻐﺔ Dart
1.3ﻣﺎ ھﻲ Dart Programming؟
Dartھﻲ ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﻣﻔﺘﻮﺣﺔ اﻟﻤﺼﺪر ﻟﻸﻏﺮاض اﻟﻌﺎﻣﺔ و ﻣﻮﺟﮭﺔ ﻟﻠﻜﺎﺋﻨﺎت ،ﯾﺘﻢ ﺑﻨﺎء اﻟﺠﻤﻞ ﻓﯿﮭﺎ ﻋﻠﻰ ﻏﺮار .Cﺗﻢ ﺗﻄﻮﯾﺮ ﻟﻐﺔ Dartﺑﻮاﺳﻄﺔ
Googleﻓﻲ .2011اﻟﻐﺮض ﻣﻦ ﺑﺮﻣﺠﺔ Dartھﻮ إﻧﺸﺎء واﺟﮭﺎت ﻣﺴﺘﺨﺪم أﻣﺎﻣﯿﺔ ﻟﻠﻮﯾﺐ وﺗﻄﺒﯿﻘﺎت اﻟﺠﻮال .إﻧﮫ ﻗﯿﺪ اﻟﺘﻄﻮﯾﺮ اﻟﻨﺸﻂ ،وﯾﺘﻢ ﺗﺠﻤﯿﻌﮫ
إﻟﻰ ﻟﻐﺔ اﻷﻟﺔ اﻷﺻﻠﻲ ﻹﻧﺸﺎء ﺗﻄﺒﯿﻘﺎت اﻷﺟﮭﺰة اﻟﻤﺤﻤﻮﻟﺔ ،ﻣﺴﺘﻮﺣﻰ ﻣﻦ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻷﺧﺮى ﻣﺜﻞ Javaو JavaScriptو ،C #وھﻮ ﻣﻜﺘﻮب
ﻧﻈﺮا ﻷن Dartھﻲ ﻟﻐﺔ ﻣﺘﺮﺟﻤﺔ ،ﻓﻼ ﯾﻤﻜﻨﻚ ﺗﻨﻔﯿﺬ اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻣﺒﺎﺷﺮةً؛ ﺑﺪﻻً ﻣﻦ ذﻟﻚ ،ﯾﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﺘﻮزﯾﻌﮭﺎ وﻧﻘﻠﮭﺎ إﻟﻰ رﻣﺰ اﻵﻟﺔ.
ً ﺑﻘﻮة.
ﯾﻮﺿﺢ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﺑﺮﻣﺠﺔ Dartاﻟﺒﺴﯿﻄﺔ.
2.3ﻧﻮع اﻟﺒﯿﺎﻧﺎت
Dartھﻲ ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﻣﻜﺘﻮﺑﺔ ﺑﻘﻮة .ھﺬا ﯾﻌﻨﻲ أن ﻛﻞ ﻗﯿﻤﺔ ﺗﺴﺘﺨﺪﻣﮭﺎ ﻓﻲ ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ اﻟﺨﺎﺻﺔ ﺑﻚ ﻟﮭﺎ ﻧﻮع إﻣﺎ stringأو numberوﯾﺠﺐ أن ﺗﻜﻮن
ﻣﻌﺮوﻓﺔ ﻋﻨﺪ ﺗﺠﻤﯿﻊ اﻟﻜﻮد .ﺳﻨﻨﺎﻗﺶ ھﻨﺎ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻷﺳﺎﺳﯿﺔ اﻷﻛﺜﺮ ﺷﯿﻮﻋًﺎ اﻟﻤﺴﺘﺨﺪﻣﺔ ﻓﻲ ﻟﻐﺔ ﺑﺮﻣﺠﺔ .Dart
String ;'String myName = 'Rakan ﯾﺤﺘﻮي ﻋﻠﻰ ﻧﺺ .ﺣﯿﺚ ﯾﻤﻜﻨﻚ اﺳﺘﺨﺪام ﻋﻼﻣﺎت اﻻﻗﺘﺒﺎس اﻟﻤﻔﺮدة أو اﻟﻤﺰدوﺟﺔ
)ﯾﺠﺐ أن ﺗﻜﻮن ﻣﺘﺴﻘًﺎ ﻣﻊ اﺧﺘﯿﺎرك(.
num, int, ;int age = 25 ﻧﻮع اﻟﺒﯿﺎﻧﺎت numﯾﺮﻣﺰ إﻟﻰ رﻗﻢ Dart .ﻟﮭﺎ ﻧﻮﻋﺎن ﻣﻦ اﻷرﻗﺎم:
double ;double price = 125.50 o )إﻧﮫ رﻗﻢ ﺑﺪون ﻣﻨﺰﻟﺔ ﻋﺸﺮﯾﺔ( Integer
o )إﻧﮫ رﻗﻢ ﺑﻤﻨﺰﻟﺔ ﻋﺸﺮﯾﺔ( Double
Boolean bool var_b = ;true ﯾﺴﺘﺨﺪم boolﻟﺘﻤﺜﯿﻞ اﻟﻘﯿﻤﺔ اﻟﻤﻨﻄﻘﯿﺔ "ﺻﻮاب وﺧﻄﺄ".
;Or bool var_b = false
object )(Person = Person ﺑﺸﻜﻞ ﻋﺎم ،ﻛﻞ ﺷﻲء ﻓﻲ Dartھﻮ ﻛﺎﺋﻦ )ﻣﺜﺎﻻ .(String ،Integer ،ﻟﻜﻦ ﯾﻤﻜﻦ
ﻀﺎ أﻛﺜﺮ ﺗﻌﻘﯿﺪًا.
أن ﯾﻜﻮن اﻟﻜﺎﺋﻦ أﯾ ً
ﻣﺜﺎل:
اﻟﺸﻜﻞ أدﻧﺎه ﯾﻮﺿﺢ ذﻟﻚ.
اﻟﺤﻠﻘﺎت ):(Loop
ﺗُﺴﺘﺨﺪم ﻟﺘﻨﻔﯿﺬ ﻛﺘﻠﺔ )ﻣﺠﻤﻮﻋﺔ( ﻣﻦ اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ ﺑﺸﻜﻞ ﻣﺘﻜﺮر ﺣﺘﻰ ﯾﺼﺒﺢ اﻟﺸﺮط اﻟﻤﺤﺪد ﺻﺤﯿ ًﺤﺎ .ﺗﺪﻋﻢ ﻟﻐﺔ Dartاﻷﻧﻮاع اﻟﺘﺎﻟﯿﺔ ﻣﻦ ﻋﺒﺎرات
اﻟﺤﻠﻘﺔ:
for
for..in
while
do..while
ﻣﺜﺎل:
6.3اﻟﺘﻌﻠﯿﻘﺎت )(Comments
اﻟﺘﻌﻠﯿﻘﺎت ھﻲ ﺳﻄﻮر اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻏﯿﺮ اﻟﻘﺎﺑﻠﺔ ﻟﻠﺘﻨﻔﯿﺬ .ھﻢ أﺣﺪ اﻟﺠﻮاﻧﺐ اﻟﺮﺋﯿﺴﯿﺔ ﻟﺠﻤﯿﻊ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ .اﻟﻐﺮض ﻣﻦ ذﻟﻚ ھﻮ ﺗﻮﻓﯿﺮ ﻣﻌﻠﻮﻣﺎت
ﺣﻮل اﻟﻤﺸﺮوع أو اﻟﻤﺘﻐﯿﺮ أو اﻟﻌﻤﻠﯿﺔ .ھﻨﺎك ﺛﻼﺛﺔ أﻧﻮاع ﻣﻦ اﻟﺘﻌﻠﯿﻘﺎت ﻓﻲ ﺑﺮﻣﺠﺔ :Dart
ﻋﻤﻞ ﺗﻌﻠﯿﻘﺎت ﻋﻠﻰ اﻟﺘﻨﺴﯿﻖ :إﻧﮫ ﺗﻌﻠﯿﻖ ذو ﺳﻄﺮ واﺣﺪ ).(//
اﻟﺘﻌﻠﯿﻘﺎت اﻟﺠﻤﺎﻋﯿﺔ :إﻧﮫ ﺗﻌﻠﯿﻖ ﻣﺘﻌﺪد اﻷﺳﻄﺮ ).(/*...*/
ﺗﻌﻠﯿﻘﺎت اﻟﻤﺴﺘﻨﺪ :ھﻮ ﺗﻌﻠﯿﻖ ﻣﺴﺘﻨﺪ ﯾﺴﺘﺨﺪم ﻟﻸﻋﻀﺎء واﻷﻧﻮاع ).(///
ﺗﺴﻤﺢ ﻟﻚ ﺗﻌﻠﯿﻤﺔ breakﺑﺈﻧﮭﺎء أو إﯾﻘﺎف اﻟﺘﺪﻓﻖ اﻟﺤﺎﻟﻲ ﻟﻠﺒﺮﻧﺎﻣﺞ وﻣﺘﺎﺑﻌﺔ اﻟﺘﻨﻔﯿﺬ ﺑﻌﺪ ﺟﺴﻢ اﻟﺤﻠﻘﺔ .اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﯾﻌﻄﻲ ﺷﺮﺣﺎ ﻣﻔﺼﻼ.
(Object-Oriented Programming) اﻟﺒﺮﻣﺠﺔ اﻟﺸﯿﺌﯿﺔ7.3
ﺣﺘﻰ اﻟﻘﯿﻢ اﻷوﻟﯿﺔ ﻣﺜﻞ، ﻛﻞ ﻗﯿﻤﺔ ھﻲ ﻛﺎﺋﻦ،Dart ﻓﻲ. ﯾﻤﻜﻦ أن ﺗﻜﻮن ﻓﯿﺰﯾﺎﺋﯿﺔ أو ﻣﻨﻄﻘﯿﺔ. ھﻮ ﻛﯿﺎن ﻟﮫ ﺣﺎﻟﺔ وﺳﻠﻮك:(Object) اﻟﻜﺎﺋﻦ
.ﻀﺎ ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﻣﺨﺼﺺ ﻟﻠﺘﻌﺒﯿﺮ ﻋﻦ ﻋﻼﻗﺎت أﻛﺜﺮ ﺗﻌﻘﯿﺪًا ﺑﯿﻦ اﻟﺒﯿﺎﻧﺎت
ً أﯾDart ﯾﻤﻜﻦ أن ﺗﺴﻤﺢ ﻟﻚ.اﻟﻨﺺ واﻟﺮﻗﻢ
ھﺬا ﯾﻌﻨﻲ أن اﻟﻜﺎﺋﻨﺎت ﯾﺘﻢ إﻧﺸﺎؤھﺎ ﺑﻤﺴﺎﻋﺪة اﻟﻔﺌﺎت ﻷن ﻛﻞ ﻛﺎﺋﻦ ﯾﺤﺘﺎج إﻟﻰ ﻣﺨﻄﻂ ﯾﻌﺘﻤﺪ. اﻟﻔﺌﺔ ھﻲ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻜﺎﺋﻨﺎت:(Class) اﻟﻔﺌﺔ
: ﯾﺘﻀﻤﻦ ﺗﻌﺮﯾﻒ اﻟﻔﺌﺔ ﻋﻠﻰ اﻷﺷﯿﺎء اﻟﺘﺎﻟﯿﺔ.ﻋﻠﻰ ﻣﺎ أﻧﺸﺌﺖ ﻣﻦ ﻛﺎﺋﻦ ﻓﺮدي
Fields
Methods
Constructor
Getters and setters
ﻣﺜﺎل
class Mobile {
// Property Declaration
String color = 'red', brandName = 'mi', modelName = 'mi10';
// Method Creation
String calling() {
return "Mobile can do call to everyone.";}
String musicPlay() {
return "Mobile can play all types of Music.";}
String clickPicture() {
return "Mobile can take pictures.";}}
void main() {
// Object Creation
var myMob = new Mobile();
// Accessing Class's Property
myMob.color = "Black";
myMob.brandName = "Apple Inc.";
myMob.modelName = "iPhone 11 Pro";
//Display Output
print(myMob.color);
print(myMob.modelName);
print(myMob.brandName);
print(myMob.calling());
print(myMob.musicPlay());
print(myMob.clickPicture());
}
:اﻟﻨﺎﺗﺞ
Black
iPhone 11 Pro
Apple Inc.
Mobile can do call to everyone.
Mobile can play all types of Music.
Mobile can take pictures.
:ﻣﺜﺎل أﺧﺮ
class Student {
String name = "Me";
int age = 25;
void main() {
Student s1 = new Student();
s1.stud_name = 'MARK';
s1.stud_age = 10;
print(s1.stud_name);
print(s1.stud_age);
}
اﻟﻨﺎﺗﺞ
MARK
10
Flutter أول ﺗﻄﺒﯿﻖ ﻓﻲ.4
ﻗﻢ ﺑﺎﻟﺨﻄﻮات، ﺟﺪﯾﺪFlutter ﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ.Flutter وذﻟﻚ ﻟﻔﮭﻢ أﺳﺎﺳﯿﺎتVS.Code ﺑﺴﯿﻂ ﺑﻮاﺳﻄﺔAndroid ﺳﻮف ﻧﺘﻌﻠﻢ ﻛﯿﻔﯿﺔ إﻧﺸﺎء ﺗﻄﺒﯿﻖ
:اﻟﺘﺎﻟﯿﺔ
1. Open the Command Palette (Ctrl+Shift+P).
: .ideaﯾﻮﺟﺪ ھﺬا اﻟﻤﺠﻠﺪ ﻓﻲ أﻋﻠﻰ ھﯿﻜﻞ اﻟﻤﺸﺮوع ،واﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ اﻹﻋﺪادات ,ﻻ ﯾﮭﻢ ﻷﻧﻨﺎ ﻟﻦ ﻧﻌﻤﻞ ﻣﻊ ﺑﯿﺌﺔ ﻋﻤﻞ ﺑﺤﯿﺚ
ﯾﻤﻜﻦ ﺗﺠﺎھﻞ ﻣﺤﺘﻮى ھﺬا اﻟﻤﺠﻠﺪ.
: .androidﯾﺤﺘﻮي ھﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ ﻣﺸﺮوع Androidﻛﺎﻣﻞ وﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻋﻨﺪ إﻧﺸﺎء ﺗﻄﺒﯿﻖ Flutterﻟﻨﻈﺎم Android.
ﻋﻨﺪﻣﺎ ﯾﺘﻢ ﺗﺠﻤﯿﻊ ﻛﻮد Flutterﻓﻲ ،native codeﺳﯿﺘﻢ إدﺧﺎﻟﮫ ﻓﻲ ﻣﺸﺮوع Androidھﺬا ،ﺑﺤﯿﺚ ﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﺗﻄﺒﯿﻖ
Androidأﺻﻠﻲ .ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل :ﻋﻨﺪ اﺳﺘﺨﺪام ﻣﺤﺎﻛﻲ ، Androidﯾﺘﻢ اﺳﺘﺨﺪام ﻣﺸﺮوع Androidھﺬا ﻹﻧﺸﺎء ﺗﻄﺒﯿﻖ
ﻀﺎ ﻋﻠﻰ ﺟﮭﺎز Androidاﻟﻈﺎھﺮي.
،Androidواﻟﺬي ﯾﺘﻢ ﻧﺸﺮه أﯾ ً
: .iOSﯾﺤﺘﻮي ھﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ ﻣﺸﺮوع Macﻛﺎﻣﻞ وﯾﺴﺘﺨﺪم ﻋﻨﺪ إﻧﺸﺎء ﺗﻄﺒﯿﻖ Flutterﻟﻨﻈﺎم اﻟﺘﺸﻐﯿﻞ . iOSإﻧﮫ ﻣﺸﺎﺑﮫ
ﻟﻤﺠﻠﺪ androidاﻟﻤﺴﺘﺨﺪم ﻋﻨﺪ ﺗﻄﻮﯾﺮ ﺗﻄﺒﯿﻖ ﻟﻨﻈﺎم Android.ﻋﻨﺪﻣﺎ ﯾﺘﻢ ﺗﺠﻤﯿﻊ ﻛﻮد Flutterﻓﻲ اﻟﻜﻮد اﻷﺻﻠﻲ ،ﺳﯿﺘﻢ إدﺧﺎﻟﮫ
ﻓﻲ ﻣﺸﺮوع iOSھﺬا ،ﺑﺤﯿﺚ ﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﺗﻄﺒﯿﻖ iOSأﺻﻠﻲ .ﻻ ﯾﻤﻜﻦ إﻧﺸﺎء ﺗﻄﺒﯿﻖ Flutterﻟﻨﻈﺎم iOSإﻻ ﻋﻨﺪﻣﺎ ﺗﻌﻤﻞ
ﻋﻠﻰ. macOS
: .libھﻮ ﻣﺠﻠﺪ أﺳﺎﺳﻲ ﯾﺮﻣﺰ إﻟﻰ اﻟﻤﻜﺘﺒﺔ .إﻧﮫ ﻣﺠﻠﺪ ﺣﯿﺚ ﺳﯿﻜﻮن اﻟﻌﻤﻞ ﺑﺪاﺧﻠﮫ ﺑﻨﺴﺒﺔ 99ﺑﺎﻟﻤﺎﺋﺔ ﻣﻦ أﻋﻤﺎل اﻟﻤﺸﺮوع .داﺧﻞ
ﻣﺠﻠﺪ ، libﺳﻨﺠﺪ ﻣﻠﻔﺎت Dartاﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﻛﻮد ﺗﻄﺒﯿﻖ Flutterاﻟﺨﺎص ﺑﻨﺎ .ﺑﺸﻜﻞ اﻓﺘﺮاﺿﻲ ،ﯾﺤﺘﻮي ھﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ
اﻟﻤﻠﻒ ، main. Artوھﻮ ﻣﻠﻒ إدﺧﺎل ﺗﻄﺒﯿﻖ .Flutter
:.testﯾﺤﺘﻮي ھﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ ﻛﻮد ، Dartواﻟﺬي ﺗﻤﺖ ﻛﺘﺎﺑﺘﮫ ﻟﺘﻄﺒﯿﻖ Flutterﻹﺟﺮاء اﻻﺧﺘﺒﺎر اﻟﺘﻠﻘﺎﺋﻲ ﻋﻨﺪ إﻧﺸﺎء اﻟﺘﻄﺒﯿﻖ .ﻟﻦ
ﯾﻜﻮن ﻣﮭ ًﻤﺎ ﺟﺪًا ﺑﺎﻟﻨﺴﺒﺔ ﻟﻨﺎ ھﻨﺎ.
ﻀﺎ ﺑﻌﺾ اﻟﻤﻠﻔﺎت اﻻﻓﺘﺮاﺿﯿﺔ ﻓﻲ ﺗﻄﺒﯿﻖ 99.99 .Flutterﺑﺎﻟﻤﺎﺋﺔ ﻣﻦ اﻟﺤﺎﻻت ﻻ ﻧﻠﻤﺲ ھﺬه اﻟﻤﻠﻔﺎت ﯾﺪوﯾًﺎ .ﻣﺜﺎل ﻟﮭﺬه اﻟﻤﻠﻔﺎت:
ھﻨﺎك أﯾ ً
: .gitignore oھﻮ ﻣﻠﻒ ﻧﺼﻲ ﯾﺤﺘﻮي ﻋﻠﻰ ﻗﺎﺋﻤﺔ ﺑﺎﻟﻤﻠﻔﺎت واﻣﺘﺪادات اﻟﻤﻠﻔﺎت واﻟﻤﺠﻠﺪات اﻟﺘﻲ ﺗﺨﺒﺮ Gitﺑﺎﻟﻤﻠﻔﺎت اﻟﺘﻲ ﯾﺠﺐ
ﺗﺠﺎھﻠﮭﺎ ﻓﻲ اﻟﻤﺸﺮوع Git .ھﻮ ﻣﻠﻒ ﻟﻠﺘﺤﻜﻢ ﻓﻲ اﻹﺻﺪار ﻟﺘﺘﺒﻊ اﻟﺘﻐﯿﯿﺮات ﻓﻲ اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ اﻟﻤﺼﺪر أﺛﻨﺎء ﺗﻄﻮﯾﺮ اﻟﺒﺮاﻣﺞ.
:.metadata oھﻮ ﻣﻠﻒ ﺗﻢ إﻧﺸﺎؤه ﺗﻠﻘﺎﺋﯿًﺎ ﺑﻮاﺳﻄﺔ أدوات ، Flutterواﻟﺬي ﯾﺴﺘﺨﺪم ﻟﺘﺘﺒﻊ ﺧﺼﺎﺋﺺ ﻣﺸﺮوع .Flutterﯾﻘﻮم ھﺬا
اﻟﻤﻠﻒ ﺑﺘﻨﻔﯿﺬ اﻟﻤﮭﺎم اﻟﺪاﺧﻠﯿﺔ ،ﻟﺬﻟﻚ ﻻ ﺗﺤﺘﺎج إﻟﻰ ﺗﺤﺮﯾﺮ اﻟﻤﺤﺘﻮى ﯾﺪوﯾًﺎ ﻓﻲ أي وﻗﺖ.
:.packages oھﻮ ﻣﻠﻒ ﯾﺘﻢ إﻧﺸﺎؤه ﺗﻠﻘﺎﺋﯿًﺎ ﺑﻮاﺳﻄﺔ ، Flutter SDKواﻟﺬي ﯾﺴﺘﺨﺪم ﻻﺣﺘﻮاء ﻗﺎﺋﻤﺔ اﻟﺘﺒﻌﯿﺎت ﻟﻤﺸﺮوع .Flutter
:flutter_demoapp.iml oﯾﺘﻢ ﺗﺴﻤﯿﺘﮫ داﺋ ًﻤﺎ وﻓﻘًﺎ ﻻﺳﻢ ﻣﺸﺮوع Flutterاﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ إﻋﺪادات إﺿﺎﻓﯿﺔ ﻟﻠﻤﺸﺮوع .ﯾﻨﻔﺬ
ھﺬا اﻟﻤﻠﻒ اﻟﻤﮭﺎم اﻟﺪاﺧﻠﯿﺔ ،واﻟﺘﻲ ﺗﺘﻢ إدارﺗﮭﺎ ﺑﻮاﺳﻄﺔ ،Flutter SDKﻟﺬﻟﻚ ﻻ ﺗﺤﺘﺎج إﻟﻰ ﺗﺤﺮﯾﺮ اﻟﻤﺤﺘﻮى ﯾﺪوﯾًﺎ ﻓﻲ أي وﻗﺖ.
.5ﺑﻨﯿﺔ إطﺎر ﻋﻤﻞ (Flutter Framework Architecture)Flutter
ﺗﺘﻜﻮن ﺑﻨﯿﺔ Flutterﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻣﻦ أرﺑﻌﺔ ﻣﻜﻮﻧﺎت.
1. Flutter Engine
2. Foundation Library
3. Widgets
4. Design Specific Widgets
Flutter Engine 1,5
ھﻮ ﻣﺤﺮك ﺗﺸﻐﯿﻞ ﻣﺤﻤﻮل ) (portable runtimeﻟﺘﻄﺒﯿﻘﺎت اﻷﺟﮭﺰة اﻟﻤﺤﻤﻮﻟﺔ ﻋﺎﻟﯿﺔ اﻟﺠﻮدة ،ﯾﻌﺘﻤﺪ ﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻋﻠﻰ ﻟﻐﺔ .C++ﯾﻘﻮم
ﺑﺘﻨﻔﯿﺬ ﻣﻜﺘﺒﺎت Flutterاﻷﺳﺎﺳﯿﺔ ﻣﺜﻞ اﻟﺮﺳﻮم اﻟﻤﺘﺤﺮﻛﺔ ) ،(animationاﻟﺮﺳﻮﻣﺎت ) ،(graphicsإدﺧﺎل /إﺧﺮاج ) ،(I/Oاﻟﺸﺒﻜﺔ
) ،(networkﺑﻨﯿﺔ اﻟﻤﻜﻮﻧﺎت اﻹﺿﺎﻓﯿﺔ ،ودﻋﻢ إﻣﻜﺎﻧﯿﺔ اﻟﻮﺻﻮل أﺛﻨﺎء وﻗﺖ ﺗﺸﻐﯿﻞ dartﻟﺘﻄﻮﯾﺮ ﺗﻄﺒﯿﻘﺎت Flutterوﺗﺠﻤﯿﻌﮭﺎ وﺗﺸﻐﯿﻠﮭﺎ.
Widgets 3,5
اﻟﻤﻔﮭﻮم اﻷﺳﺎﺳﻲ ل Flutterھﻮ أن ﻛﻞ ﺷﻲء ﻋﺒﺎرة ﻋﻦ Widget .widgetﻓﻲ Flutterھﻲ ﻓﻲ اﻷﺳﺎس أداة أو ﻣﻜﻮن واﺟﮭﺔ ﻣﺴﺘﺨﺪم ﯾﺆﺛﺮ
ً
وأﺷﻜﺎﻻ ورﺳﻮ ًﻣﺎ ﻣﺘﺤﺮﻛﺔ. ﺼﺎ
وﯾﺘﺤﻜﻢ ﻓﻲ ﻋﺮض وواﺟﮭﺔ اﻟﺘﻄﺒﯿﻖ .إﻧﮫ ﯾﺘﻀﻤﻦ رﺳﻮﻣﺎت وﻧ ً
ﻓﻲ Flutterﯾﻌﺘﺒﺮ اﻟﺘﻄﺒﯿﻖ ﺑﺤﺪ ذاﺗﮫ widgetوﯾﺤﺘﻮي أﯾﻀﺎ ﻋﻠﻰ اﻟﻌﺪﯾﺪ ﻣﻦ widgetsاﻟﻔﺮﻋﯿﺔ .ھﺬا ﯾﻌﻨﻲ أن اﻟﺘﻄﺒﯿﻖ ھﻮ widgetذات
ﻣﺴﺘﻮى أﻋﻠﻰ ،وأن واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﺨﺎﺻﺔ ) (UIﺑﮫ ﻣﺒﻨﯿﺔ ﺑﺎﺳﺘﺨﺪام واﺣﺪ أو أﻛﺜﺮ ﻣﻦ widgetsذات ﻣﺴﺘﻮى أدﻧﻰ .ﺗﺴﺎﻋﺪك ھﺬه اﻟﻤﯿﺰة ﻋﻠﻰ إﻧﺸﺎء
واﺟﮭﺔ ﻣﺴﺘﺨﺪم ﻣﻌﻘﺪة ﺑﺴﮭﻮﻟﺔ ﺑﺎﻟﻐﺔ .ﯾﻤﻜﻨﻨﺎ ﻓﮭﻤﮫ ﻣﻦ ﻣﺜﺎل hello worldاﻟﺬي ﺗﻢ إﻧﺸﺎؤه ﻓﻲ اﻟﻘﺴﻢ اﻟﺴﺎﺑﻖ .ھﻨﺎ ،ﺳﻨﺸﺮح اﻟﻤﺜﺎل ﺑﺎﻟﺮﺳﻢ اﻟﺒﯿﺎﻧﻲ اﻟﺘﺎﻟﻲ.
ﻓﻲ اﻟﺸﻜﻞ أﻋﻼه ،ﯾﻤﻜﻨﻨﺎ أن ﻧﺮى أن ﺟﻤﯿﻊ اﻟﻤﻜﻮﻧﺎت ﻋﺒﺎرة ﻋﻦ widgetﺗﺤﺘﻮي ﻋﻠﻰ widgetsﻓﺮﻋﯿﺔ .ﺑﺎﻟﺘﺎﻟﻲ ،ﻓﺈن ﺗﻄﺒﯿﻖ Flutterھﻮ ﻓﻲ ﺣﺪ
ذاﺗﮫ .widget
Design Specific Widgets 4,5
ﯾﺤﺘﻮي إطﺎر ﻋﻤﻞ Flutterﻋﻠﻰ ﻣﺠﻤﻮﻋﺘﯿﻦ ﻣﻦ widgetsاﻟﺘﻲ ﺗﺘﻮاﻓﻖ ﻣﻊ ﻟﻐﺎت ﺗﺼﻤﯿﻢ ﻣﺤﺪدة .اﻟﻤﺠﻤﻮﻋﺔ اﻷوﻟﻰ )(Material Design
ﻣﺨﺼﺼﺔ ﻟﺘﻄﺒﯿﻖ Androidواﻟﻤﺠﻤﻮﻋﺔ اﻟﺜﺎﻧﯿﺔ ) (Cupertino Styleﻟﺘﻄﺒﯿﻖ .IOS
5,5اﻹﯾﻤﺎءات )(Gestures
إﻧﮭﺎ أداة ﺗﻮﻓﺮ اﻟﺘﻔﺎﻋﻞ )ﻛﯿﻔﯿﺔ اﻻﺳﺘﻤﺎع ) (listenواﻻﺳﺘﺠﺎﺑﺔ ) ((respondﻓﻲ Flutterﺑﺎﺳﺘﺨﺪام ﻛﺎﺷﻒ اﻹﯾﻤﺎءات .GestureDetector
:GestureDectorھﻮ widgetﻏﯿﺮ ﻣﺮﺋﻲ ،واﻟﺬي ﯾﺘﻀﻤﻦ اﻟﻨﻘﺮ واﻟﺴﺤﺐ وﺗﻮﺳﯿﻊ ﻧﻄﺎق اﻟﺘﻔﺎﻋﻞ ﻟﻌﻨﺼﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﻔﺮﻋﻲ.
ﻀﺎ اﺳﺘﺨﺪام ﻣﯿﺰات ﺗﻔﺎﻋﻠﯿﺔ أﺧﺮى ﻓﻲ ﻋﻨﺎﺻﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﺤﺎﻟﯿﺔ ﻋﻦ طﺮﯾﻖ إﻧﺸﺎء .GestureDetector widget
ﯾﻤﻜﻨﻨﺎ أﯾ ً
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Center(child: Text('Hello Students')),
);
}}
widget 1,6
: إﻟﻰ ﻓﺌﺘﯿﻦFlutter ﯾﻤﻜﻨﻨﺎ ﺗﻘﺴﯿﻢ أداة
(Output and Input) Visible ( ﻣﺮﺋﻲ )اﻹﺧﺮاج واﻟﻤﺪﺧﻼت.1
(Layout and Control) Invisible ( ﻏﯿﺮ ﻣﺮﺋﻲ )اﻟﺘﺨﻄﯿﻂ واﻟﺘﺤﻜﻢ.2
Button
ً ﯾﺴﺘﺨﺪم ﻧﻮ، ﻣﺒﺎﺷﺮة؛ ﺑﺪﻻً ﻣﻦ ذﻟﻚButton widget ﺑﺎﺳﺘﺨﺪامFlutter ﻻ ﯾﺴﻤﺢ. ﺗﻨﻔﯿﺬ ﺑﻌﺾ اﻹﺟﺮاءات ﻋﻨﺪ اﻟﻨﻘﺮButton widget ﺗﺘﯿﺢ ﻟﻚ
ﻋﺎ
. ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪاﻣﮫ ﻣﺜﻞ ﻣﻘﺘﻄﻔﺎت اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ أدﻧﺎه.RaisedButton وFlatButton ﻣﻦ اﻷزرار ﻣﺜﻞ
//FlatButton Example
new FlatButton(
child: Text("Click here"),
onPressed: () { // Do something here
}, ),
//RaisedButton Example
new RaisedButton(
child: Text("Click here"),
elevation: 5.0,
onPressed: () { // Do something here
}, ),
. ﻟﺘﻐﯿﯿﺮ ﻣﺪى ﺗﻤﯿﺰھﺎelevation وﯾﺘﻢ اﺳﺘﺨﺪام ﺧﺎﺻﯿﺔ، ﺗﻨﻔﯿﺬ إﺟﺮاء ﻣﺎ ﻋﻨﺪ اﻟﻨﻘﺮ ﻓﻮق اﻟﺰرonPressed ﺗﺘﯿﺢ ﻟﻨﺎ ﺧﺎﺻﯿﺔ،ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه
Image
ﺗﺤﺘﻮي ھﺬه Image widgetﻋﻠﻰ اﻟﺼﻮرة اﻟﺘﻲ ﯾﻤﻜﻨﮭﺎ ﺟﻠﺒﮭﺎ ﻣﻦ ﻣﺼﺎدر ﻣﺘﻌﺪدة ﻣﺜﻞ ﻣﻦ ﻣﺠﻠﺪ اﻷﺻﻮل أو ﻣﺒﺎﺷﺮة ﻣﻦ ﻋﻨﻮان .URLﯾﻮﻓﺮ
اﻟﻌﺪﯾﺪ ﻣﻦ ﺗﻄﺒﯿﻘﺎت ﺗﺤﺮﯾﺮ اﻟﺼﻮر ﻟﺘﺤﻤﯿﻞ اﻟﺼﻮر ،واﻟﺘﻲ ﺗﺮد أدﻧﺎه:
:Image إﻧﮫ أداة ﺗﺤﻤﯿﻞ ﺻﻮر ﻋﺎﻣﺔ ،ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﺑﻮاﺳﻄﺔ .ImageProvider
:asset ﯾﺘﻢ ﺗﺤﻤﯿﻞ اﻟﺼﻮرة ﻣﻦ ﻣﺠﻠﺪ ﻣﻜﻮﻧﺎت اﻟﻤﺸﺮوع اﻟﺨﺎص ﺑﻚ.
:file ﯾﻘﻮم ﺑﺘﺤﻤﯿﻞ اﻟﺼﻮر ﻣﻦ ﻣﺠﻠﺪ اﻟﻨﻈﺎم.
:memory ﺗﻘﻮم ﺑﺘﺤﻤﯿﻞ اﻟﺼﻮرة ﻣﻦ اﻟﺬاﻛﺮة.
:network ﺗﻘﻮم ﺑﺘﺤﻤﯿﻞ اﻟﺼﻮر ﻣﻦ اﻟﺸﺒﻜﺔ.
ﻣﺜﺎل:
ﻹﺿﺎﻓﺔ ﺻﻮرة ﻓﻲ اﻟﻤﺸﺮوع ،ﺗﺤﺘﺎج أوﻻً إﻟﻰ إﻧﺸﺎء ﻣﺠﻠﺪ ﻟﻤﻜﻮﻧﺎت اﻟﻤﺸﺮوع ﺣﯿﺚ ﺗﺤﺘﻔﻆ ﺑﺼﻮرك ﺛﻢ إﺿﺎﻓﺔ اﻟﺴﻄﺮ أدﻧﺎه ﻓﻲ ﻣﻠﻒ
.pubspec.yaml
assets:
- assets/ImageName1.jpeg
- assets / ImageName2.jpeg
)'Image.asset('assets/computer.png
اﻟﻜﻮد ﻛﺎﻣﻞ ﻟﻤﺎ ﺳﺒﻖ ھﻮ
void main() => runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Hello Student'),
centerTitle: true,
backgroundColor: const Color.fromARGB(255, 229, 53, 53),
),
body: const Center(
child: Image(
image: AssetImage('assets/Flutter.jpg'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
backgroundColor: Colors.green[600],
child: const Text('click'),
),
),
));
Icon
. اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﯾﺸﺮﺣﮭﺎ ﺑﺸﻜﻞ أﻛﺜﺮ وﺿﻮ ًﺣﺎ.Flutter ﻛﺤﺎوﯾﺔ ﻟﺘﺨﺰﯾﻦ اﻷﯾﻘﻮﻧﮫ او اﻟﺮﻣﺰ ﻓﻲIcon widget ﺗﻌﻤﻞ
body: const Center(
child: Icon(
Icons.airport_shuttle,
color: Colors.lightBlue,
size: 100.0,
),
),
Row
واﻟﻤﺤﻮر اﻟﻤﺘﻘﺎطﻊ ھﻮ، اﻟﻤﺤﻮر اﻟﺮﺋﯿﺴﻲ ھﻮ اﻟﻤﺤﻮر اﻷﻓﻘﻲ، ھﻨﺎ. أﻓﻘﯿًﺎ وﻟﯿﺲ رأﺳﯿًﺎwidget ﻟﻜﻨﮭﺎ ﺗﺒﻨﻲ،Column widget ﺗﺸﺒﮫ
.( the cross axis is the vertical axis،main axis is the horizontal axis) اﻟﻤﺤﻮر اﻟﺮأﺳﻲ
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text( "VegElement", ),
new Text(
"Non-vegElement"
), ], ),
Center
.Center widget ﺗﺤﺘﻮي ﺟﻤﯿﻊ اﻷﻣﺜﻠﺔ اﻟﺴﺎﺑﻘﺔ داﺧﻞ. واﻟﺘﻲ ﺗﺄﺗﻲ ﺑﺪاﺧﻠﮫ، اﻟﻔﺮﻋﯿﺔwidgets ﻟﺘﻮﺳﯿﻂCenter widget ﺗُﺴﺘﺨﺪم
:ﻣﺜﺎل
Center(
child: new clumn(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text( "VegElement", ),
new Text(
"Non-vegElement"
),
],
),
),
Padding
ﻀﺎ ﺗﻮﻓﯿﺮ اﻟﻤﺴﺎﺣﺔ اﻟﻤﺘﺮوﻛﺔ ﻓﻲ ﺟﻤﯿﻊ
ً ﯾﻤﻜﻨﻚ أﯾ.ﺗﻘﻮم ھﺬه اﻷداة ﺑﺘﻐﻠﯿﻒ اﻷدوات اﻷﺧﺮى ﻟﻤﻨﺤﮭﺎ ﻣﺴﺎﺣﺔ ﻣﺘﺮوﻛﺔ ﻓﻲ اﺗﺠﺎھﺎت ﻣﺤﺪدة
. ﻓﻲ ﺟﻤﯿﻊ اﻻﺗﺠﺎھﺎت6.0 ﯾﻤﻜﻨﻨﺎ ﻓﮭﻤﮫ ﻣﻦ اﻟﻤﺜﺎل أدﻧﺎه اﻟﺬي ﯾﻌﻄﻲ ﻣﺴﺎﺣﺔ ﺣﺸﻮ أداة اﻟﻨﺺ.اﻻﺗﺠﺎھﺎت
:ﻣﺜﺎل
Padding(
padding: const EdgeInsets.all(6.0),
child: new Text(
"Element 1",
),
),
Scaffold
etc.، Drawers، Floating Action Buttons،AppBar إطﺎرا ﯾﺘﯿﺢ ﻟﻚ إﺿﺎﻓﺔ ﻋﻨﺎﺻﺮ ﺗﺼﻤﯿﻢ اﻟﻤﻮاد اﻟﺸﺎﺋﻌﺔ ﻣﺜﻞ
ً ﺗﻮﻓﺮ ھﺬه اﻷداة
Stack
.( ﻋﻨﺼﺮ واﺟﮭﺔ ﻣﺴﺘﺨﺪمoverlapping) ﺗُﺴﺘﺨﺪم ﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻟﺘﺪاﺧﻞ،إﻧﮭﺎ أداة أﺳﺎﺳﯿﺔ
StatefulWidget 1,2,6
.(the state object and the widget) :classes ﯾﺤﺘﻮي ﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻋﻠﻰ. ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت اﻟﺤﺎﻟﺔStatefulWidget ﯾﺤﺘﻮي
ﯾﺤﺘﻮي ﻋﻠﻰ.(build () method) ھﺬه اﻷداة ﻋﻠﻰ ﻻ ﺗﺤﺘﻮي.(the widget lifetime) إﻧﮫ دﯾﻨﺎﻣﯿﻜﻲ ﻷﻧﮫ ﯾﻤﻜﻨﮫ ﺗﻐﯿﯿﺮ اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﯿﺔ أﺛﻨﺎء
ھﻲStatefulWidget أﻣﺜﻠﺔ.(returns a class that extends the Flutters State Class) واﻟﺘﻲ،(createState () method)
. TextField، Form، InkWell، Slider، Radio،Checkbox
ﻣﺜﺎل
class Car extends StatefulWidget {
const Car({ Key? key, this.title }) : super(key: key);
@override
_CarState createState() => _CarState();
}
@override
{ )Widget build(BuildContext context
;))return Container(color: const Color(0x0xFEEFE
} }
ﯾﺘﯿﺢ ﻟﻨﺎ Flutterإﻧﺸﺎء ﺗﺨﻄﯿﻂ )(layoutﻋﻦ طﺮﯾﻖ إﻧﺸﺎء widgetsﻣﺘﻌﺪدة ﻹﻧﺸﺎء widgetsأﻛﺜﺮ ﺗﻌﻘﯿﺪًا .ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ،ﯾﻤﻜﻨﻨﺎ أن ﻧﺮى
اﻟﺼﻮرة أدﻧﺎه اﻟﺘﻲ ﺗﻌﺮض ﺛﻼﺛﺔ رﻣﻮز ﻣﻊ ﺗﺴﻤﯿﺔ ﺗﺤﺖ ﻛﻞ واﺣﺪة.
ﻓﻲ اﻟﺼﻮرة اﻟﺜﺎﻧﯿﺔ ،ﯾﻤﻜﻨﻨﺎ أن ﻧﺮى اﻟﺘﺨﻄﯿﻂ اﻟﻤﺮﺋﻲ ﻟﻠﺼﻮرة أﻋﻼه .ﺗُﻈﮭﺮ ھﺬه اﻟﺼﻮرة ﺻﻔًﺎ ﻣﻦ ﺛﻼﺛﺔ أﻋﻤﺪة ،وﺗﺤﺘﻮي ھﺬه اﻷﻋﻤﺪة ﻋﻠﻰ رﻣﺰ
وﺗﺴﻤﯿﺔ.
ﻓﻲ اﻟﺼﻮرة أﻋﻼه ،اﻟﺤﺎوﯾﺔ ) (containerﻋﺒﺎرة ﻋﻦ ) (a widget classﺗﺘﯿﺢ ﻟﻨﺎ ﺗﺨﺼﯿﺺ widgetﻓﺮﻋﻲ .ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﺑﺸﻜﻞ أﺳﺎﺳﻲ
ﻹﺿﺎﻓﺔ اﻟﺤﺪود واﻟﺤﺸﻮ واﻟﮭﻮاﻣﺶ وﻟﻮن اﻟﺨﻠﻔﯿﺔ ) ( background color، margins، padding،bordersوﻏﯿﺮھﺎ اﻟﻜﺜﯿﺮ.
ﻀﺎ ﻓﻲ containerﻹﺿﺎﻓﺔ
ھﻨﺎ ،ﺗﺄﺗﻲ ) (text widgetأﺳﻔﻞ ال containerﻹﺿﺎﻓﺔ اﻟﮭﻮاﻣﺶ) .(marginsﯾﺘﻢ وﺿﻊ اﻟﺼﻒ ) (rowﺑﺄﻛﻤﻠﮫ أﯾ ً
ﻀﺎ ،ﯾﺘﻢ اﻟﺘﺤﻜﻢ ﻓﻲ ﺑﻘﯿﺔ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم ﺑﺨﺼﺎﺋﺺ ﻣﺜﻞ اﻟﻠﻮن واﻟﻨﺺ.
marginsو paddingﺣﻮل اﻟﺼﻒ .أﯾ ً
اﻟﺤﺸﻮ ) :(Paddingھﻮ widgetﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻟﺘﻨﻈﯿﻢ widgetﻓﺮﻋﻲ ﻣﻦ ﺧﻼل ﺗﻐﻠﯿﻒ أو ﺣﺸﻮ ﻣﺤﺪدة .ﯾﺤﺘﻮي ﻋﻠﻰ )(EdgeInsets
و) (EdgeInsets.fromLTRBﻟﻠﺠﺎﻧﺐ اﻟﻤﻄﻠﻮب ﺗﻮﻓﯿﺮ اﻟﺤﺸﻮ ﻟﮫ.
Center(
child: Container(
height: 110.0,
width: 110.0,
color: Colors.blue,
child: Align(
alignment: Alignment.topLeft,
child: FlutterLogo(
size: 50,
),
), )
.ﺗﺘﯿﺢ ﻟﻚ ھﺬه اﻷداة إﻋﻄﺎء اﻟﺤﺠﻢ اﻟﻤﺤﺪد ﻟﻌﻨﺼﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﻔﺮﻋﻲ ﻣﻦ ﺧﻼل ﺟﻤﯿﻊ اﻟﺸﺎﺷﺎت:SizedBox
SizedBox(
width: 300.0,
height: 450.0,
child: const Card(child: Text('Hello JavaTpoint!')), )
. ﺗﺴﻤﺢ ﻟﻚ ھﺬه اﻷداة ﺑﺎﻟﺤﻔﺎظ ﻋﻠﻰ ﺣﺠﻢ ﻋﻨﺼﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﺘﺎﺑﻊ ﻟﻨﺴﺒﺔ ﻋﺮض إﻟﻰ ارﺗﻔﺎع ﻣﺤﺪدة:AspectRatio
AspectRatio(
aspectRatio: 5/3,
child: Container(
color: Colors.bluel,
), )
. اﻟﻔﺮﻋﻲBaseline ﯾﻐﯿﺮ ﻋﻨﺼﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم ﻋﻨﺼﺮ واﺟﮭﺔ اﻟﻤﺴﺘﺨﺪم اﻟﻔﺮﻋﯿﺔ وﻓﻘًﺎ ل:Baseline
child: Baseline(
baseline: 30.0,
baselineType: TextBaseline.alphabetic,
child: Container(
height: 60,
width: 50,
color: Colors.blue,
), )
اﻟﻔﺮﻋﻲ ﻋﻠﻰwidget ھﺬا ﯾﻌﻨﻲ أﻧﮫ ﯾﻤﻜﻨﻚ إﺟﺒﺎر ال. اﻟﻔﺮﻋﻲwidget ھﻲ أداة ﺗﺴﻤﺢ ﻟﻚ ﺑﻔﺮض ﻗﯿﻮد إﺿﺎﻓﯿﺔ ﻋﻠﻰ:ConstrainedBox
. اﻟﻔﺮﻋﻲwidget ﻓﺮض ﻗﯿﻮد ﻣﻌﯿﻨﺔ دون ﺗﻐﯿﯿﺮ ﺧﺼﺎﺋﺺ
ConstrainedBox(
constraints: new BoxConstraints(
minHeight: 150.0,
minWidth: 150.0,
maxHeight: 300.0,
maxWidth: 300.0,
),
child: new DecoratedBox(
decoration: new BoxDecoration(color: Colors.red), ),)
ﯾﻘﺮر ال. اﻷﺳﺎﺳﻲwidget اﻟﻔﺮﻋﻲ اﻟﻔﺮدي إﻟﻰwidget ﯾﻨﺤﺮف ﻣﻦ ﺗﺨﻄﯿﻂ الwidget ھﻮ:CustomSingleChildLayout
. اﻷﺻﻞwidget ﻀﺎ ﻟﺘﺤﺪﯾﺪ ﺣﺠﻢ ال
ً اﻟﻔﺮﻋﻲ وﯾﺴﺘﺨﺪم أﯾwidget اﻷﺳﺎﺳﻲ وﺿﻊ الwidget
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Multiple Layout Widget',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.cyan,
),
home: const MyHomePage(),
); }}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("FittedBox Widget")),
body: Center(
child: FittedBox(
fit: BoxFit.contain,
child: Row(
children: <Widget>[
Image.asset('asssets/image1.jpg'),
const Text("This is a FittedBox widget")
],
), )), ); }}
اﻟﻨﺎﺗﺞ
. اﻟﺘﺎﺑﻊ ﻟﮫ وﻓﻘًﺎ ﻟﺠﺰء ﻣﻦ اﻟﻤﺴﺎﺣﺔ اﻟﻤﺘﻮﻓﺮةwidget ﯾﺴﻤﺢ ﺑﺘﻐﯿﯿﺮ ﺣﺠﻢwidget ﻋﺒﺎرة ﻋﻦ:FractionallySizedBox
. ﺗﺎﺑﻊ ﻟﮫ إﻟﻰ اﻻرﺗﻔﺎع واﻟﻌﺮض اﻟﺠﻮھﺮﯾﯿﻦwidget ﯾﺴﻤﺤﺎ ﻟﻨﺎ ﺑﺘﻐﯿﯿﺮ ﺣﺠﻢwidgets ھﻤﺎ:IntrinsicWidth وIntrinsicHeight
. ﺑﺘﺤﺪﯾﺪ ﺣﺠﻤﮭﺎ ﻓﻘﻂ ﻋﻨﺪﻣﺎ ﺗﻜﻮن ﻏﯿﺮ ﻣﻘﯿﺪةwidget ﺗﺴﻤﺢ ﻟﻨﺎ ھﺬه:LimitedBox
widget اﻟﺘﺎﺑﻊ ﻟﮫ ﻋﻤﺎ ﯾﺤﺼﻞ ﻋﻠﯿﮫ ﻣﻦ أﺣﺪ الwidget ﯾﺴﻤﺢ ﺑﻔﺮض ﻗﯿﻮد ﻣﺨﺘﻠﻔﺔ ﻋﻠﻰwidget ﻋﺒﺎرة ﻋﻦ:OverflowBox
. اﻷﺻﻞwidget اﻟﻔﺮﻋﻲ ﺑﺘﺠﺎوزwidget ﯾﺴﻤﺢ ﻟﻞ، ﺑﻤﻌﻨﻰ آﺧﺮ.اﻟﺮﺋﯿﺴﻲ
:ﻣﺜﺎل
import 'package:flutter/material.dart';
:ﻣﺜﺎل
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Multiple Layout Widget',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
); }}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Container(
alignment: Alignment.center,
color: Colors.white,
child: Stack(
children: <Widget>[
// Max Size
Container(
color: Colors.blue, ),
Container(
color: Colors.pink,
height: 400.0,
width: 300.0, ),
Container(
color: Colors.yellow,
height: 220.0,
width: 200.0, )
], ), ),
);
}}
:اﻟﻨﺎﺗﺞ
Building Complex Layout 3,2,6
ﯾﺘﯿﺢ.single and multiple child layout widgets ﺳﻨﺘﻌﻠﻢ ﻛﯿﻒ ﯾﻤﻜﻨﻚ إﻧﺸﺎء واﺟﮭﺔ ﻣﺴﺘﺨﺪم ﻣﻌﻘﺪة ﺑﺎﺳﺘﺨﺪام أدوات ﺗﺨﻄﯿﻂ،ﻓﻲ ھﺬا اﻟﺠﺰء
.( إﻧﺸﺎء ﺗﺨﻄﯿﻂ واﺟﮭﺔ ﻣﺴﺘﺨﺪم ﻣﻌﻘﺪ ﻋﻦ طﺮﯾﻖ ﺗﺪاﺧﻞ اﻟﺼﻔﻮف واﻷﻋﻤﺪة داﺧﻞ اﻟﺼﻔﻮف واﻷﻋﻤﺪةlayout) ﻟﻚ إطﺎر اﻟﺘﺨﻄﯿﻂ
ﺑﺒﻌﺾmain.dart ﺗﺤﺘﺎج أوﻻً إﻟﻰ اﺳﺘﺒﺪال رﻣﺰ ﻣﻠﻒ، ﻟﮭﺬا اﻟﻐﺮض.دﻋﻮﻧﺎ ﻧﺮى ﻣﺜﺎﻻً ﻟﻮاﺟﮭﺔ ﻣﺴﺘﺨﺪم ﻣﻌﻘﺪة ﻣﻦ ﺧﻼل إﻧﺸﺎء ﻗﺎﺋﻤﺔ اﻟﻤﻨﺘﺠﺎت
.اﻟﺘﻌﻠﯿﻤﺎت اﻟﺒﺮﻣﺠﯿﺔ اﻟﺘﺎﻟﯿﺔ
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo Application',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: const MyHomePage(title: 'Complex layout example'),
);
}}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Product List")),
body: ListView(
padding: const EdgeInsets.fromLTRB(3.0, 12.0, 3.0, 12.0),
children: const <Widget>[
ProductBox(
name: "iPhone",
description: "iPhone is the top branded phone ever",
price: 55000,
image: "iphone.jpg"),
ProductBox(
name: "Android",
description: "Android is a very stylish phone",
price: 10000,
image: "android.jpg"),
ProductBox(
name: "Tablet",
description: "Tablet is a popular device for official meetings",
price: 25000,
image: "tablat.jpg"),
ProductBox(
name: "Laptop",
description: "Laptop is most famous electronic device",
price: 35000,
image: "laptop.jpg"),
ProductBox(
name: "Desktop",
description: "Desktop is most popular for regular use",
price: 10000,
image: "desktop.jpg"),
],
)); }}
class ProductBox extends StatelessWidget {
const ProductBox(
{Key? key,
required this.name,
required this.description,
required this.price,
required this.image})
: super(key: key);
final String name;
final String description;
final int price;
final String image;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(2),
height: 110,
child: Card(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Image.asset("assets/$image"),
Expanded(
child: Container(
padding: const EdgeInsets.all(5),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(name,
style:
const TextStyle(fontWeight: FontWeight.bold)),
Text(description),
Text("Price: $price"),
],
)))
]))); }}
. ﻣﺜﻞ اﻟﺼﻮرة واﻻﺳﻢ واﻟﺴﻌﺮ واﻟﻮﺻﻒ، اﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ ﺗﻔﺎﺻﯿﻞ اﻟﻤﻨﺘﺞwidget ProductBox ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء،ﻓﻲ اﻟﻜﻮد أﻋﻼه
etc.، Image، Text، Card، Expanded، Column، Row،Container : اﻟﺘﺎﻟﯿﺔwidgets اﺳﺘﺨﺪﻣﻨﺎ ال،ProductBox widget ﻓﻲ
:( اﻟﺘﺎﻟﻲlayout) ﻋﻠﻰ اﻟﺘﺨﻄﯿﻂwidget ﺗﺤﺘﻮي ھﺬه
:اﻟﻨﺎﺗﺞ
import 'package:flutter/material.dart';
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyStatefulWidget(),
);
}
}
@override
// ignore: library_private_types_in_public_api
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Scaffold Example'),
),
body: Center(
child: Text('We have pressed the button $_count times.'),
),
bottomNavigationBar: BottomAppBar(
shape: const CircularNotchedRectangle(),
child: Container(
height: 50.0,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => setState(() {
_count++;
}),
tooltip: 'Increment Counter',
child: const Icon(Icons.add),
),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
drawer: const Drawer(
elevation: 20.0,
child: Column(
children: <Widget>[
UserAccountsDrawerHeader(
accountName: Text("javatpoint"),
accountEmail: Text("[email protected]"),
currentAccountPicture: CircleAvatar(
backgroundColor: Colors.yellow,
child: Text("abc"),
),
),
ListTile(
title: Text("Inbox"),
leading: Icon(Icons.mail),
),
Divider(
height: 0.1,
),
ListTile(
title: Text("Primary"),
leading: Icon(Icons.inbox),
),
(ListTile
title: Text("Social"),
leading: Icon(Icons.people),
),
(ListTile
title: Text("Promotions"),
leading: Icon(Icons.local_offer),
)
],
),
),
;)
}
}
1. Pointers
2. Gestures
Pointers 1,3,6
اﻟﻤﺆﺷﺮات ) (Pointersھﻲ اﻟﻄﺒﻘﺔ اﻷوﻟﻰ اﻟﺘﻲ ﺗﻤﺜﻞ اﻟﺒﯿﺎﻧﺎت اﻷوﻟﯿﺔ ﺣﻮل ﺗﻔﺎﻋﻞ اﻟﻤﺴﺘﺨﺪم .ﯾﺤﺘﻮي ﻋﻠﻰ أﺣﺪاث ﺗﺼﻒ ﻣﻮﻗﻊ وﺣﺮﻛﺔ اﻟﻤﺆﺷﺮات ﻣﺜﻞ
اﻟﻠﻤﺴﺎت واﻟﻔﺄرة واﻷﺳﻠﻮب ) ( style، mice،touchesﻋﺒﺮ اﻟﺸﺎﺷﺎت Flutter .ﻻ ﯾﻮﻓﺮ أي آﻟﯿﺔ ﻹﻟﻐﺎء أو إﯾﻘﺎف إرﺳﺎل أﺣﺪاث اﻟﻤﺆﺷﺮ )pointer-
.(eventsﺗﻮﻓﺮ Flutterأداة ﻣﺴﺘﻤﻊ ) (Listener widgetﻟﻼﺳﺘﻤﺎع إﻟﻰ أﺣﺪاث اﻟﻤﺆﺷﺮ) (pointer-eventsﻣﺒﺎﺷﺮةً ﻣﻦ widgets layerﺗﻨﻘﺴﻢ
أﺣﺪاث اﻟﻤﺆﺷﺮ إﻟﻰ أرﺑﻌﺔ أﻧﻮاع ﺑﺸﻜﻞ أﺳﺎﺳﻲ:
:Tap وﯾﻌﻨﻲ ﻟﻤﺲ ﺳﻄﺢ اﻟﺸﺎﺷﺔ ﺑﺄطﺮاف اﻷﺻﺎﺑﻊ ﻟﻔﺘﺮة ﻗﺼﯿﺮة ﺛﻢ رﻓﻌﮭﺎ .ﺗﺤﺘﻮي ھﺬه اﻹﯾﻤﺎءة ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onTapDown
onTapUp
onTap
onTapCancel
:Double Tapﯾﺸﺒﮫ إﯾﻤﺎءة اﻟﻨﻘﺮ ،ﻟﻜﻨﻚ ﺗﺤﺘﺎج إﻟﻰ اﻟﻨﻘﺮ ﻣﺮﺗﯿﻦ ﻓﻲ وﻗﺖ ﻗﺼﯿﺮ .ﺗﺤﺘﻮي ھﺬه اﻹﯾﻤﺎءة ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onDoubleTap
:Dragﯾﺘﯿﺢ ﻟﻨﺎ ﻟﻤﺲ ﺳﻄﺢ اﻟﺸﺎﺷﺔ ﺑﺄطﺮاف أﺻﺎﺑﻌﻚ وﻧﻘﻠﮭﺎ ﻣﻦ ﻣﻜﺎن إﻟﻰ ﻣﻜﺎن آﺧﺮ ﺛﻢ ﺗﺤﺮﯾﺮھﺎ Flutter .ﺗﺼﻨﻒ اﻟﺴﺤﺐ إﻟﻰ ﻧﻮﻋﯿﻦ:
.1اﻟﺴﺤﺐ اﻷﻓﻘﻲ ) :(Horizontal Dragﺗﺴﻤﺢ ھﺬه اﻹﯾﻤﺎءة ﻟﻠﻤﺆﺷﺮ ﺑﺎﻟﺘﺤﺮك ﻓﻲ اﺗﺠﺎه أﻓﻘﻲ .وﯾﺤﺘﻮي ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onHorizontalDragStart
onHorizontalDragUpdate
onHorizontalDragEnd
.2اﻟﺴﺤﺐ اﻟﻌﻤﻮدي ) :(Vertical Dragﺗﺴﻤﺢ ھﺬه اﻹﯾﻤﺎءة ﻟﻠﻤﺆﺷﺮ ﺑﺎﻟﺘﺤﺮك ﻓﻲ اﻻﺗﺠﺎه اﻟﺮأﺳﻲ .وﯾﺤﺘﻮي ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onVerticalDragStart
onVerticalDragStart
onVerticalDragStart
: Long Pressھﺬا ﯾﻌﻨﻲ ﻟﻤﺲ ﺳﻄﺢ اﻟﺸﺎﺷﺔ ﻓﻲ ﻣﻜﺎن ﻣﻌﯿﻦ ﻟﻔﺘﺮة طﻮﯾﻠﺔ .ﺗﺤﺘﻮي ھﺬه اﻹﯾﻤﺎءة ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onLongPress
:Panﯾﻌﻨﻲ ﻟﻤﺲ ﺳﻄﺢ اﻟﺸﺎﺷﺔ ﺑﻄﺮف اﻹﺻﺒﻊ ،واﻟﺬي ﯾﻤﻜﻦ أن ﯾﺘﺤﺮك ﻓﻲ أي اﺗﺠﺎه دون ﺗﺤﺮﯾﺮ طﺮف اﻹﺻﺒﻊ .ﺗﺤﺘﻮي ھﺬه اﻹﯾﻤﺎءة
ﻋﻠﻰ اﻷﺣﺪاث اﻟﺘﺎﻟﯿﺔ:
onPanStart
onPanUpdate
onPanEnd
:Pinchﯾﻌﻨﻲ اﻟﻀﻐﻂ ﻋﻠﻰ )ﺗﺤﺮﯾﻚ إﺻﺒﻌﻚ وإﺑﮭﺎﻣﻚ أو ﺟﻤﻌﮭﻤﺎ ﻣﻌًﺎ ﻋﻠﻰ ﺷﺎﺷﺔ ﺗﻌﻤﻞ ﺑﺎﻟﻠﻤﺲ( ﻋﻠﻰ ﺳﻄﺢ اﻟﺸﺎﺷﺔ ﺑﺎﺳﺘﺨﺪام إﺻﺒﻌﯿﻦ
ﻟﺘﻜﺒﯿﺮ اﻟﺸﺎﺷﺔ أو ﺗﺼﻐﯿﺮھﺎ.
Gesture Detector 4,6
ً
ﻣﻤﺘﺎزا ﻟﺠﻤﯿﻊ أﻧﻮاع اﻹﯾﻤﺎءات ) (gesturesﺑﺎﺳﺘﺨﺪام .GestureDetector widget Flutterﯾﻮﻓﺮ widgetﯾﻌﻄﻲ دﻋ ًﻤﺎ
اﻟﻔﻜﺮة اﻷﺳﺎﺳﯿﺔ.ﯾُﺴﺘﺨﺪم ﺑﺸﻜﻞ أﺳﺎﺳﻲ ﻻﻛﺘﺸﺎف إﯾﻤﺎءات اﻟﻤﺴﺘﺨﺪم، (non-visual) ﻏﯿﺮ ﻣﺮﺋﯿﺔwidget ھﻮ ﻋﺒﺎرة ﻋﻦGestureWidget
. ﺣﯿﺚ ﯾﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻠﻤﺎت ﻓﻲ ُﻣﻨﺸﺌﮫ ﻷﺣﺪاث اﻟﻠﻤﺲ اﻟﻤﺨﺘﻠﻔﺔstateless widget ﻟﻜﺎﺷﻒ اﻹﯾﻤﺎءات ھﻲ
ﺣﯿﺚ ﯾﻘﻮم إطﺎر،( ﻓﻲ ﻣﻜﺎن ﻣﻌﯿﻦ ﻋﻠﻰ اﻟﺸﺎﺷﺔmultiple gesture detectors) ﻗﺪ ﯾﻜﻮن ھﻨﺎك اﻟﻌﺪﯾﺪ ﻣﻦ ﻛﺎﺷﻔﺎت اﻹﯾﻤﺎءات،ﻓﻲ ﺑﻌﺾ اﻟﻤﻮاﻗﻒ
ﺗﺤﺪد اﻹﯾﻤﺎءة اﻟﺘﻲ ﺳﯿﺘﻢ اﻟﺘﻌﺮف ﻋﻠﯿﮭﺎ ﺑﻨﺎ ًء ﻋﻠﻰ أي ﻣﻦ ﻋﻤﻠﯿﺎت ردGestureDetector widget .اﻟﻌﻤﻞ ﺑﺘﻮﺿﯿﺢ اﻹﯾﻤﺎءة اﻟﺘﻲ ﯾﺠﺐ اﺳﺘﺪﻋﺎؤھﺎ
.(callbacks are non-null) اﻻﺗﺼﺎل اﻟﺨﺎﺻﺔ ﺑﮭﺎ ﺗﻜﻮن ﻏﯿﺮ ﻓﺎرﻏﺔ
ﻟﮭﺬاGestureDetector اﻟﺒﺴﯿﻂ وﺗﺤﺪﯾﺪ ﻛﯿﻔﯿﺔ ﻣﻌﺎﻟﺠﺔonTap() دﻋﻮﻧﺎ ﻧﺘﻌﻠﻢ ﻛﯿﻒ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪام ھﺬه اﻹﯾﻤﺎءات ﻓﻲ ﺗﻄﺒﯿﻘﻨﺎ ﻣﻦ ﺧﻼل ﺣﺪث
. إﻟﯿﮫonTap() ﺛﻢ إﺿﺎﻓﺔ وظﯿﻔﺔ، وﺗﺼﻤﯿﻤﮫ وﻓﻘًﺎ ﻟﻠﻤﻮاﺻﻔﺎت اﻟﻤﻄﻠﻮﺑﺔ،box widget ھﻨﺎ ﺳﻨﻘﻮم ﺑﺈﻧﺸﺎء.اﻷﻣﺮ
.main.dart ﺟﺪﯾﺪ واﺳﺘﺒﺪل اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻓﻲ ﻣﻠﻒFlutter ﻗﻢ ﺑﺈﻧﺸﺎء ﻣﺸﺮوع:ﻣﺜﺎل
import 'package:flutter/material.dart';
@override
MyHomePageState createState() => MyHomePageState();
}
ﻓﻲ اﻟﺼﻮرة أﻋﻼه ،ﯾﻤﻜﻨﻚ رؤﯾﺔ زر ذو ﺣﻮاف ﻣﺴﺘﺪﯾﺮة ﻓﻲ ﻣﻨﺘﺼﻒ اﻟﺸﺎﺷﺔ .ﻋﻨﺪﻣﺎ ﺗﻨﻘﺮ ﻋﻠﻰ ھﺬا ،ﻓﺈﻧﮫ ﯾﺘﺼﺮف ﻛﺰر ،وﯾﻤﻜﻦ رؤﯾﺔ اﻹﺧﺮاج ﻓﻲ
وﺣﺪة اﻟﺘﺤﻜﻢ.
ﻀﺎ ﻣﺠﻤﻮﻋﺔ ﻣﻦ widgetsاﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﺴﻤﺢ ﻟﻚ ﺑﺎﻟﻘﯿﺎم ﺑﺈﯾﻤﺎءات ﻣﺤﺪدة وﻣﺘﻘﺪﻣﺔ .ھﺬه widgetsﻣﺬﻛﻮرة أدﻧﺎه:
ﯾﻮﻓﺮ Flutterأﯾ ً
:اﻟﻜﻮد
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
title: 'Multiple Gestures',
home: Scaffold(
appBar: AppBar(
title: const Text('Multiple Gestures'),
),
body: const DemoApp(),
),
),
);
}
class DemoApp extends StatelessWidget {
const DemoApp({super.key});
@override
Widget build(BuildContext context) {
return RawGestureDetector(
gestures: {
AllowMultipleGestureRecognizer: GestureRecognizerFactoryWithHandlers<
AllowMultipleGestureRecognizer>(
() => AllowMultipleGestureRecognizer(),
(AllowMultipleGestureRecognizer instance) {
instance.onTap = () => print('It is the parent container gesture');
},
)
},
behavior: HitTestBehavior.opaque,
//Parent Container
child: Container(
color: Colors.redAccent,
child: Center(
//Now, wraps the second container in RawGestureDetector
child: RawGestureDetector(
gestures: {
AllowMultipleGestureRecognizer:
GestureRecognizerFactoryWithHandlers<
AllowMultipleGestureRecognizer>(
() => AllowMultipleGestureRecognizer(), //constructor
(AllowMultipleGestureRecognizer instance) {
instance.onTap = () => print('It is the nested container');
},
)
},
//Creates the nested container within the first.
child: Container(
color: Colors.amber,
width: 250.0,
height: 350.0,
),
),
),
),
);
}}
class AllowMultipleGestureRecognizer extends TapGestureRecognizer {
@override
void rejectGesture(int pointer) {
acceptGesture(pointer);
}
}
:اﻟﻨﺎﺗﺞ
. وﺳﯿﻈﮭﺮ اﻹﺧﺮاج اﻟﺘﺎﻟﻲ ﻋﻠﻰ وﺣﺪة اﻟﺘﺤﻜﻢ اﻟﺨﺎﺻﺔ ﺑﻚ، اﺿﻐﻂ ﻋﻠﻰ اﻟﻤﺮﺑﻊ اﻷﺻﻔﺮ،ﺑﻌﺪ ذﻟﻚ