因此，顫振實際上是一個
您可能會說很多東西，這是SDK軟件開發工具包
對於創建移動2d應用程序，如果您
計劃製作3D應用程序時某些遊戲無法正常運行
你，但如果你打算一些二維應用程序
的應用程序在應用程序商店中，然後飄動是你的事，我說
撲是一堆東西，最重要的部分可能是
框架與您將要使用的編程語言一起提供
使用實際上稱為“飛鏢”，您無需知道它就可以
在本課程中學習它，但顫振是一個框架
dart和框架只是一組實用程序函數類
您可以在該編程語言中使用的對象，因此您無需編寫
一切從零開始的顫動都帶有大量的
例如，預構建的小部件，而這些小部件僅僅是ui元素
例如按鈕，滑塊，標籤等，這樣您就不必編寫所有內容
從頭開始，但您可以使用所有這些工具
從flutter框架中添加自己的代碼並添加自己的邏輯
增強代碼或從中獲得的功能
並使用這些功能構建本機應用程序，以便您
用一種語言編寫代碼才是核心
您不必學習Java或Swift或其他任何東西
您編寫一種語言飛鏢，並使用flutter框架功能
在編寫該代碼時，您可以找出您的應用在哪個平台上運行
在需要執行不同代碼的情況下
這是我將在課程中及最終完成的內容
我們使用flutter包的第二部分
到目前為止，我已經討論了框架部分的內置功能
現在，顫振不僅是飛鏢代碼，還是一套工具，可讓您
測試您正在設備上編寫的應用
具有很酷的功能，例如每當您更改時都會自動重新加載
代碼中的某些內容，並且您正在模擬器上運行該應用程序
自動重新加載非常方便，它可以
您構建工具來構建代碼，從而構建飛鏢
代碼上傳到您可以上傳到的本機應用中
蘋果應用商店或Google Play商店，以便將您的Dart代碼編譯到
本機代碼也是如此
框架和許多有用的工具
飛鏢上積累的這種非常清晰的顫動是
編程語言的混亂然後提供了這個框架
與飛鏢連接良好或已建立
在dart上，它提供了許多實用程序功能以及所有這些小部件
然後顫振的第二部分是sdk
工具等，您需要構建和測試您的應用程序
這是撲朔迷離這是您將從頭開始學習的內容
您不需要了解任何信息，我們將與
dart構建本機移動應用並交付
他們到應用商店
顯然，我們現在想潛入並開始，我們將
我們將安裝Flutter並編寫我們的第一個Flutter應用
在幾秒鐘後，但首先我想強調一下如何撲撲的應用程序
看起來它的核心架構是什麼
概念是很重要的，要理解顫動可以
所謂的小部件，一旦我們
在下一個模塊中與他們一起工作
深入了解他們，但在撲撲應用程序的結尾
用flutter構建的應用只是一棵小部件樹
您可以將其視為用戶界面的小部件
元素整個應用是一個ui元素，然後包含其他元素，例如
標籤欄，也許一些文本字段
用戶可以輸入一個按鈕來確認選擇，所有
可能會佈置在一些不可見的小部件中，例如
列或行以將元素放置在彼此上方或彼此相鄰的位置
然後您獲得了可見的小部件，例如按鈕等，因此您進行了結構化
像這樣的您的應用程序還可以包含平台
差異，這意味著我們當然使用一個
代碼庫，這是我們使用的第三個重要內容
一個代碼庫來編寫ios和android應用程序，但是
這些平台並不完全相等，為您提供了一些工具來找出
您在哪個平台上運行，以便在需要時使用
可以執行不同的代碼，所以一個代碼庫但是
區分提供給您的平台
開發人員的強大力量，因為您擁有以下優勢
通常使用一種設置，但如果需要，您仍然可以編寫
不同的代碼，這就是更扁平的核心架構
現在讓我快速了解一下小部件
這是我們將在本課程中構建的完成應用程序的屏幕截圖
在此屏幕上，我們可以識別很多小部件，實際上甚至
比我在此處標記的小部件更多，例如在
底部的按鈕是一個小部件，然後
有兩個子小部件：相機圖標和添加圖像文本
這就是您如何構建flutter應用程序甚至整個應用程序的方式
提到的是一個小部件，可以為您提供
樹上有一個根小部件，包裹了應用程序，然後有小部件
針對您的應用中可能包含的不同頁面，但這意味著您可以
導航顯然您將在此中學到
課程，然後在每個頁面上都有子窗口小部件
他們中的一些人進行一些佈局，其中一些人渲染
視覺效果，例如按鈕文本字段等
所以這是如何工作的，顯而易見的問題是
然後如何將其編譯為本地代碼，因為我們
編寫飛鏢代碼，我們在顫動的幫助下做到了
api提供實用功能的框架
內置小部件預先設置樣式的小部件我們添加自己的代碼構建自己的小部件
是的，我們實際上做了很多，最後我們希望獲得一個可以在
android和ios flutter可以幫助我們
dart代碼被編譯為本地代碼
對於這些平台，Flutter SDK可以做到這一點
它具有可以進行此編譯的工具，因此您真的很酷，不必
擔心您不必寫任何東西
您可以使用這些抖動功能來編寫本機設備代碼，從而編寫飛鏢代碼
而flutter sdk將進行非常有用的編譯
現在，這就是flutter為您做的事情，這就是它如何編譯的
這樣我們就得到了一個非常酷的設置，可以讓我們編寫
非常強大和靈活的應用程序
是時候創建我們的第一步了，是時候安裝flutter並設置
本課程需要的開發環境
然後啟動我們的第一個應用程序並在
仿真器，所以讓我們在下一個演講中
因此，讓我們先安裝flutter，然後實際安裝會有所不同
Mac OS和Windows或本課程的其餘部分
我們編寫的代碼等等都是一樣的
但是這裡的安裝有所不同，因此
在本視頻中，我們將設置顫振以及所有周圍的包裝和
我們需要Mac的依賴項，在下一個視頻中，我們將做
對於Windows相同，因此如果您是Windows用戶，則可以
只需跳過此視頻，如果您是Mac用戶，則可以跳過
下一個視頻，讓我們繼續進行Mac設置，然後
在flutter.io上，您只需單擊
開始使用，然後選擇在Mac OS上安裝
順便說一句，如果您使用的是Linux，則步驟幾乎相同，但是您可以
也點擊在Linux上安裝以查看詳細信息
這就是我通常會推薦的
詳細地完成這些步驟，好是
您可以在這裡閱讀它們，我強烈建議
在這裡跟隨並閱讀這些內容，同時您也可以觀看此視頻
或在您進行安裝過程中
因為一些微小的步驟可能會隨著時間而改變，而b這是
解決問題的好方法，因為可能存在某些問題
您忽略了視頻，然後可以在其中簡單地​​閱讀
本文，所以讓我們首先繼續
仔細檢查系統要求，我們需要操作系統mac os
顯然我們的磁盤上有足夠的可用空間，然後
我們依賴這些命令行工具，這些工具實際上應該都可用
默認情況下現在git可能不是，所以這是一個好主意
在開始之前下載它，您只需搜索
google上的git，然後首先實際選擇
實際上是找到下載頁面的第二個鏈接
只需根據您所在的位置選擇mac os或linux
然後下載應自動開始
如果不是，您可以簡單地單擊此處
這將下載一個安裝程序，您只需步行即可安裝
git這是您計算機上的版本管理系統
現在您不需要使用該版本管理系統，而是可以使用flutter
這就是為什麼在幕後的原因
在安裝程序的幫助下安裝git後即可使用
我第二次向您顯示的下載內容可以繼續執行以下步驟，並且
下一步是在時間點實際下載flutter
記錄此最新版本為0.3.2 beta
當您觀看此內容時，可能會有更高版本的
但是我們編寫的代碼仍然相同
當然，現在下載我在這裡看到的最新版本
這個只需將其下載到您的計算機上，
這可能需要一段時間，如您所見，這是一個很大的文件
所以我會跳到這個已經
為我下載的安裝剛剛完成
您現在可以簡單地將其解壓縮，並可以使用看到的命令來執行此操作
在這里或只需單擊下載的
只需在文件所在的文件夾中打開文件
已下載，只需在其下單擊它，然後
現在將其解壓縮，這可能需要花費幾秒鐘的時間，因為
解壓縮後的大文件
您有一個flutter文件夾，現在應該將其複製到您的某個位置
想要現在存儲這個，這個扁平的東西是一個完整的
工具集是sdk軟件開發套件
需要開發Flutter應用程序，其中包括很多
依賴撲朔迷離的需求，所以這真的是一個中央包裝
您應該將其存儲在計算機中的程序，然後可以將其複製到任何位置
您的機器現在我在想要的工具文件夾中
擁有它，所以我就將它拖到那兒，然後隨著顫動
添加到該文件夾後，我們可以繼續進行
安裝或使用它，所以更平坦的工具實際上是一種工具
我們從命令行執行，因此我們需要將其添加到路徑中
路徑基本上是一個全局變量，可以確保程序更扁平
或確保可以通過命令行訪問任何程序，而我們
想要配置在此處找到的flutter程序
現在可以在那裡找到我們可以執行此命令
在命令行中，如果我們將其導航到新創建的水平文件夾中
或者我們做了一些在文章後面看到的內容
在這裡，我們現在永久性地更新路徑，這是如何工作的
為此，您應該進入用戶文件夾，然後在其中打開
查看隱藏文件的設置，然後您應該看到該bash配置文件
現在您可以簡單地用普通文本打開它
編輯應用程序或使用您選擇的任何文本編輯器
現在，如果您使用的是文字調整，請確保
您正在以純文本模式而非富文本格式查看此內容
所以如果你打開這個，讓我把它做大一點
您可以編輯此文件，這基本上可以配置pof設置
用於Mac或Linux上的命令行工具的終端
現在我們要在這裡添加一些內容
您可以在安裝步驟中找到的這一行
只需將其添加到底部，我們需要替換
這部分與實際路徑在此文件夾工具上的文件夾路徑
現在取決於我們的機器
在您為我拖動的位置上可以找到
用戶，而不是我的用戶名，然後有一個開發文件夾
然後我在其中創建了一個工具文件夾，再次您必須選擇
您的彈出按鈕將拖曳工具拖到那裡
您也可以通過單擊此處獲取信息來查看
然後您可以看到在我的案例用戶中找到的位置
我的用戶名開發工具，只需保存該文件
然後在打開後在Mac或Linux上打開普通的終端應用
那你應該可以跑撲醫生
現在，這是一個工具，它還會檢查您是否需要做點什麼
撲朔迷離的工作，如果
您正確設置了Flutter安裝
順便說一下，我的安裝已經使用了30天，我們可以在這裡忽略它
因為我們知道我們剛剛下載了最新版本
在我的情況下為0.3.2，這一切都很好，現在看起來已經很好
在這裡，因為我實際上有一個不錯的設置，我會
仍然引導您完成此處的其餘步驟
因此，我們更新了路線，現在運行了撲醫生2。
現在我們需要做的是配置系統
能夠為此構建ios和/或android應用
如果您要構建ios應用程序，並且要在ios和
最終為該平台構建它，您需要安裝xcode
蘋果的發展理念也絕對
即使您使用flutter且不使用本機，構建ios應用程序所需的工具
為此的代碼，因此可以從以下位置下載以安裝xcode
Mac應用商店，一旦安裝
您需要確保可以使用所謂的xcode命令行工具
這可以通過簡單地複制和粘貼來完成
這個命令到你的終端，所以你可以簡單地運行這個
系統可能會提示您在此處輸入密碼
然後它可能會或可能不會做什麼取決於您是否
已經配置好了，它可能會提示您接受
完成此步驟後，您可以繼續執行第三步
並執行此命令以接受
xcode build這是我們將要使用的構建工具
現在在這裡，您只需滾動到底部即可加速
敲擊幾次，然後在下方輸入同意
現在有了這種方式，我們可以繼續，我們可以啟動ios
模擬器，它只是在我們的iPhone上運行
機器可以用這個命令啟動你
也可以從xcode中啟動它，但是我會簡單地啟動
用此命令打開它破折號一個大寫的模擬器
s，現在應該做的是調出這個ios模擬器
現在，這是設備正在運行，您可以
從中更改您在此處模擬的電話的類型
菜單設備，然後是ios，然後選擇
現在最喜歡的設備，並啟動並運行什麼
你可以做的是可以啟動你的Flutter應用
通過在命令提示符下運行flutter run
現在，為此，我們需要一個流暢的應用程序
因為現在我們只安裝了flutter但還沒有設置flutter
應用一個新項目，所以讓我們快速地做到這一點
您應該首先導航到要創建的文件夾
將您的flutter應用程序導航到該文件夾後
您要在其中創建新flutter項目的位置運行flutter create
然後是名稱，例如第一個下劃線應用
重要此項目名稱不得包含破折號或空格
它應該改用下劃線，否則只能是一個字
按Enter，這將建立一個新的奉承項目
在該指定位置的新子文件夾將項目保留為
精確可能需要幾秒鐘
完成後，您可以導航到這個新創建的文件夾
在我的情況下，它被命名為第一個下劃線應用，然後按
撲動運行輸入此命中輸入並與ios模擬器一起啟動並運行
您應該能夠看到該flutter應用程序
在該ios模擬器上暫時或第一次
順便說一句，運行此過程可能需要花費幾秒鐘的時間
在這裡，我們現在很重要，請保持該進程運行不要退出
您可以使用控件c退出它，但您想保持其運行狀態，以便
隨時可以重建您的項目並立即發貨
每當您在設備中進行某些更改時，都會將該新版本添加到設備
代碼，這樣您應該會看到第一個顫動
在iPhone上運行的應用程序，您可以點擊該加號按鈕以查看
一個增加的計數器，這是一個顫振的應用程序
為您創建的工具我們當然還沒有編寫任何代碼
現在很酷，我們實際上將對其進行一點編輯
看看我們如何能夠與第一個Flutter應用很好地合作
但顯然我們也想為Android構建
讓我們回到這些安裝文檔，我們在這裡完成了ios設置
如果要部署到真正的ios，至少現在要模擬器
設備，您可以按照以下步驟操作，實際上您將需要插入
您的真實iPhone，然後再次執行這些步驟以
先安裝自製軟件，然後再安裝這些額外的工具
能夠一次將您的應用發送到真實的iPhone
完成後，您可以繼續執行以下步驟
並且您將需要對xcode進行一些調整，以便能夠將您的應用發佈到
現在您將要使用的是您真正的設備
在本課程的稍後部分，我們將實際在
真實設備，並在最後部署應用程序，但
再次隨意已經經歷了這些
如果您想在真實設備上運行此步驟，它們非常簡單
現在，我將暫時轉到android，為此，我們將
需要像xcode一樣的android studio
官方ide，包含ios的所有構建工具
應用程式android studio與android相同
因此，請點擊該鏈接以轉發到
android studio的下載頁面，在該頁面上它應該會自動
向您展示Mac OS的下載，因此您可以輕鬆
點擊這裡下載android studio接受
這些許可協議，然後下載
將其存儲在您選擇的任何文件夾中，這又是一個
較大的文件，所以讓我們等待它完成之前
我們現在繼續下載確實完成了，您可以
只需執行該文件，它將為您啟動安裝程序
我可以在這里關閉ios模擬器
現在，Android Studio安裝程序在Mac上非常簡單
只需將其拖到該應用程序文件夾中
然後它將復製或安裝該工具到該文件夾中
需要幾秒鐘，因為它還會解壓縮該文件夾並
一旦完成，讓我們回到撲撲
安裝頁面完成後，您需要
啟動android studio並完成設置
嚮導來配置一切並安裝所需的一切
現在您可能還會收到安全警告，指出android的開啟
工作室被封鎖，因為它來自
嗯，來自互聯網，而非來自確定的開發商
您可以通過Mac安全性和隱私設置隨時打開它
最終這應該調出這個設置嚮導
現在在第一個屏幕上單擊下一步，單擊自定義
現在在下一個屏幕上再次在這裡，您可以選擇編輯器
主題，如果您想使用淺色或深色則不需要
android studio作為本課程的編輯器，實際上我
不會，但是你可以，所以我在這里和達庫拉一起去
但這完全取決於您，在下一個屏幕上，請確保還要檢查
android虛擬設備在此處的安裝選項下
默認安裝路徑應該是所有右鍵單擊下一步
完成，現在這將下載一堆東西
並安裝開發Android應用程序所需的所有SDK和工具，以及
這些將在背後被撲打使用，這就是為什麼我們需要它們
所以讓我快進直到完成
現在，這可能需要幾分鐘，所以請放心
它下載和安裝的時間更長
現在事情在這里為我完成了設置
讓我們單擊完成，然後您可以單擊打開
現有的android studio項目現在在那裡，只需導航到該文件夾
您剛剛創建新的Flutter應用的地方
就我而言，這是第一個下劃線應用
文件夾選擇整個文件夾，然後單擊“打開”
這將啟動該項目的android studio
第一次打開時現在打開
它實際上會掃描該文件夾，所以讓我們等待它
完成，它實際上應該建議您兩件事
在那兒，它找到了有關插件的信息
在這裡，您可以簡單地展開它，然後單擊配置插件
它實際上還向您顯示了有關dart文件的一些信息，我們對此不予理for
現在，現在選擇那個flutter插件，
單擊確定，然後單擊是也進行安裝
它在那裡詢問的那個黑暗的插件
此後，只要重新啟動即可立即重新啟動
您可能會在此處底部看到有關ide和插件更新的消息，如果
你也不是很好，就我而言，我確實得到了一個，所以我會簡單地
立即更新以安裝所有SDK的最新版本和構建工具
我可能需要，然後再次下載
再次需要花費幾秒鐘，現在完成所有操作後，我點擊
在這裡完成，現在這是我們的撲撲項目
我將以另一種方式打開它，在其中也更容易閱讀
現在一秒鐘，我們將不在這里處理該代碼，而是讓我們運行
為此，我們可以在模擬器上
工具，然後代表的AVD Manager
android虛擬設備讓我們打開該工具
在這裡，我實際上得到了一些預配置的設備
您至少應該擁有一個與
通過安裝創建的其他一些設備，您始終可以創建一個
單擊底部的該按鈕以創建新的虛擬設備
然後您可以選擇要使用的設備，假設像素
2現在繼續選擇您的api版本，通常最高的是一個好的版本
選擇或默認情況下選擇的那個我應該說
不一定是最先進的，而是這一
現在再次單擊“下一步”，以模擬性能
您應該選擇硬件仿真以獲得更快的仿真器其他設置
只需點擊完成就可以了，這應該創建
該新模擬器，然後您可以通過單擊該播放按鈕來啟動它
現在就在這裡，這將調出您的android
模擬器現在我們當然可以使用該模擬器
在那也運行我們的flutter應用程序並運行它，我們需要做的是
我們需要回到先前已經運行過的命令行
在iPhone上，如果仍然有舊的，請重複執行flutter run命令
運行，如果您可能沒有
關閉舊的模擬器，您隨時可以退出正在運行的進程
使用ctrl c，讓我們按一下flutter run來運行它
一旦該模擬器完成，我們的android模擬器
啟動，它將使用
與android一起安裝的android sdk的幫助
工作室，並且第一個構建過程可以再次
需要幾秒鐘，隨後的將更快，現在
它應該啟動並運行，讓我們開始吧，這就是我們的
設備，這是我們的Flutter應用程序，我們可以
單擊加號按鈕可增加此計數器的效果，因此
是我們如何安裝flutter並在ios和
android模擬器現在，如果您想在真實環境中運行它
設備，您可以按照文檔中概述的步驟進行操作
但是我們當然也會在真實設備上一起運行
在本課程的後面，現在讓我們集中討論編輯器
我們將用它來處理這段代碼
我絕對不會使用android studio編輯器
沒有錯，這是完全成熟的
使用flutter插件即可在其中工作
如果您想使用它，則可以遵循整個課程
沒有問題的ID我會退出
因為我有另一個更喜歡的ID
這是Visual Studio代碼，您可以從codevisualstudio.com安裝它
就像android studio一樣是免費的
它會自動為您顯示正確的下載選項
對於Mac，您只需下載即可
下載完成後，您將擁有
您可以執行的文件，它將引導您完成安裝程序
安裝應該非常簡單，沒有什麼特別的
一旦安裝了Visual Studio，就可以輕鬆完成，也可以輕鬆完成
打開它運行它，然後在開始屏幕中選擇
打開文件夾或選擇文件打開以打開您的flutter項目，以便
我將打開第一個應用程序文件夾，這將
現在在這個想法中變得討人喜歡
現在我將實際使用此ID
ide的外觀，這是您可以更改外觀的深色主題
根據代碼首選項顏色主題，但我會安裝一些
額外的擴展以使顫動
更加令人愉快，可以添加擴展名
通過查看擴展或使用該快捷方式
或使用該側邊欄，您可能會在左側看到
擴展只是Visual Studio代碼的附加組件，它使
我們會增強編碼體驗，您只需在此處搜索
flutter查找您的官方flutter插件，或
擴展名點擊安裝在那裡，這也將
將dart擴展安裝為依賴項
安裝完成後，您可以點擊reload來重新加載Visual Studio代碼
該擴展添加了一個額外的擴展，我將使用
在整個課程中這是完全可選的
那就是現在的材質圖標主題，與
顫動它只是使圖標看起來更好我已經安裝了它
您可以從此頁面安裝它，一旦完成安裝
但更重要的是，您可以切換回資源管理器
在此處使用該快捷方式或通過單擊菜單
現在您回到了項目結構中，現在您已經做好了充分的準備
處理顫動，例如在我們的主飛鏢中
文件，我們可以操作第一個應用程序，例如，轉到
在這裡增加計數器方法並更改該計數器加號
計數器等於計數器加2。現在應該增加
現在，每次點擊計數器為2十分酷
事情是你可以點擊保存在這裡，然後回到你的
命令提示符，您在其中運行了顫振運行，然後只需用平坦的運行命中r
進程正在運行，所以不要在運行時退出它，它會
熱重新加載您的flutter應用程序，這意味著它
將在模擬器上即時加載它，而無需
如果它被卡住，您需要按一下就重建它
移位r進行完全重建並重新加載
運行該過程，讓我們回到我們的應用程序，它看起來
就像什麼都沒有改變，我們甚至有舊櫃檯
但是如果現在單擊加號，它將增加兩個
這已經顯示了使用顫振工作有多酷，以及它多麼容易
是通過熱重裝來開發的，這也是
我將在整個課程中使用的設置
我會教大家有關飛鏢的知識和一些技巧
現在，通過整個課程中的ide，我們來看看Windows的工作原理
還是對您來說無關緊要，因為您僅使用Mac
讓我們繼續進行和弦，並進一步深入顫振
在上一個視頻中，如果您使用Windows，我們現在為Mac安裝了flutter
現在讓我們為Windows 2安裝它。如果僅使用Mac，則可以
跳過此視頻，以便先在Windows上安裝Flutter
讓我們訪問flutter.io，然後點擊“開始”，然後
選擇在Windows上安裝，您將看到所有安裝
詳細步驟，我強烈建議一切順利
通過這些步驟以及視頻，因為
他們不能改變一個或另一個細節
在未來，那麼以這種書面形式很容易看到或看到
此外，很容易錯過一步，因此這很棒
這個視頻的伴侶，所以首先讓我們看一下
系統要求我們在機器上安裝顫振
需要Windows 7或更高版本的磁盤空間
這裡提到的這兩個工具之一
Windows的powershell或git現在git是一個版本控制系統，甚至
如果您不主動使用它，顫振會使用它，所以在這裡我將安裝
通過單擊該鏈接的Windows git，然後我們有機會下載該鏈接
來自該git頁面的git工具
自動為您的機器提供正確的下載
下載它，然後逐步完成安裝程序
現在在安裝程序中，您可以選擇要安裝git的位置
然後只需點擊下一步並安裝該工具
現在非常重要，您可以單擊幾次
而且大多數默認設置都可以
要注意的重要一件事是在此屏幕上
您應該使用Windows命令提示符下的use get不要使用以下命令之一
其他兩個選項使用中間一個，這也是
現在在官方文檔中提到過
並保留所有其他默認值，然後全部單擊下一個
上一次，它將在您的計算機上安裝git
您現在可以關閉它並繼續執行這些設置說明
下一步是實際安裝Flutter SDK
您可以從此下載鏈接中獲得
現在重要的是，撲動的版本將來當然會改變
現在是0.3.2.beta，它已經可以生產了
您在本課程中學習的代碼仍然正確
將來即使您要下載其他版本
但請確保下載您在此處看到的版本
因此，無論您選擇什麼版本，現在都可以下載該版本
這將需要幾秒鐘，因為它很大
文件，下載後即可解壓縮此文件夾
到您要安裝顫動工具的地方
現在重要的是flutter工具不是您的移動應用程序項目
這是一個SDK軟件開發工具包，您可以在全球範圍內安裝
機器，您將在機器的不同位置使用它
創建新的扁平項目並與您創建的項目一起使用
建立它們以便在模擬器上運行它們
因此將flutter解壓縮到該目錄中，解壓縮後就可以進入
該目錄，在我的情況下，我還將
將所有文件移到一個文件夾中，以便全部保存
直接在flutter文件夾中
然後您可以在此處執行該flutter console.bat文件
現在這將打開一個命令提示符
已經使用了抖動，您可以在這裡停下來並繼續進行水淹
命令並顯示您的android模擬器等
並始終在此處打開該工具以運行抖動
運行或構建應用所需的命令
但是我希望能夠使用普通的命令提示符
因此，我們在這里關閉更平坦的控制台，然後繼續並確保我們
可以從正常的Windows命令提示符下使用flutter命令
為此，我們現在需要更新路徑，而該路徑只是全局路徑
Windows用來從中找到可以使用的工具的變量
命令行，因為我們選擇了自定義文件夾
我們在哪里安裝了顫振或將其拆包到哪裡
我們需要讓Windows知道那是哪裡
您可以通過打開控制面板來做到這一點
然後轉到用戶用戶帳戶，然後只需單擊“更改我的帳戶”
現在在打開的窗口中打開環境變量
找到您可以選擇的路徑條目以及您在哪裡
然後可以單擊立即編輯，您可以在此處添加新位置
您想要通過單擊此處的新路徑執行的工具
然後在這裡您需要輸入flutter文件夾的路徑
因此，您解壓縮的文件夾只需進入Windows資源管理器，
導航到bin子文件夾，準確地說就是
需要將路徑複製到該bin子文件夾，然後
通過單擊“新建”將其添加到您的路徑變量中
將其添加到打開的空白空間
然後點擊確定，現在您可以運行更扁平的命令
從正常命令提示符下單擊確定，並確保關閉任何命令
提示您可能遇到問題時可能已經打開了已經重啟的窗口
之後，一旦您做了所有您可以帶來的
在正常的命令提示符下，只需在其中輸入flutter
現在這可能會向您顯示有關安裝有點警告
較老的則可以忽略，因為我們實際上只是安裝了最新的
版本，這樣就可以了，但事實是您看到了
不是像撲撲之類的東西沒有被認出來，這意味著我們做到了
成功將其添加到我們的路徑中，我們可以使用該flutter命令
現在，我們命令提示符中的命令行工具即可使用
下一步我們要做的就是建立
Android Studio這是Google為構建Android提供的官方SDK
應用程序，儘管我們不會編寫本機代碼
它包括所有的SDK和構建工具
顫振也將需要，所以只需轉到com斜線developer.android.com或使用
在更扁平的安裝文檔中找到的鏈接
並在那裡下載android studio版本，它將自動為您提供
適用於您的操作系統的正確版本
您需要先接受協議，然後才能繼續
並開始下載，它將
還需要一些時間，因為下載量很大
所以讓我快速前進到完成該步驟的地步
現在，一旦下載完成，只需執行一下即可
可執行文件，安裝程序將啟動
現在，您可以繼續確保選擇android虛擬設備
作為您要安裝的組件，儘管打鉤很重要
之後您可以選擇位置
您要在其中安裝android studio的地方，可以使用
在此處默認設置或在計算機上選擇自己的位置
然後您可以直接點擊下一步，這將再次需要
秒，一旦完成，您就可以開始
android studio，並且第一次啟動它
嚮導將出現，這使您可以
現在在該嚮導中配置它，然後單擊下一步
在這裡選擇自定義，下一步是
您現在可以選擇ui主題，如果您想
使用Android Studio構建您的Flutter應用
你可以但是我會用不同的
參加本課程，我將在這裡討論黑暗主題，但是您當然可以
可以在下一步中選擇自己喜歡的外觀，這很重要
檢查android虛擬設備是否選中了此選項，因為
我們將需要能夠啟動此類虛擬設備
選中該複選框，選擇您的android sdk位置
使用默認值或創建您自己的路徑，然後
只需點擊下一步
現在這將安裝一些東西，您可以通過以下方式開始安裝
在這裡完成，實際上將花費很長時間
因為它下載並安裝了很多軟件包
所以不用擔心這可能需要幾分鐘
20分鐘之類的東西，我會回來的
一旦安裝完成，對我來說
您可以關閉安裝程序，然後
現在再次調出android studio在這裡您可以打開現有的
Android Studio項目，這將是你的撲朔迷離
您正在使用的應用程序，但我們還沒有這樣的應用程序
所以我們的下一步實際上是創建一個這樣的應用程序
我們將需要一個仿真器來查看它，因此，請確保我們完成所有任務
要求，您可以在官方網站上看到它們
docs和順便說一句，如果您想安裝
您在真實設備上運行的應用程序，稍後我們會做
在課程中，您當然可以完成所看到的步驟
如果這對您現在很重要
但同樣，我們將在本課程的稍後部分針對大多數
當然我們將在模擬器上工作，所以在模擬器上
您會看到，重要的是我們必須在我們的硬件上啟用硬件加速
機器單擊該鏈接以了解更多信息，並查看如何
打開它，然後我們可以回到android studio
現在我們需要一個撲朔迷離的項目來繼續
所以回到命令提示符，您現在應該
導航到要創建新的flutter項目的文件夾
您可以使用cd命令在Windows中瀏覽以更改
您在命令提示符下所在的目錄
現在，請確保創建一個文件夾並導航至所需的文件夾
存儲您的Flutter應用程序，一旦您進入該文件夾，就可以
通過運行創建一個新的flutter應用程序和項目
flutter創建，然後命名您的項目
現在很重要，名稱不能包含破折號或類似的內容，也不能
空格詞應與
下劃線，或者您只使用一個單詞，以便顫動創建第一個下劃線
應用程序是我在這裡創建此命令的命令
項目，現在這將在
您在命令提示符中所在的位置並配置您的第一個Flutter項目
如您所見，它在那裡創建了幾個
文件，一旦完成，就可以在android中打開項目
通過單擊打開現有的android studio項目工作室
在那兒，您應該導航到剛創建的文件夾
並在我的包皮文件夾中打開它，這樣
在我的情況下，基本上打開您剛剛創建的第一個下劃線應用程序的項目
這將在android studio中打開它，然後在我們執行任何操作之前
讓我們提出這個虛擬設備，您可以在android studio中做到這一點
轉到工具，然後代表Android虛擬設備的AVD管理器
經理，然後在打開的窗口中
您可以通過單擊啟動新的虛擬設備
創建虛擬設備，您還應該
默認情況下有一個可以使用的，但讓我向您展示如何創建一個新的
一個在那裡，您可以選擇自己的藍圖
基本上是關於常規硬件和佈局配置文件
在下一個屏幕上的像素2中，您選擇圖像
您要使用的android版本，建議不要使用
最新版本，但使用最新版本
就我而言的穩定版本Oreo API級別27
通常是默認情況下選中的那個
現在在下一個屏幕上再次點擊下一步，請確保選擇
圖形的硬件加速下降
您可以查看高級設置，但通常不需要
更改這些，完成所有操作即可完成
並使用它創建新的虛擬設備，您可以通過以下方式啟動它
點擊右側的播放按鈕，這將打開
屏幕上的虛擬設備會彈出一個
您機器上的android手機現在可以這麼說
有了這個運行，我們還不能運行我們的flutter應用程序
因為我們仍然需要為一件事情做一些事情，所以我們需要安裝缺少的物品
依賴缺少的插件，單擊此處的安裝插件
在頂部，它告訴您有關丟失的dart插件的信息
你可以順便也跳過這個
安裝了flutter插件，但在這裡我分兩個步驟進行
因此，一旦安裝程序完成，請安裝該dart插件
重啟android studio，一旦重啟就應該
實際上在底部獲得一條消息，提示您
新插件擴展該消息，然後單擊
配置插件，那裡會出現混亂
插件只需單擊“確定”並接受
現在它也會安裝flutter插件
並已安裝了dart插件，因此您實際上可以
只有一步完成後，您才需要重新啟動
ide再執行一次，讓我們重新啟動ide
再次
現在我們已經配置了android studio
為了支持抖動，現在我們仍然看不到模擬器
頂部，因此我們仍然無法啟動我們的應用程序
讓我們暫時退出模擬器，使其首先運行
遵循安裝說明，並確保立即安裝該Google USB驅動程序
僅對在真實設備上運行才重要
但仍然可以進行設置，這樣就可以正常工作了
稍後，請點擊該鏈接，您會看到那裡並安裝USB
驅動程序，您可以在android studio中執行此操作
通過回到它，他們將
工具SDK經理，然後在SDK管理器中轉到SDK工具，然後
選擇Google USB驅動程序，然後點擊確定或應用
並安裝它，您還需要在此處接受許可協議
現在安裝了它，如果您安裝了它，那麼您還需要做一件事
您的android sdk在操作系統上的位置與
我在嚮導中建議的一個，您需要添加另一個
環境變量，您還可以看到，如果回到
命令提示符並運行flutter Doctor一個告訴您的工具
這裡缺少什麼告訴我它無法
找到android sdk，因此我將回到我的
控制面板以及用於用戶帳戶的用戶帳戶
然後更改我的環境變量，首先我們需要添加品牌
新變量，因此請在此處單擊“新建”，然後將該變量命名為
這個名字很重要android下劃線首頁全部大寫
確保現在不要在此處添加已定義名稱的錯字
定義一個值，而這僅僅是指向的路徑
android sdk，您可以單擊瀏覽目錄到
選擇android SDK的位置，然後只需選擇您的位置
在嚮導中或在打開的嚮導中選擇的
或當您打開android studio時運行的
在我的情況下，這是android文件夾，應該是該文件夾，其中有一個
平台模擬器等子文件夾，只需用根文件夾單擊確定即可
選擇，現在您還需要添加一些內容
到您的路徑變量，因此再次選擇它，然後單擊編輯
在這裡您需要添加兩個新條目，第一個應該是
百分號，然後是android home，以便您剛創建的變量名
完全一樣地寫，然後再寫一個百分號
反斜杠工具，然後您需要添加一個小時
條目也是百分號的android首頁
反斜杠平台工具確保其編寫完全與您在此處看到的一樣
現在添加了視頻的視頻正常，然後重新啟動
命令提示符，現在還重新啟動虛擬設備
通過退出它可能會擦拭用戶數據，如果
您遇到了重新啟動然後點擊綠色播放按鈕的問題
再次，這將再次啟動模擬器
現在您應該在下拉菜單中看到它
現在您可以按該運行按鈕來運行您的Flutter應用
現在在該虛擬設備上執行此構建過程，該構建過程將在
首次運行該設備可能需要幾分鐘
不用擔心，一旦完成，您應該會看到Flutter應用
在該模擬器上運行，您可以點擊此處的加號按鈕
增加計數器真棒我們的顫振應用程序
最終在模擬器上運行，我們當然會盡快更改此應用
現在，正如我所說，我不會使用android studio
作為這裡的編輯，因此我也想向您展示一種運行方式
如果沒有android studio，可以轉到命令
提示導航到您所在的文件夾
擁有第一個應用程序或進入您創建的該項目文件夾，
在那兒，您可以運行撲動運行，這將
現在執行與您所做的完全相同的操作
內部命令或單擊按鈕
在android studio中，但是如果您不通過android studio進行操作
生成應用程序並將其發送到模擬器並運行
在那裡，這實際上是我將如何運行我的
本課程其餘部分的應用程序，因為我不會使用android studio
您可以使用任一種方法，但可以使用flutter run
將具有諸如熱重裝等優點，我將在第二部分介紹
現在我將使用哪個編輯器，然後我將使用
您可以從code.visualstudio.com獲取Visual Studio代碼
這是一個自由思想，也有一個擴展，可以提供出色的抖動
支持，您可以從該頁面下載它，並且
它將自動為您提供適合您的操作系統的版本
您可以簡單地遍歷安裝程序，這非常簡單
沒什麼特別的，只需在您的計算機上安裝ide
現在，一旦您將其安裝在自己喜歡的位置
您可以啟動它，然後在ide中單擊打開文件夾或
從左上角的文件菜單中選擇打開選項
然後只需選擇您創建的第一個下劃線應用文件夾
現在這是您的Flutter應用，為了能夠與之合作
很好，我們應該添加一個所謂的擴展名
所以我們可以在該插件上添加一個插件
您可以通過單擊此附加功能來安裝擴展
左側的圖標，或在頂部的菜單中選擇視圖擴展
然後只需搜索flutter，即可安裝您在此處找到的擴展程序
這是官方的奉承擴展名，還將安裝飛鏢
擴展，因為這將是一個依賴項
並且一旦安裝，您只需要重新啟動ide
要立即安裝，我將在整個過程中使用一個額外的擴展名
當然，那是我可以主題的與顫動無關的材料
發展，就像我能看到的那樣
這是完全可選的，我只想在這裡顯示它，以便您
不要奇怪為什麼我的圖標看起來與默認圖標不同
一旦安裝，如果需要，您可以再次
重新加載想法，並最終我們可以對我們進行更改
我激活該新主題後出現顫動代碼
您可以在打開的項目的lib文件夾中看到您的flutter代碼
在main.dart文件中，您會看到負責
目前正在模擬器上運行的應用
在那裡搜索增量計數器下劃線增量計數器方法
並在置位狀態下將下劃線計數器加到下劃線計數器
等於下劃線計數器加兩個，這應確保我們實際上
每當我們點擊加號時，計數器就會增加2
不再進行更改，返回命令提示符並進行
確保洪水運行過程仍在運行不要退出
它可以使用ctrl c退出，但是
只要你在發展，就應該堅持下去
運行，因為然後您可以在運行該進程的情況下命中r
熱重新加載您的應用程序，這意味著您添加的更改已推送到
應用程序，無需立即重建
有時這會失敗，然後您可以按shift r進行完全重載和完整
重建，如果完成，則可以使用ctrl c退出該過程
那天的發展，所以我按了r，如果我回到
我的模擬器在這裡您可以看到我現在可以增加兩個
而不是一個，這是我們要做的第一個小改變
當然更多，但這是我們的Windows安裝完成
做了很多工作，但現在我們準備繼續
當然要跳得更深一些
我們設置環境，並創建和編輯
我們潛水前的第一個撲撲應用程序
深入了解下一個模塊及其後的模塊
讓我簡要地談談顫振的一些替代方法當然不是
創建本地移動應用程序的唯一方法是三種
我想討論的替代方案的第一個是你寫的真實
通過學習Java和Android並迅速實現目標C的本地應用程序
對於各個平台，這樣做的好處是
完全訪問所有功能，您無需擔心
尋找一些解決方法以使該功能在您的應用中正常工作
巨大的缺點是您必須完全學習兩個
不同的語言，這需要很多時間，
可能是所有的錢，所以這是一個巨大的缺點和動盪
實際上可以使您獲得相同的結果，所以不是最好的
另一種可能是，除非您有一個非常
專業應用程序，您絕對需要最新的前沿功能
而且您最終還是要寫很多本機代碼
因為您可以將flutter與本機代碼連接，所以我們將在
當然，這是一種替代方法，但顫振有很多
優勢的第二種選擇是您創建了一個
漸進式網絡應用程序，現在您可能不知道它是什麼
網站本質上不是本地移動應用程序
通過應用商店進行分發，而是一個網站，
訪問一些設備功能，瀏覽器正在發展，並為您提供更多
以及對這些功能的更多訪問權限，但您無法控制使用哪個瀏覽器
用戶將要使用，所以也許他們的用戶正在使用瀏覽器
該功能不支持該功能，因此這是創建應用的好方法
在某些情況下您會掉到井裡
功能較低的版本，但是如果您要構建的應用程序需要能夠
拍好照片，然後您可能需要一個
移動應用程序現在，第三種替代方法為您提供了
本機移動應用程序就像flutter一樣，但是它使用了不同的方法
使用諸如離子科爾多瓦之類的解決方案，您可能沒有聽說過，但
他們所做的是給您一個真正的本機應用程序，但給您一個包裝器
可以在該應用中運行瀏覽器
因此，您創建了一個Web應用程序，該應用程序隨後將在瀏覽器中運行
保證能夠使用某些功能
ionic cordova使您可以使用這些功能，但您仍然擁有一個網站
很酷的事情是，如果您是Web開發人員，這將非常易於使用並且
用它看起來非常容易創建很棒的應用程序
不錯，但性能當然要差一些
比構建真正的本機應用程序或最終擁有真正的本機應用程序時
就像您對顫動所做的那樣，因為顯然所有內容都在瀏覽器中運行
還是這樣，你有額外的一層
顫抖，您將獲得真正的本機應用程序，因為所有內容均已編譯為本機代碼
因此性能更好，因此抖動
這不是最糟糕的解決方案，顫振絕對是一個很酷的學習工具
這應該可以開發本機移動應用程序
比過去更輕鬆
您可能在第一個小應用程序中就看到了它
撲使用材料設計，現在看起來像這樣
在不同的Google Apps物料設計中已經看到
是由Google開發的設計系統，儘管不是Google的風格
而是高度可定制的
當然，您會看到可以設置不同的顏色來更改
小部件的外觀，您可以用它做很多事情，這很重要
理解顫振包含了這種物質
雖然可以設計，但是您可以進行微調和調整
您可以添加或刪除陰影的一切都可以更改顏色
這樣就可以使其成為您的設計，而無需在此處創建Google應用
理解非常重要，但理解也很重要
您將要使用該材料設計
對於android和ios雖然有一些
特定於ios的ios小部件
看，我將在需要的情況下提供關於這四種情況的完整模塊
但通常要準備使用該材料設計
並根據您的要求進行調整，您將了解它的工作原理
在那個過程中顯然材料設計
內置於顫振中並被顫振所包圍，您會看到術語
非常重要，因為整個flutter應用程序通常
材料應用程序，然後在其中添加各種小部件
所有這些都消除了，現在該潛入顫抖並學習
關於其核心功能，我們將盡快進行，但
這是一件很重要的事情，撲動是一個移動的目標
它正在積極開發中，並且仍在不斷發展和快速發展
現在已經穩定並標記為可以生產
弗拉基米爾（Vladimir）團隊致意，所以我們不應該期望發生重大製動變化
但可以添加新功能
我會盡力使您保持最新狀態，但這也是一個好主意
定期檢查官方文檔以保持更新，請按照以下步驟操作
在總結課程的最後強調，
了解，因為顫動是相對較新的
我們已經有了一套不錯的第三方軟件包
添加某些功能並使某些事情變得更容易
但我們可能會看到添加了更多第三方軟件包
隨著水井變老而向生態系統發展
此外，我們有一些最佳做法和模式，我會盡我所能
他們並向他們展示這門課程，但顯然一些新的模式可能
將來會出現，所以在這裡也是一個好主意
到目前為止，並準備切換到其他
當它們變得更穩定或某事成為最佳實踐時的模式
最後但並非最不重要的一點是，將會有錯誤。
本課程，我們將把它們修復在一起，我們將找到解決方法
而且您會看到，顫振幾乎可以實現所有目標
有時您需要發揮創造力，但這並不一定是您的問題
仍然節省了很多時間，因為您不必學習兩個
不同的語言，這些語言也會有一些錯誤
但要準備迎接一些錯誤並修復您可能擁有的一些東西
期望開箱即用，但這可能永遠不會
在以後查看時更改
但重要的是要了解顫振是在
積極的發展，那是非常重要的，這是一件好事
這意味著新功能提高了穩定性，
不斷發展的迴聲系統
所有這些都讓我們結束第一個模塊
讓我向您展示本課程的基本內容
在下一課程模塊中入門，我們將有一個
看看這些小部件是什麼我們如何創建自己的小部件
一起工作，總的來說，我們將深入探討所有
Flutter框架和Dart的基礎知識
語言，您將在此過程中逐步學習
了解如何調試Flutter應用程序以及如何在以下設備上運行它
Android設備上的iPhone上的模擬器如何完成所有操作
那是因為顯然要測試和調試您的應用
現在是整個開發週期的重要組成部分
之後，您將學習如何呈現內容列表
以及如何以高性能方式做到這一點，您將學到
如何呈現條件內容，如何呈現某些內容
如果滿足某些常見情況
一旦完成，您將學到它在此模塊中的工作方式。
是時候深入研究Flutter應用程序或任何其他應用程序通常具有的功能了
一頁以上，您將學習如何在這些頁面之間導航
如何來回傳遞數據如何添加標籤
如何添加網站抽屜所有有趣的東西
完成後，我們將深入探討用戶輸入以及如何處理它
顯示一個文本字段並對按鍵做出反應，以便在用戶鍵入時
下一步，我將深入研究
我將說明您在哪裡可以找到所有可用小部件的小部件
如何佈局頁面，並總體上更深入地了解整個概念
然後進入您需要了解的所有內容
是時候返回用戶輸入了，但是以更高級的方式
您將學習如何添加論壇，基本上這只是一組輸入
以及如何驗證用戶輸入的是該電子郵件地址實際上是一個電子郵件地址
我們將在此模塊中找到答案，然後看一下一些改進
對於我們正在構建的應用程序，因為正如我已經提到的，我們將構建整個
應用程序貫穿本課程，在這裡我們將對它進行反思
第一次並改進一些功能，然後我們將深入研究新功能
特別是模型和狀態管理
這聽起來很抽象，但是到現在為止，您會明白我的意思
這實質上意味著我們如何處理應用程序中的數據
我們將在此模塊中學習它，之後我們將不僅僅使用
設備，我們正在運行該應用程序，但您還將學習如何將其發送到服務器
這樣您就可以將其存儲在數據庫中，或者如何獲取數據
您可以與網絡上的一些後端進行通信，
然後是時候進行一些用戶身份驗證了，因為大多數
應用需要經過身份驗證的用戶，您將學習如何編輯
如何添加註銷如何管理用戶身份驗證狀態
在本模塊中，該是一些本機設備功能的時候了
我們如何獲得用戶位置我們如何渲染地圖
我們如何訪問設備的相機拍照或獲取圖像
畫廊這兩個問題的所有答案
然後，我們即將結束的模塊
在談論動畫之前，如何淡化和滑動元素
您可以設置自己的路線轉換，而不使用默認的
在本模塊中涵蓋之後，我們將進行一些拋光和
錯誤修復，因為該應用程序即將完成
然後我們將深入研究平台特定的代碼
您如何確定在哪個平台上運行ios？
完成後，您將在本模塊中學習它
我們將學習如何添加本機代碼，以便您可以
實現某些功能，該功能可能無法在抖動中使用
您也找不到第三方軟件包
如何通過編寫本機代碼來實現
您可以自己編寫Java或Swift或目標C代碼，然後
將其連接起來撲通撲通，您可能不需要那麼頻繁
但是擁有該功能非常有用，我想了解它也很好
然後我們將發布完成的應用程序
將學習如何將其構建用於生產
以及如何將其運送到您將成為的應用商店
一個真正的開發者此後將涉及很多內容
讓我們潛入並潛入讓我解釋一下你如何
充分利用課程，因為這對我來說真的很重要
顯然可以觀看視頻，但以您的速度進行
如果我走得太快則暫停視頻，回到某個概念，這不是
清除使用udemy播放控件來加快速度
我加快或減慢速度，因為我試圖找到合適的平衡
我不想讓你無聊我不想在每次之後都停下來五分鐘
一句話，但顯然我不想匆忙
因此，請根據您的需求調整我的速度，並確保因此獲得
大部分的代碼也是這樣做的，這是練習
真的是您學習最多的方法，因為觀看視頻很棒
自己練習編寫代碼，這非常
有用，所以這是觀看時的好補充
視頻和我也提供了大量資源
附加到每個模塊的最後一堂課，您將找到我的源代碼
以及進一步的鏈接，現在源代碼不是
一個您已經可以運行的項目，但它只是我們編寫的所有飛鏢代碼
我們添加的所有軟件包，以便您可以將其與您的軟件包進行比較
或暫時將其替換為問題來解決問題，因為大多數
可以通過簡單地比較代碼來解決問題
因此，如果您絕對有某些東西，我現在就提供
無法解決，或者如果您在邏輯上不了解某些內容
您可以在“質量檢查”部分發布問題，我會盡力回答課程
有關的問題要盡我所能，但我也想
鼓勵你幫助同學們回答
問題不是因為我懶，而是因為
挑戰您思考您所想的概念
您明白，所以絕對可以幫助我們的學生
回答問題，不要害怕打錯
回答可能發生的事情，您會得到糾正，然後您了解更多
所以幫助其他學生，這是學習更多內容的好方法
並運用您學到的東西並實踐它們
這種方法可以保證，現在
是時候離開這個模塊並深入研究小部件了
基礎知識並編寫大量代碼
歡迎使用本模塊，我們將最終陷入混亂
和飛鏢，以及我們如何使用顫振來打造驚人的效果
本模塊中的移動應用程序，我將帶您逐步了解所有必需的核心基礎知識。
了解顫動，主要是關於小部件
您將學到的是用於構建uis的核心構建塊
Flutter應用程序的用戶界面，您將學習如何使用內置的
小部件的組織方式以及如何創建自己的小部件
當然，您不僅會從理論上學到這一點，還將利用它們來開始
已經建立了課程項目，在此期間，我們還將潛水
關於飛鏢語言的其他一些基礎知識，
Flutter使用的編程語言，我不會只用飛鏢打擾您
簡介我相信學習起來會更好
同時您還學習顫動，因此您將學習所需的一切
在了解飛鏢的同時還學習顫振以及如何使用它來構建應用程序
因此，讓我們開始深入研究，創建一個新的flutter應用程序
我們的課程項目，讓我們開始吧
創建一個新的flutter應用程序，我將再次使用flatter命令
自從我安裝了顫振後，該命令當然仍然可用
sdk我們在第一個課程中一起做到了
模塊，因此請確保一定要通過
安裝後，您可以運行得更順暢，但不僅僅是顫動，還可以創建
從該更扁平的sdk命令，然後只需選擇任何項目名稱
你想像撲撲課程只是重要的一環
請注意，請勿在此處使用破折號或類似
你的名字應該是一個單詞，或者如果你知道
多個單詞用下劃線隔開
現在點擊回車，它將創建一個新文件夾
在運行此命令的目標位置，因此請確保您正在運行
將其放在正確的目標位置，它將在該文件夾中填充一個
組成您的android和ios項目的大量文件
當然是撲朔迷離，所以讓我們等待它完成之前
然後，我們使用ide或編輯器將其打開並進行工作
在代碼上完成了項目的創建，
現在，您會看到可以在其打印在此處的日誌中運行的命令，但是我會
現在不運行它們，而我想
打開新創建的項目和創建的文件夾，因此
我在這裡用視覺打開了一個項目
工作室代碼一個免費的想法，你可以使用我也
在第一個課程模塊中向您展示了您當然可以全部使用android studio
作為替代方案，只需確保在兩個方面都
所有添加的flutter插件或擴展
以獲得最佳的顫振開發經驗
我還打開了集成終端，您可以通過它打開
在此處查看集成終端或該快捷方式
現在我可以在其中運行flutter run命令
因為這已經導航到項目文件夾
但是還有另一種運行方式
為了運行它，我們需要一個虛擬設​​備，我們需要一個
模擬設備或真實設備，但我將使用模擬器，所以讓我
現在就快速啟動一個，以使用該模擬器
android studio但是不寫代碼而是去工具
那裡的AVD經理我們可以管理我們的虛擬設備
你看我已經有幾個設備，你可以隨時創建一個新設備
在左下方創建新的虛擬設備
單擊所有這些設置，選擇可能需要下載的圖像
確保不要使用最新的，而要使用最新的
而是穩定的，然後通過簡單地創建一個設備
創建設備後，嚮導即可
在這裡選擇它，然後從右側的播放按鈕開始，
是我用android studio做的唯一一件事
現在在這裡，我啟動了該虛擬設備，
運行並現在返回Visual Studio代碼
我提到還有另一種啟動我們的應用程序的方式
然後去調試，然後您可以選擇開始
調試或使用快捷方式或不啟動
調試或使用該快捷方式，這還將啟動Flutter應用
在連接的虛擬或真實設備上，您
可以選擇是否要進入調試模式，我將介紹
一個單獨的模塊，或者現在就可以很好地啟動您的應用程序
可能會提示您選擇環境
如果您安裝了
這些工具的擴展，因此選擇“飛鏢”和“顫振”，現在
進入調試視圖，您可以隨時返回視圖
資源管理器或返回該文件資源管理器的快捷方式
現在它將構建您的flutter應用程序並將其發送
到該虛擬設備，所以讓我們等待它完成
在第一次啟動時，這可能需要一段時間，並且順便說一句
頂部的控制面板，您可以隨時重新啟動或退出
或暫停它，稍後我們將學習
現在如何使用該調試工具，讓我們等待它
開始，這就是開始
我們開始的應用程序，這是
應用程序將無法正常運行，我們將從
確實如此，所以讓我們在下一個講座和講座中進行
之後
所以我們啟動了flutter應用程序並使其運行，並保持該過程在此處運行
現在轉到lib中的main.dart文件
文件夾並刪除其中的所有內容，因為我想
從頭開始，真正地教你如何工作
在我們開始編寫代碼之前，如何開始運行這樣一個混亂的應用程序
在那裡，讓我快速向您介紹我們在此處找到的其他文件夾和文件
idea文件夾是帶有一些基本配置的android studio文件夾
不要刪除它，但是您也不需要這樣做
無論您使用的是Visual Studio代碼還是Android Studio
android和ios文件夾很重要，因為它們保存
本機代碼和應用程序構建過程的重要部分
您需要為這些平台很好地構建應用程序
您很少在這些文件夾中工作，儘管有時您不得不
我會在什麼時候告訴你，但這是必需的
因為它們保存了該源代碼所使用的
構建過程以及Flutter代碼，以
構建這些本機應用程序build文件夾是您現在可以忽略的文件夾
在那裡，您最終找到了構建源代碼，這是
生成過程lib文件夾在您的位置
編寫整個flutter應用程序，所以這是文件夾
我們將在此文件夾中進行編寫
dart和flutter代碼，測試文件夾將允許您編寫
自動化測試，但這不是我現在要關注的重點，
這裡的其他文件基本上是用於
git（如果您使用的是版本控制系統）
然後為您不需要的fld sdk的sdk進行一些配置
要更改pubspec.yaml文件中配置的內容
總體項目及其依存關係
這是一個重要的文件，稍後我們將添加第三方程序包
例如，當我們添加相機時，
我們可以使用設備的攝像頭，並且我們也會不時地重新審視它
是時候更改某些配置，例如添加靜態資產了
現在保留文件原樣，開始
回到main.dart文件，在這裡我現在想寫一些
啟動我們的應用程序的基本代碼
main.dart文件是非常重要的文件，您不應重命名
這是因為在構建項目時會出現抖動
將查找該main.dart文件，並在該文件中查找特殊文件
執行以實質上啟動您的應用程序的功能
在設備上，因此您可以將其視為整個dart代碼
編譯並與android或ios捆綁在一起
代碼，以便將其捆綁到一個應用程序中，該應用程序將交付給您
本地設備，然後在此應用程序中的此設備上，
main.dart文件或其中一個特定功能
首先執行，它正在尋找的功能
在main.dart文件中也稱為main現在是一個函數
如果您是編程的新手，
本質上是您定義的代碼塊
立即執行，但需要調用
在執行中創建了一個函數
輸入名稱，例如main和此特定功能
應用啟動時正在尋找哪種顫動
通常必須命名為main您可以命名
功能如何，但是由於flutter是
尋找它，所以您鍵入該函數的名稱
然後加上括號，在這裡您可以指定任何參數
該函數將接收的參數
功能可以在其內部使用的數據
主要功能但是沒有收到任何
現在函數體是應該執行的代碼
然後通過添加花括號來定義它
每當調用主函數時，此處的代碼就會執行
如果要調用它，您會這樣稱呼它
只需輸入main即可在此處執行main函數
但是對於這個特殊功能，我們不會稱之為
顫振會自動為我們做到這一點，這就是為什麼您必須
將其命名為main以及為什麼應將其命名為main.dart
現在在這里文件，您基本上啟動您的應用程序，這意味著
您開始呈現所有繁重的用戶界面
您將其掛接到操作系統中，以此類推，這是通過android完成的
和ios文件，您可能會說，但要在屏幕上顯示一些內容
您必須在該主要功能中做一些事情
那是你需要附加的東西
屏幕上的小部件現在是什麼
顫振是關於小部件的一切小部件基本上是構建塊用戶
您可以說出與您創建良好用戶的界面組件
界面，以便用戶在有抖動時在屏幕上看到的內容
應用程序，以便在移動設備上運行的移動應用程序
它通常由多個小部件組成，例如應用程序欄，導航
頂部的欄可能是標題圖片，也可能是列表
有幾個列表項，所有這些都是分開的
小部件，它們通常包含其他小部件，例如此處的列表
它包含列表項作為子窗口小部件
頁面本身甚至是一個小部件，腳手架小部件，我們還將
在整個課程中自行創建，甚至整個應用都包含在內
一個根小部件，所以小部件實際上就是這些
用戶界面組件，但不僅僅是視覺效果
它們都包含邏輯，例如按鈕小部件將
不僅顯示按鈕，還可以定義應該
點擊按鈕時發生，這就是您如何思考顫動
您可以通過不做繁重的工作來構建Flutter應用
通過創建用戶界面將其掛接到操作系統中
以及屬於該用戶界面的邏輯
諸如選擇項目之類的事情將事物上傳到服務器
從服務器獲取數據並將其呈現到屏幕
這就是您使用這些小部件所做的，因此
您可以將您的Flutter應用視為這些小部件的一棵樹
正如我剛才所說，您有一個根小部件來包裝您的整個應用程序
然後，您可能會在以下時間為應用程序的不同頁面添加小部件
您可以在其中瀏覽，然後嵌套子subwidgets
用於用戶輸入的列表項的形式是這樣的
所以你真的建立了這樣的小部件樹，
所有這些都在代碼中，所以用dart編程語言
現在我猜這個理論還不是很清楚
讓我們看看它是如何工作的以及我們如何創建這樣的小部件
現在，我們的洪水包裝並沒有做很多，我們擁有主要功能
將被要求我們，但我們不知道該主要功能該怎麼做
現在我剛剛提到整個flutter應用程序是由小部件組成的
所以也許我們應該開始使用這樣的小部件
為此，我們實際上創建了自己的根小部件，這通常是您
開始，為此，我們將使用另一支飛鏢
具有class關鍵字class的要素類是
您可能也從其他編程語言中了解過的概念
dart是一種面向對象的編程語言，這意味著
一切都是對象，而對象僅僅是數據結構
類使您可以為新對象創建藍圖
這樣你就可以說出在這樣一個物體裡面應該是什麼
哪些屬性，所以它應該具有哪些數據字段，您可以使用它做什麼
這一切都變成了這樣一個藍圖，而且撲朔迷離
您將使用flutter框架附帶的許多類
但您也可以創建自己的，如果您創建自己的
用class關鍵字做到這一點，然後為該類分配一個名稱
現在，類名通常以大寫字母開頭
然後只需輸入名稱即可，例如我的應用
在會議代表處，您只使用一個詞，但如果實際上包含
您將其中的每個單詞都大寫的多個單詞
我的應用程序將這樣寫，而不用破折號
現在沒有下劃線，這是一個類，現在您可以向其添加功能
功能是您可以添加的兩種東西
函數類，然後將它們稱為
方法，還可以向函數添加變量
現在我還沒有介紹變量，但是您可能從其他人那裡知道了
編程語言變量只是少量數據
結構，例如名稱（如果有）
像這樣的好名字將是一個變量持有
max作為值，如果您將這樣的變量添加到
類，它被命名為屬性，但這是一些理論
一旦我們繼續，它將變得更加清晰
現在需要覆蓋的功能我們要創建一個小部件和一個小部件
將是一個對象，這就是為什麼我們創建一個類來定義該對象應如何進行的原因
看起來當然很撲朔迷離
如果我們創建的課程可以使用
作為小部件，因為您將了解它的需要
類中的某些功能，可以將其用作小部件
因此將其繪製到屏幕上，因此
我們的班級必須擴展一些東西，這是一個稱為繼承的概念
然後通過在此處添加extend關鍵字來實現它
這使您可以從基類繼承
所以從另一個班級開始，這意味著這個班級
將接收其繼承的類的所有功能
它仍然可以使用或添加自己的功能
而且從那時起，我們便從類顫振中繼承了信息，因此我們也知道它可以安全地
使用基於該類的對象進行繪製
屏幕上出現了一些東西
必須來自flutter框架，這是我們實現另一個框架的地方
在此文件中導入功能，我們編寫了自己的代碼，但是
我們要使用從fld sdk中公開的代碼
和框架，為此您添加了導入語句
依次輸入import和所需文件的路徑
導入，因為開始實際上是模塊化的
語言，這意味著您將代碼分成多個部分
多個文件，在這種情況下，我們使用的代碼
我們甚至沒有寫，但是存儲在第三方中
包在更扁平的框架包中，我們從中導入代碼
這樣的包可以通過在引號之間鍵入包
標記，然後是冒號，然後是
在我們的案例中是飄動的然後飄動的包裝實際上包括
您可以說多個子包或文件
通過添加斜杠來定位文件，然後
在我們的情況下，文件名將為material.dart
這從撲撲進口這個包
框架，並且可以使用，因為我們這裡有一個比較扁平的項目
現在我們可以擴展該包中公開的功能
那就是所謂的無狀態小部件，還有另一個小部件
狀態完整的小部件，但我們現在將使用無狀態小部件
只需這樣輸入即可，因為此導入，此功能可用
現在，此類基於無狀態小部件
因此我們幾乎可以將其用作小部件
畫在屏幕上的一件重要的事情雖然沒有
我們將在下一講中深入探討
所以我們從無狀態的小部件擴展，因此
我在這裡有一個有效的小部件，幾乎我們已經可以看到有
如果我們將鼠標懸停在我的應用程序上方，則在我的應用程序下方會有一些紅色的波浪線
那麼您應該會看到此錯誤消息，這是一個具體的實現
無狀態小部件構建的缺失現在還不是很清楚，但這說明
我們發現類中缺少某些東西，確切地說，它的構建很好
這是一個名為build的方法，所以讓我們通過輸入build來添加它
括號，然後花括號，這是定義函數的方式，如果
一個函數在類中，您只需將其稱為方法，現在我們有了
此類中的build方法，現在僅
構建方法不再使用我的應用了
需要build方法，因為如果我們告訴flutter
將基於此類的對像用作窗口小部件，可以將其繪製到屏幕上
它當然需要依靠這個可繪製的
可能會說，顫抖會嘗試畫點東西
通過在您所在的對像上調用build方法
告訴它這是一個小部件，所以如果您將對像傳遞給
將其繪製到屏幕抖動上將始終調用build方法
在該對像上的原因，這就是為什麼需要將其添加到自己的小部件中的原因
現在build方法實際上接受了參數
會因為顫動而傳遞給顫動的數據
將是一個調用build方法的方法，build方法採用一個參數
確切地說，上下文上下文基本上是一個帶有一些對象的對象
有關您的應用以及此小部件位置的元信息
例如在其中繪製將包含信息
現在通過我們應用程序中使用的顏色來討論主題
忽略它，讓我們向build方法添加一些東西
因為此方法需要返回您通過添加
現在返回關鍵字很重要，因為
flutter將執行build方法，然後執行
需要知道在屏幕上畫些什麼
因此需要退貨
只是調用它是行不通的，而是顫抖的等待此方法返回
因此，添加return語句，現在
問題只是我們在這裡返回什麼？
小部件始終需要返回另一個重要規則
小部件，直到達到
隨拍附帶的小部件現在我們可以使用小部件
隨同隨動的材料應用程序小部件，這是一個
特殊的小部件，用於包裝您的整個應用程序，因此
實際上讓您有能力為此設置主題
應用程序，它還會添加一個導航器
允許您在不同頁面之間切換
依此類推，這是您使用的核心根窗口小部件
在您創建的每個Flutter應用中，您自己返回
小部件，它將是最上面的小部件，因此現在是材質應用
窗口小部件可以配置為執行以下操作
真正在屏幕上繪製一些東西，因為現在我們剛剛創建了我們的
應用程序，但我們可以將數據傳遞給物料將看不到任何東西
順便說一句，請注意這裡的括號
像這樣沒有括號的材料應用程序是一個類
從撲材料包裝進口
用括號我們根據您可以說的類創建一個對象
我們構造一個對象，我們稱之為
一個類的構造函數方法每個類都有一個，即使您沒有
明確定義它，所以我們正在執行它，因此
這給我們帶來的是一個基於您的重要應用類的新對象
可能還會看到在其前面添加新關鍵字的語法
從此處使用的dart版本2開始，這是dart的未來
現在我不需要了，我提到我們可以通過
材質應用程序中的信息讓我們在下一個講座中進行操作
我們已經覆蓋了很多地面，但仍然看不到
屏幕，我們需要告訴材質應用
這是我們整個應用程序的包裝方法，該如何做才能在屏幕上繪製內容
為此，您可以將參數傳遞給重大應用
我們的構建方法也期望一個參數，材質應用程序的構造函數也會這樣做
它期望所謂的命名參數，這意味著
您首先添加一個名稱，例如home就是這樣一個參數
然後是一個冒號，然後是您要為該參數傳遞的值
另一種是位置參數，我們在這裡使用
在這裡，我們不分配名稱，而是將第一個參數傳遞給構建
在這種情況下，方法將被視為上下文
因此它將存儲在該參數中，命名參數大小寫為
我們在整個課程中都會使用的東西
材質應用程序在此使用它，我們將目標定為home
我們為此傳遞了一個值，而home實際上需要另一個小部件
這將是繪製在屏幕上的小部件
當應用加載到此處時，您通常會使用所謂的腳手架
小部件隨物料包一起運輸的另一小部件在這裡
腳手架會在您的應用中用漂亮的白色創建一個新頁面
也可以通過以下方式更改背景，
具有能夠添加應用欄的背景
等等，因此還需要通過傳遞數據來配置腳手架
進入構造函數，因為這將創建一個空頁面
要將某些內容傳遞給該頁面，我們可以在此處指定特定參數
我們通過寫給app傳遞給腳手架的其中之一是app bar
條形冒號，您可以添加一個小部件，該小部件將呈現為
應用程序欄，位於屏幕頂部的工具欄
在這裡您猜到了，我們再次需要一個小部件
您還記得一切都是小部件，所以讓我們在此處添加一個小部件，然後
幸運的是已經有一個內置的應用程序
這樣的欄會根據應用創建一個實例
欄小部件，現在又需要配置該怎麼做
在該應用欄中，有一個title參數，如果您
想知道我如何知道它具有標題屬性
您可以將鼠標懸停在應用欄上，然後會看到一些文檔
它接受哪些參數，在那裡您看到標題，並且您也
看到這也需要一個小部件
但您也可以使用另一種方​​法來放置光標
放入括號和命中控制空間之間的參數列表中
然後您的ide應該在您提供的位置自動完成
一些可以在這裡使用的代碼片段
然後您還可以查看是否開始輸入標題
您可以定位的參數，就像我將鼠標懸停在應用程序欄上時看到的那樣
需要另一個呈現為標題的小部件
在這裡，我們將使用該鏈的最後一個小部件，
文本小部件文本是一個小部件，然後將字符串作為參數
現在這是一個位置參數，我們不定義名稱
相反，我們只是傳遞一個字符串，然後將其提取到內部
參數中第一個參數中的文本小部件的位置
列表，因此我們在此處傳遞了一個字符串，該字符串應顯示為文本
之類的簡單列表，因為這將是我們構建的應用程序的名稱
現在有很多工作要做，可能還不是很清楚
特別是知道這些小部件的存在可能會令人困惑
但在整個課程中，您會感覺到存在哪些小部件
當然，我也會向您展示在哪裡可以找到它們
現在讓我們照原樣，我不了解你
但我認為，如果您現在可以以更易讀的方式編寫代碼
像這樣編寫代碼，最後在末尾有逗號
在每個括號之後，最後一個除外
您可以在Visual Studio代碼中使用所有ide提供的功能
您可以通過轉到代碼首選項鍵盤快捷鍵找到它
然後在那兒搜索格式文件，這是一個命令
您可以在此處找到它進行重新綁定或使用
您可以在代碼中執行以自動執行
重新組織它並使它更具可讀性現在我看來這看起來更好
我們仍然看不到屏幕上的任何內容，以及
那就是我們創建了小部件，但是我們沒有將其安裝到屏幕上
現在，我們回到這裡的主要功能，做最後一步
我們沒有在那段時間執行任何代碼來更改它
我們需要在此處運行特殊功能，該功能由材料提供
我們導入的包是一個名為run app my ide的函數
幫助我，並自動建議它並運行應用程序需要一個參數，那
參數必須是小部件，所以
讓我們在這裡創建一個小部件，然後使用我們的應用小部件，然後將其包裝
物料應用支架等，因此在此處使用您的類名，然後添加
括號以基於該
上課，因為上課是你的藍圖
通過像您一樣執行類來基於它們創建具體對象
執行與保存的功能，現在它將嘗試
將其熱加載到正在運行的模擬器中，您
如果由於某種原因而失敗，應該看到這樣的內容退出
如果您進行基本更改，則無需調試即可重新啟動它
雖然它應該可以在大多數時間中斷
如果您只保存代碼，則會自動重新加載
然後您應該會看到，現在這是我們自己的應用程序
配置，您可以看到應用欄，
來自腳手架的白色背景
創建的頁面和整個應用程序
現在由材質應用小部件包裝
再次不要擔心，如果有很多新信息要消化
入門令人振奮，但我們會練習和練習
為了使這一點變得更加清晰，現在讓我們退後一步，然後再開始
繼續努力，讓我帶您了解我們在這裡所做的一切
以及實際上我們如何可以增強此代碼
從飛鏢，所以從編程語言
使用角度
我們創建了第一個非常基本的Flutter應用
我們通過在這個重要的主要功能中調用run app來做到這一點
在我們構造對象的主dart文件中
基於我們自己的類，該類實際上會調用build或具有build方法
它會被flutter調用，然後返回小部件樹
現在我們使用dart編寫所有代碼，因此import語句具有函數語法
所有這些都是飛鏢，而飛鏢實際上是一種打字語言
意味著您應該定義您的類型
方法使用或您的變量存儲，這可以幫助您進行開發，因為
您的助手可以使用該信息並在您嘗試保存錯誤時警告您
類型，它將始終在
建立過程，並可能大吼大叫
如果您現在使用的是錯誤的東西，那我是什麼意思
例如我提到的構建方法必須返回一個小部件
而且我們在這裡看不到任何錯誤，因為dart實際上可以推斷
自從我們返回材料應用程序（即小部件）以來的類型
dart知道build方法最終將返回一個小部件
但是我們可以通過添加
現在生成之前的小部件單詞小部件是一個類，但未實例化
但是只是一個類名，然後在dart中充當類型
這意味著確切地說是flutter包中定義的類
材料包，這意味著小部件現在是我們所需要的
期望返回並建立，如果由於某種原因我們不會
返回今年的物質應用程序，假設我們
全部註釋掉，我們返回一個
字符串，那麼您會看到我們收到一個錯誤
我們看到返回類型字符串不是方法定義的小部件
建立，所以我們會得到一個警告，如果我保存了它甚至不會
重新編譯，因為它識別出我們的代碼不正確
因此添加這些類型可以使我們編寫更簡潔的代碼
它允許我們避免錯誤，現在我們不能只在前面定義類型
關於構建方法，我們也可以很清楚地知道
鍵入此參數將再次具有推斷能力，因為
build實際上是無狀態小部件已經定義的方法，但是
標記為必須被覆蓋，但是我們可以
通過在前面添加類型來清除該問題
參數，這是您在類型前面添加類型的一般主題
使用變量定義參數
這將在這裡保持什麼，實際上是類型
構建上下文由
撲材料包裝，所以現在我們很清楚
鍵入構建上下文，它不會改變我們的應用程序，但是
確保我們不會犯愚蠢的錯誤，並且還可以幫助我們
ide，因為如果我現在鍵入context，然後加點以訪問其其中之一
方法或屬性，我得到屬於
建立上下文類型，所以我沒有得到任何建議
無論如何都不存在，我們還可以弄清楚類型
main方法現在返回，您可能會說它不返回
任何東西，你是對的，在這種情況下，您在其中添加白色
它的前面指示此方法不返回任何內容，並且
如果我們現在確實添加return語句和
不返回任何東西，但是什麼也不返回，所以這將是
有效，但是如果我們返回一個字符串，則可以說
然後我們將再次得到一個錯誤，即返回類型字符串
是無法避免的，並且void只是意味著空了，現在您不需要返回任何內容
像這樣，您不能只忽略這一行，現在代碼的行為與
如您所知，但使用類型更好的代碼是
強烈推薦並允許您編寫更簡潔的代碼
雖然這不是我想討論的所有有關Dart語言的內容
類型是至關重要的功能，我們將在整個過程中使用它們
這門課，但我現在想提兩件事
第一個是如果您有一個函數，我們編寫此函數的方式
只包含一個這樣的陳述
你絕對可以這樣寫
如果您喜歡，可以使用此樣式，儘管有快捷方式
較短的符號，這就是粗箭頭符號
您可以通過刪除花括號來使用它，然後將其全部寫成一個
行，但您將名稱和參數列表與
通過使用等號的箭頭，然後
大於符號，現在等於
我們之前擁有的功能只有在您只有一個功能時才有效
聲明，但這也是您在整個課程中都會看到的內容
這種較短的功能符號，最後但並非最不重要的是
關於構建方法的一些特殊之處，我們在其他方面也有
在整個課程中的方法這實際上是一種方法
無狀態小部件要求我們覆蓋它，我們可以
因此，您可以在這裡添加一個特殊的註釋，它不是必需的
沒有它，一切都可以工作，但是您可以通過添加添加註釋
一個加號，然後是覆蓋
註釋這是做什麼的，它只是告訴dart
我們故意覆蓋一種方法
這也已經是發現和無狀態
小部件現在可以正常工作了，但是如果我們在一個開發人員團隊中工作
這很清楚這是一個實際上覆蓋方法的方法
由此小部件定義，使我們的代碼更易於閱讀
所有這些，如果我們保存應用程序，它將看起來
感覺和以前一樣，但是現在我們得到了更清晰的代碼
回到撲通，然後讓我們添加更多到這個應用程序
因為現在您肯定可以辯稱它沒有
那令人興奮
讓我們現在繼續開發我們的應用程序
該應用程序欄很好，但不是那麼棒
記住，腳手架小部件是用來創建頁面的
我們不僅可以在此處添加應用欄，還可以添加其他參數，
再說一遍使用控制空間的技巧
例如，實際上顯示得很好的身體
在應用欄下方頁面上的所有空白區域中
您猜到的主體還需要一個小部件，您可以將其懸停
在這裡，您可以看到類型，您還可以
關於它如何工作以及什麼的簡短說明
確實如此，因此我們現在在這裡添加一個小部件
可以再次自己創建另一個小部件，然後在此處添加，但是
最終，您總會得到一棵內置於其中的小部件樹
撲材料包裝您自己的小部件，您經常使用
也將由其他任何一個組成
由您建造，但最終位於鏈的末端
您將使用隨風飄揚的小部件，因為
然後將這些實際上翻譯成本機
用戶界面組件，這就是為什麼您總是會最終失敗的原因
在未來某個地方帶有更扁平的內置小部件
對於這裡的身體，我們要添加
您知道的這張卡，如果您不了解，可以從材料設計應用程序中很好地看它
您會在一秒鐘內看到它，您可以使用卡添加它
小部件，並且您可能已經猜到這就是
撲材料包裝，因此通過此一次導入即可全部解鎖
該卡將為我們提供此突出顯示的內容
看起來有點陰影，依此類推，這張卡又要花幾張
您可以分配的命名參數，例如最重要的
孩子，這也是一個小部件，您可以在這裡看到
在右邊，所以讓我們添加孩子，這基本上就是內容
我們的卡片，所以我們想要裡面有什麼
現在假設我們要在其中有兩件事
現在在圖像下方還有一個標題，其中有兩個元素
我們使用了一個特殊的小部件，所有的隨拍隨送
列小部件再次帶有一些參數，您可以在此處看到
它現在接受例如孩子與孩子的區別
應該清楚子級是一個小部件，但列實際上有多個小部件
它們將位於彼此之上
所以從上到下，讓我們點擊這裡輸入以輸入新行
現在閱讀起來有點容易，我們可以定義所有小部件
同樣，如果
您想知道這是什麼奇怪的尖括號小部件
這就是所謂的泛型類型
批註添加到此處的數組中
非常清楚，這實際上只會容納小部件
我已經在這裡用方括號提到了這個東西
被稱為數組，它允許我們添加數據列表而不是單個數據
分段列卡應用程序或文本支架
這些都是單個對象，現在我們可以添加單個對象列表
這將存儲在此子級參數中，這是我們要做的
現在我們可以在這裡添加兩個項目
用逗號分隔的列表讓我們使用
毫不奇怪，圖像小部件也隨附了扁平材料
現在讓我們在第二行中將其保留為現在
讓我們再次添加文本圖像以顯示一些文本
讓我們現在命名這個食物天堂，圖像將是圖像
裡面有一些食物，你可以找到圖片
附加到該視頻，現在我們在這裡創建一個新文件夾
在我們將為資產命名的項目中，名稱為
由您決定，但資產是一個好習慣，因為這會
現在可以將靜態資產保留在應用程序之外，您可以找到該文件
附加到此視頻中的food.jpg文件，您可以
將此圖像拖放到assets文件夾中，現在我們要使用該圖像
圖像並立即將其顯示在該圖像小部件內
要解鎖此文件，我們必須通知flutter
因為只是將其拖到該項目的文件夾中
還不夠，我們現在需要轉到此處的pubspec.yaml文件
如果您向下滾動一下，應該會找到
註釋掉了一部分，您可以在其中添加特殊資產密鑰，只需
刪除該哈希符號，然後您可以定義
通過在此處刪除該哈希值然後
發明這一點很重要
這樣，然後在這裡您指向文件
在我們的情況下，要添加到資產文件夾中
那裡有食物點jpeg
添加並保存了此文件的文件，您現在可以
在您的項目中使用該資產，您會看到它已經將我們的項目更新為
基本上導入此，以便將
包含在設備附帶的捆綁包中，現在我們可以開始了
回到main.dart文件並使用該圖像
為此，我們將使用圖像小部件的特殊構造函數
我們還沒有看到這種類型的構造函數，但是實際上
是一個特殊的構造函數，您可以在小部件之後添加一個點來使用
但是在括號之前然後是資產
這是一種特殊類型的構造函數，它將創建圖像
已配置為加載
資產，現在您可以將該資產傳遞給
作為字符串，然後是資產名稱
精確的完整路徑，因此，如果保存此資產，則現在可以大幅削減food.jpg
它應該會熱加載，現在，如果您返回到自己的應用，應該會看到
像這樣的圖像和下面的一些文本
實際上都是坐在一張卡片上
現在的寬度和高度，但您可以看到輕微的陰影
現在在底部，這不是我想要的最終樣式
有，但這是一個巨大的進步，現在我們有了一些
身體在這裡，希望你有更多的練習
構建該小部件樹，您還了解了其他一些知識
小部件，儘管您已經了解了許多新的小部件
這些都是核心小部件，而剩下的核心小部件不多
您現在將學習，讓我們重新格式化代碼
再次方便快捷，讓我們看看我們還能做什麼
您是否想知道我如何知道所有這些小部件
好吧，有官方的flutter文檔
提供有關flutter.io的概述，您可以單擊入門或外觀
並且此頁面的感覺當然可能會改變
但是您應該總是找到一些文檔區域，例如此處的文檔鏈接
即使此頁面應該更改，您也應該找到指向小部件目錄的鏈接
在這里或在左側小部件目錄上（如果您訪問它），將獲得有關
隨風飄揚的小部件由
類別和最重要的類別
是基本類別，但更重要的是材料成分
如果單擊該類別，則會看到所有核心的概覽
實質性的小部件，我會回到那個
實際的東西是這些，例如應用欄
您看到了，但這些還包括根材料應用程序小部件
或如果您向下滾動按鈕輸入，我們將看到對話框
可以顯示信息顯示，如工具提示
卡在這裡，然後佈局小部件
如果您返回上一步，然後轉到“基本”小部件類別
在這裡，您會看到諸如列行，容器小部件之類的內容，我們將看到
文本小部件，圖像小部件，您始終可以點擊文檔以
了解更多有關如何使用它的信息，例如，這裡的
我們使用的圖像資產構造函數，其中一些不用於圖像
不幸的是，但是對於其中的一些人，您還可以在此處看到簡短的示例代碼段
甚至看起來可能很多，但這是了解的好方法
這些小部件可以四處導航，不用擔心，我們將使用大量
他們在整個過程中，所以這一切將變得非常多
更清晰
現在您知道在哪裡可以找到所有這些小部件
到目前為止，讓我們繼續使用此應用程序，我們只是在這裡顯示我們的卡
它佔用了整個空間，我不會這麼激動
是時候改變這一點了，讓我們為用戶提供添加更多功能的能力
卡片，以及本課程結束前的產品
提示這張我們還沒有但會創建的卡片清單
現在，我們首先需要一張卡片清單
我們當然可以在此處使用列小部件創建這樣的列表
所以讓我們添加像這樣的孩子列，然後這個數組你不能忽略這個
尖括號小工具的東西，但您也可以添加它，但我會在這裡省略
並在此處將卡片後的方括號也關閉
還要在此處添加括號以關閉該列
然後讓我們重新格式化代碼，現在我們有了卡的列表
如果我們現在重新加載，您會看到卡並沒有一直滑到底部
但是它在其內容之後結束，這是我們想要的行為
現在我希望能夠添加更多的卡，為此，我們添加一個
按鈕，我們在其他卡片上方添加該按鈕
在這裡，我們可以添加一個特殊按鈕
例如，升高按鈕的部件
這會添加一個凸起的按鈕，該按鈕只是具有背景色的按鈕
現在需要配置凸起按鈕，讓我們看看如何
例如配置它，最重要的是它具有
這裡的child參數，我們添加了一個小部件
這將簡單地定義按鈕的內容
通常是文本，但也可以是圖標
在這裡，我將再次使用文本小部件添加一些文本和我使用的文本
是添加產品，現在將添加這樣的按鈕，但是我們還需要
再添加一個重要的論點，我們可以看到我們得到了一些
綠色的波浪線告訴我們，按下時該參數是必需的
我們可以通過添加按下來添加它，現在實際上需要一個函數
參考，因此我們可以在此處添加一個空函數
這樣，這就是所謂的匿名函數
它沒有名稱，因為您可以說它只是參數列表
然後函數體都是空的，導致看起來有點
奇怪的是，我們很快就會在其中填充
現在這只是一個空函數，什麼都不做
如果現在保存並讓我們按下按鈕，將執行該操作
很難重新加載，我們在此處頂部看到該按鈕，
我們可以單擊它，實際上看到了漣漪效應
所以現在可以使用了，這個按鈕位於
我們頁面的邊緣在這裡我們可以更改
通過將其包裝到您在小部件目錄中看到的另一個小部件
容器小部件容器小部件
帶一個孩子，那個孩子將成為我們的鈕扣，所以讓我們抓住它，
在這裡添加它，重新設置它和容器小部件
還允許我們添加一個所謂的margin，margin只是周圍的一些空間
那個容器在按鈕周圍
我們通過使用flutter材質包提供的另一個類來添加
邊緣insets類，該類具有用點all調用的all構造函數
然後您將數字傳遞給一個精確的浮點數，即帶有
小數位，它定義了您想要多少空間
在各個方向上都有例如10.0像素，這些將
被自動調整為設備的像素
我們現在保存的像素密度如您所見
按鈕周圍的空間顯然該按鈕沒有任何作用
所以讓我們確保它能做些什麼
我們添加了此按鈕，但如果單擊它，則無濟於事，因為我們的
現在這裡的功能為空，此按鈕實際上應該添加新的
現在為虛擬產品，然後在按鈕下方進行渲染
當然，在這裡添加越來越多的卡片
一個提出了一個問題，我們如何在這裡添加更多的卡
但顯然另一個重要的問題是
按下按鈕後，我們是否真的創建了新卡？
這個功能很好，我們要更改
一些實際上是動態的數據
變成了這類卡片小部件的列表，您通常要做的就是
管理正常的數據列表，您也可以從
服務器，我們將在本課程的稍後部分從服務器中獲取
然後每當構建被調用時，當應用程序被flutter調用時
第一次加載或當您的某些數據更改時
重要的部分，那麼我們想使用我們正在使用的數據
在按下狀態下處理，並在此處重新創建一張卡片列表
因此隨著每個按鈕的改變而改變
無狀態小部件無法在無狀態小部件中完成
是一個非常簡單的小部件，可以完成一件重要的事情
能夠接受外部數據，我們在這裡還沒有這樣做
但是它只是有一個構建方法
一些小部件樹，它不能與內部數據一起使用，無法更改，例如
因此，如果有一些內部數據
數據已更改，因為它不適用於內部數據
如果是第一次創建，它只會調用build
或者它接收到的某些外部數據發生了變化
現在，因為我們無法使用無狀態小部件處理數據
因此，對於我們而言，這是錯誤的小部件
我們需要一個狀態，完整的窗口小部件狀態可以簡單地轉換為數據
您正在使用存儲在小部件中的數據，並且
您還計劃更改狀態，現在您已經看到了
通過將其更改為狀態完整的小部件，我們再次獲得紅色的波浪線
因為我們缺少有狀態小部件的具體實現
創建狀態有狀態的小部件的構造確實不同於無狀態的小部件
小部件，讓我們在此處關閉括號
現在關閉類定義，當然我們的代碼是
現在無效，讓我們添加此創建狀態函數
順便說一下，我的思想已經幫助了我，並自動完成了
現在這就是創建狀態函數的樣子
如您所知，它返回一個狀態對象
再一次，我們得到這些奇怪的尖括號
這稱為通用類型，它允許我們傳遞
其他類型的額外信息，它告訴我們
狀態對象和狀態類順便說一句
該狀態對象所屬的撲材料包裝
到這個有狀態的小部件或最後到一個有狀態的小部件
因為你在顫抖狀態下的工作方式
是您實際上創建了兩個可以一起使用的類
這是一種連接createstate將返回新狀態
狀態配置為可以工作的對象
一個有狀態的小部件，讓我們在這裡創建第二個類
應該將其稱為下劃線我的應用程序狀態現在下劃線只是一個
不應使用的類的約定
通過其他部分或其他文件，但僅從該文件內部
如果您以後使用多個文件，則flutter實際上會尊重這一點
您將能夠將我的應用程序導入文件並使用它，但不能
強調我的應用狀態儘管這是現在，讓我們暫時忽略它
稍後會更清楚，讓我們再次擴展一些內容
因為既然這應該是一個狀態對象
通過顫動理解，需要擴展並不奇怪
由flutter提供的東西，您需要擴展內置狀態
課後輸入開括號
並在此處保留構建方法，因為flutter提供的狀態類
實際上有一個構建方法，我們只需要告訴
撲這個myappstate類屬於這個myapp
小部件，然後通過在狀態之後再次添加這些尖括號來完成此操作
在這裡，我們添加該狀態所屬的類的名稱
現在兩個類之間的連接已建立
現在我所說的myappstate保留了build方法
並且我的應用需要立即返回我的應用狀態
所以返回下劃線myapp狀態並實例化它
通過添加括號現在是有狀態的小部件
根據我們自己的類創建一個新的狀態對象
它擴展狀態並在內部具有build方法和flutter將調用
有狀態的小部件的構建方法，這是
只是一個設置，您必須記住這是有狀態的小部件在其中工作的方式
撲朔迷離的問題，當然仍然是我們現在怎麼能
實際使用它並更改我們的產品列表，讓我們
在下一堂課中看看
我們創建了一個有狀態的小部件，但問題是
現在我們如何管理和更改其中的數據
我們以一種非常簡單的方式來添加一個所謂的屬性
到這裡的myappstate類，讓我們在類內部添加一些東西
定義讓我們添加一個名為products的屬性
名稱取決於您，儘管現在產品將是一個列表
現在是字符串，因此自開始以來僅列出文本是一種強類型語言
讓我們在它前面添加類型，並且類型是列表，這是一個類型
dart附帶了它，這是我之前所說的數組
在許多其他編程語言中稱為數組
在dart中，它只是這樣的列表
列是列表，這是小部件列表
現在list是一個通用類型，因此我們可以定義
它將是什麼的列表，這應該是
字符串，所以我們在這裡添加字符串作為類型
現在產品必須是這樣的字符串列表，它定義了屬性
但它現在是空的，我實際上不想以空列表開頭
相反，讓我們通過添加一個等號來創建一個新列表，然後在
在方括號的右側，讓我們
現在添加我們的第一項，讓我們命名這個食物測試儀
食物測試員顯然更有創造力
產品，我在想一些可以指向食物的工具
測試它的成分測試是否已經過去了，如果我們仍然應該
吃這樣的東西只是一點點花哨的產品
在整個課程中，我們將返回更多常規產品
雖然，但暫時不要擔心該產品
現在我們想通過將其轉換為這樣的列表來呈現到屏幕上
卡在那裡，我們可以通過在這裡的小部件樹中進行操作
並記住我們的孩子是小部件列表
仍然不用像這樣使用卡片，現在我可以接觸到我的產品了
產品的方式現在是我們的財產
類，因為這是僅用於該類的類
文件，這是僅在此類中使用的屬性
您還應該在名稱的開頭添加下劃線
另一個約定，所以讓我們現在使用這樣的產品
順便說一句，如果你來自另一個人
像javascript這樣的編程語言
使用該點產品或類似的產品，您可以直接引用它
在這裡您可以在此數組或此列表上調用方法
通過添加一個點，然後例如有一個地圖
方法，您可以轉換每個元素
在該列表中放入一個新元素並返回
我們將在這裡將此列表作為新值返回
我們的列圖以函數作為參數
擁有轉換邏輯，它將接收元素作為輸入
然後您可以在此處使用粗箭頭符號定義應該
發生與該元素，這裡應該發生的是
應該基於該元素創建一張卡片
所以在這裡搶卡，在這裡添加
最後刪除該逗號，現在的工作是
它佔用產品列表中的每個元素並將其轉換為卡片
現在我們還可以輸出實際存儲在此處的文本
因為記住元素將只是一個字符串
因為我們的列表是字符串列表，所以如果我在那兒鍵入內容
這裡指的是這個元素，它將
輸出它的一個重要說明，儘管您需要
在括號之間包裹元素，所以這是參數列表
對於功能，這是功能主體
聲明跨越多行，但最終只是創建
卡，所以這是一個聲明，我們在其中傳遞元素，然後
將其輸出為文本現在我們仍然有紅色的波浪線
在那裡，因為這實際上返回一個類型
迭代，我們現在需要一個小部件，我們無法將列表轉換為
單個小部件，所以我將要做的是
我將添加另一列，所以我們已經有一個包含容器的列
現在有另一個嵌套的列，絕對好
所以這裡的另一個列小部件將有子級
這裡的孩子應該是我們的清單
卡，所以讓我們獲取該代碼並在此處替換該小部件數組
該產品列表仍然無法正常工作
我們需要通過調用將其轉換為列表
在這里和現在列出方法，我們完成了
現在我們添加了一個新列及其子變量
那裡有我們的產品，我們將其映射到一個新的
所謂的可迭代與我們的產品卡
然後我們在這裡調用list將其轉換為可以使用的列表
現在，如果我們保存此內容，然後返回，我們再次看到
我們的卡，現在我們向前邁出了一大步
連接該按鈕以添加更多元素，如您所見
所以我們在這種奇怪的轉換上花了很多工作，我已經
說有一種更好的方式來呈現這樣的列表
現在，讓我們堅持這一點，並確保我們的按鈕
現在終於做了一些事情，這個按鈕現在應該改變產品了，我說
當這些數據更改時，構建將再次執行，然後
實際上將再次獲取更新的產品列表
將其映射到卡片的更新列表中，並將其呈現到屏幕上
所以從理論上講，如果我們更換產品，我們也應該獲得更多的卡片
所以我們可以在這裡做的是接觸到產品
然後有添加方法來添加新值
由於這是一個字符串列表，我們可以添加一個新字符串
現在是一個很難編碼的代碼，所以我們與我們合作
食品測試儀當然是創意產品，現在讓我們更具創意，
使用高級食品測試儀的超級工具，我們可以找到
有關我們食物的更多有用信息，請在以下位置添加分號
最後，如果保存並添加產品
什麼也沒發生對，這是因為這不是它的工作原理
它實際上會改變產品，我可以通過致電向您證明這一點
在這裡打印產品，這只是一個調試功能，它將打印它
到底部的控制台，如果我現在保存它，然後單擊此
一次你在底部看到有食物
測試員和高級食品測試員，但我們在這裡只看到一張卡片
原因是這樣的數據更新會改變它，但是
顫振不會識別它，默認情況下不會監視所有
數據字段，然後每當其中一些重新渲染
改變這將是非常低效的，相反，您必須告訴flutter
您正在更改有狀態小部件中的數據或將
換句話說，您正在更改其狀態，可以通過調用
特殊方法提供的設置狀態方法
flutter包，它需要一個參數
也是一個功能，在此功能中
您執行應更改數據的代碼，並且
導致應用的重新渲染，所以在這裡我稱為產品廣告
不需要再打印了，現在，如果我保存了，您實際上會看到
您會自動看到第二張卡片，並發出警告
頁面範圍，但這只是熱門功能
重新加載它實際上會為您調用set狀態，所以讓我們做一個完整的
重新加載，您可以使用控件f5執行此操作
將重新啟動應用程序，現在，如果我單擊添加產品，您會看到
該卡出現警告，我確實提到了
有一種更好的方式呈現列表，因為此列表由
默認是不可滾動的，這是這裡的問題
但至少它能運作至少一張新卡
添加了，雖然我們可以改進有關滾動的列表
行為，這已經向我們展示了我們如何工作
現在使用有狀態小部件進行混合，讓我們創建
另一個無狀態小部件，讓我們看看這些小部件如何
在我們進行互動之前，我們當然以後還會解決與我們有關的問題
次優清單
我們一直在學習關於小部件基礎知識的很多知識
繼續練習，你通常會在顫抖中做一件事
應用程序是，您不會像有狀態的那樣將所有代碼都放在一個根小部件中
小部件或其狀態，但您拆分了
您的應用程序細分成多個
小部件，您還可以將它們分佈到
多個文件，以便每個小部件和每個文件都保留
可讀性和可維護性，那麼我們如何使用此小部件來做到這一點
好，我們可以將其拆分，我們當然需要一個有狀態的小部件
來管理我們的卡和我們的產品，但是如果說實話，這個狀態
小部件實際上只是從這裡開始
一列紙牌，其餘全部用於腳手架
應用欄，甚至是狀態完全為小部件的按鈕
不會改變，是按鈕是
觸發狀態更改，但我們可能可以做點什麼
關於這一點，但最後按鈕本身
不變，所以我們將其拆分，讓我們創建一個
lib文件夾中的新文件在這裡
現在被命名為products.dart，文件名最多為
你，但習慣上是全部用小寫寫
多個單詞用下劃線和
當然總是以點鏢結束，因為那是
我現在要在該products.dart文件中編程語言擴展
渲染該產品列表，以便此處的列
所以我們基本上可以抓住那一列，確保在此處選擇正確的代碼
而不是剪下同樣包含按鈕的列，而是剪下它
持有我們的卡片，讓我們進入產品開始飛鏢頁面並創建
一個新的班級，我將其命名為產品
這樣，我現在需要擴展從flutter導入的內容
再次，這很重要，您需要將該導入添加到每個新
文件，因為每個文件都是獨立運行的，因此
這麼說是因為您導入了顫振
這裡的材料包並不意味著您不必在這裡導入
再次，讓我們導入包冒號
撲斜線material.dart現在我們要在這裡創建一個小部件
只是想將列邏輯外包給這個
小部件的問題是我們擴展一個完整狀態還是一個狀態
最後一個小部件，您可以用兩種方式構建它
但是實際上使用狀態的更優雅的方法
更少的小部件，現在這可能會令人困惑，因為我剛才說
該列卡是唯一有變化的東西
沒錯，但是數據的變化
實際發生在您可能會爭論的其他地方
此處的產品小部件僅會收到一個列表
產品列表，該列表可能會更改，但可以在外部進行更改
該產品小部件在這裡讓我告訴你我的意思
首先添加構建方法，在這裡我將提供一些幫助
得到自動建議並按回車，它給了我整個方法
在這裡，我將返回我的剪切代碼，以便包含產品的列
依此類推，顯然這裡沒有產品
這是我們必須解決的問題，但這是我要使用的小部件代碼
在這裡，逗號必須在末尾
問題是我如何獲得產品
進入我的產品小部件，這就是我的意思
這是我們實際上可以從中接收的數據
因此，從我們最終將使用的地方
我們的產品可以通過添加所謂的
構造函數在這裡，我們通過重複類名來添加構造函數
然後加上括號，現在您可以添加
大括號定義應運行的代碼
每當創建此小部件時，構造函數l也會有其他一些
功能，但我們只需要一個功能就可以
能夠接受您可以的產品列表
隨心所欲地命名該參數，但我將其命名為產品
然後我要將其存儲在該產品類的屬性中
這樣我們就可以在那裡使用該屬性
為此，我將在此處添加新屬性
[音樂]產品屬性，這將是一個列表
再次保持不變的字符串，並且最初未初始化，因此存在
沒有分配值，但是我想將產品存儲在
該產品的特性和飛鏢提供了方便
快捷方式，如果我鍵入此點產品，那麼它將
自動獲取傳入的參數並將其存儲
在具有相同名稱的媒體資源中，因此在該產品的媒體資源中，
快捷方式現在我們需要在此處添加分號
在他們的構造函數之後，現在這將允許我們傳遞數據
通過其構造函數將其綁定到產品中
產品，然後刪除下劃線，因為
現在被稱為這樣的產品，所以我們現在有一個
小部件，理論上可以獲取並輸出產品
但我們沒有使用它，我們這裡也有綠色的波浪線
現在它告訴我們該類中的所有內容都應該是不可變的，這意味著
不可更改，因為它無論如何都無法對這些更改做出反應
這是一個無狀態的小部件，我們特別需要標記此屬性
由於是不可更改的，因此我們在其前面添加了一個特殊的關鍵字
最後一個關鍵字，這是一個飛鏢功能，可以告訴您
飛鏢，因此也撲朔迷離，產品的價值將永遠不會改變
它將使用我們從構造函數獲得的值初始化一次
但此後我們將永遠不會改變它，如果沒有
最後兩個的加法，但與類型一樣導致
更清晰的代碼，並非常清楚地表明這是一個
只能從外部設置的值，如果有新數據
從外部傳入，它將僅替換舊值，而不是
更改它替換它，然後再次調用build
替代價值這將是如何運作的這是我們的產品小部件
現在，在接下來的講座中，我們將開始使用它
我們創建了該產品小部件，現在回到主dart文件
刪除了用於渲染卡片的代碼
在這裡，我現在也想剝離另一部分，將其放入自己的部分
窗口小部件，它將是帶有
按鈕，我將創建另一個新文件
我會命名
產品下劃線manager.dart名稱由您決定
但我打算在那裡妥善管理產品
再次讓我們導入包裝撲材料
這是您現在最多可以使用的軟件包
讓我們創建一個我要命名為產品經理的類
文件名，但再次以您應該寫的形式寫
類名大寫單詞，然後在這裡我將狀態擴展為完整
小部件，因為我現在計劃在此管理我的產品列表
並更改它，需要創建有狀態的小部件
我借助自己的思想添加的狀態方法
因此，我們需要添加第二類
下劃線產品經理狀態類，該類擴展了以下狀態：
鏈接到產品經理的通用類型
這有了我的幫助下再次添加的生成方法
IDE，然後在這裡我想返回，所以在build方法中
我想返回那個代碼，我只是在這裡用容器切出的
在這裡，我確實也想複製並粘貼我的產品列表，所以讓我們
從我的應用狀態中刪除它，並將其添加到產品經理狀態
這是我們通過單擊更改列表
按鈕仍然沒有改變，因此請在最後刪除該逗號
改革它，現在這是我們的產品經理狀態
現在我們當然應該使用它，我們應該在這裡創建它
因此，返回產品經理的狀態是已經是產品
它創建的有狀態經理，但是當然缺少我們
產品小部件，我們仍然沒有使用它
我想在產品經理中使用它
當然，在我的按鈕下方
在這裡返回一列，其中有一個孩子
在標有方括號的列表中，其中一個是容器
在容器之後，我們關閉列表和列小部件
但是我們在容器之後添加了另一個元素
那應該是我們的產品小部件，以便它可以在我們需要的此文件中使用
現在導入它是一個很好的習慣
從與包相關的導入中導入，因此將導入與您自己的文件分開
從進口指向包裝特徵
所以在這裡我將導入並從您自己的文件中導入某些內容
您只需在同一文件夾中或在其中添加點斜杠
上一級文件夾，將點斜杠添加到
在我們的情況下導航到同一文件夾中的點
斜杠然後帶有文件擴展名的產品飛鏢
這樣，我現在開始導入產品
這樣我就可以使用這樣的產品
所以現在讓我們使用產品，如果我們看一下
我們希望獲得的產品列表應該是
現在在這裡渲染的當然是這裡的下劃線產品屬性
我們只需單擊一個按鈕即可更改，因此將其傳遞給產品，
由於我們在更改狀態時會調用set狀態，因此它將在此處重新渲染該build方法
因此也可以在此處重新渲染產品並通過
向下更新的產品列表，這將導致
產品小部件中的構建方法被再次調用
這也是我們的產品經理
更改後，讓我們回到主dart文件並使用產品管理器
現在我們不處理任何狀態
main.dart文件了，所以我們可以將這個有狀態的小部件轉回去
到狀態少的小部件刪除該創建狀態
方法刪除狀態myappstate類
在那裡，只需添加覆蓋的版本
我的應用樣式小部件的方法再次不再是主體
我現在只想在這裡有一個專欄
我的產品經理將其導入，指向
像這樣的文件，讓我們導入產品經理
通過添加括號在該對象的基礎上創建一個對象
現在，如果我們保存所有內容，也許讓我們用ctrl完全重啟
f5刪除我們可能已加載的所有舊狀態
我們看到了與以前相同的應用程序，並且其行為與以前一樣
也仍然存在該錯誤，但是現在我們有了一個更乾淨的結構
多個文件多個小部件
可重用，這很棒，但也使您的代碼更易於使用
之所以要進行管理，是因為現在每個小部件都相對較短且易於操作
了解，這就是您想要的結構
您的Flutter應用程序，您構建的用戶界面
這些帶有這些用戶界面組件的小部件
你想把它們分成多個文件
您想使用無狀態和完整狀態的小部件
使用盡可能少的狀態小部件
並有一些選定狀態的完整小部件
實際管理您的數據並更改數據
就像我們的產品經理在這種情況下一樣
我們在構建這些小部件上花費了大量工作
我們幾乎已經完成了核心基礎知識，還有兩件事我想要
潛入其中之一，如果我們的國家
完整的小部件還希望從外部接收一些數據
讓我給你一個具體的例子，我們得到了食品測試儀產品
現在從產品經理開始當然我們可以這樣設置
反正只是一些虛擬的硬編碼
但說我們實際上不想開始
但我們想從
在外面，因為我們要定義我們要開始的初始產品集
在main.dart文件中，也許是因為我們從這裡的服務器中獲取了它
我們將在整個課程中做所有這些事情
後端等等，所以我們想將數據發送到
我們主要的DART文件中的產品經理
了解瞭如何向下傳遞數據，我們可以將其作為參數傳遞給我們
將產品傳遞到我們的產品小部件，我們在接收小部件中接受它
通過添加構造函數，我們也可以使用產品
經理這裡是產品經理，這是
使用擴展類很重要
有狀態的小部件不是狀態，但是這是您在自己的類中使用的類
小部件在這裡，我們使用產品管理器，以便您使用它，然後在其中添加一個
通過重複類名稱並添加括號的構造函數
現在這裡的構造函數現在應該可以接收
在我們的案例中，一個論點是起始產品，現在我要存儲
那我將其存儲在一個屬性中
是字符串起始產品類型，我們可以再次使用
這個技巧或捷徑從此開始
產品來賦值，我們得到了綠色的魷魚線，
這應該是一個不變的類，等等，這不是一個
有狀態的小部件有狀態的小部件都是關於
數據可以正確更改的狀態，但是狀態變化
類不在小部件類中，兩者是
連接在一起，但在技術上仍然是分開的
對象，因此小部件是技術上分離的對象
所以我們實際上必須添加最終的起始產品
是我們從外面得到的東西，也是唯一的
更改方法是調用父組件中的構建
因此，重新創建產品經理傳遞新的價值，
產品放入其中，然後在此處分配該新值
很好的問題是我們如何使用
該開始的產品現在是因為我們進入了產品經理，但是我們
需要產品經理的狀態，現在您可能會想到
將其傳遞給初始產品的構造函數，然後添加
產品經理的構造函數在此處表示狀態，並將其存儲在此處
另一個字符串會工作，但它非常
創建該鏈以傳遞數據很麻煩
並不是很好，但是有一個有用的關鍵字
由狀態類提供的屬性
記得是由顫動材料提供的
所以一個實用的屬性實際上可以讓您訪問
屬於狀態的小部件的所有屬性
因為我告訴過你，他們聯繫在一起，而顫動在後面
場景為您工作，將特殊屬性命名為小部件
它允許您訪問自己的屬性
父窗口小部件或您所連接的窗口小部件（例如起始產品）
問題只是初始化屬性時不能在此處使用它
您只能在產品經理狀態的方法中使用它
僅僅是由於widget屬性的初始化方式
那沒問題，因為那是我想告訴你的第二件事
狀態對像或類還允許您實現一些
特殊方法，例如初始化狀態方法
我讓它自動完成，它有一件有趣的事情
它當然也覆蓋了​​內置方法，但有趣的是
超級事物超級總是指基礎
您要擴展到的狀態類
它只是在該基類上調用其狀態
確保即使在覆蓋它的地方也調用它
所以不要刪除它並確保在最後調用它
執行代碼後，初始化狀態將被調用
每當創建此狀態對象時都要初始化
首先將產品經理小部件繪製到屏幕上
您可以說的時間，在這裡我可以接觸到產品，
調用添加，我現在要添加的值是
使用我指的那個特殊的小部件屬性
起始產品，因此小部件由國家提供
對象使我們能夠訪問已連接
有狀態的小部件及其屬性，因此我
可以在這里安全地訪問起始產品，將其添加到我的產品中並處於初始狀態
將在創建此狀態時執行，因此在構建時
該代碼將首次運行
已經被執行了，讓我們來看一下實際效果，為此
需要回到主鏢並將該初始產品傳遞給
產品經理，因為我們期望在那裡具有價值，因此食品
測試器，然後在保存後執行操作，讓我們使用ctrl完全重啟
F5刷新所有現有狀態，現在如果我添加產品，仍然
可以，但是我什至不需要做，您會看到食物測試儀是
在這裡顯示，這當然意味著我們的邏輯
正在工作，我們正在傳下來，我們
使用小部件啟動產品訪問它，如果
您想知道為什麼我們不在這裡調用set state
即使whoopset狀態，即使我們
正在改變我們的狀態，如果那是您的假設，那麼您是對的
我們之所以不在此處調用set state的原因是因為正如我所說
初始化狀態在構建運行之前運行，因此無需
告訴flutter數據已更改，但未在屏幕上呈現任何內容
已經存在，因此無需重新渲染，因此了解其中存在的位置非常重要
它的狀態有些生命週期鉤，稱為
構造狀態對象時可用於執行代碼的方法
並且該州提供了此小部件屬性，
使您可以訪問已連接的有狀態小部件
在我們繼續之前，還學習瞭如何調試flutter應用程序以及
最後，所有的人都在這裡修復了我們的損壞清單
在我們這樣做之前，讓我快速向您展示這些生命週期掛鉤
提到你，首先重要的是
是狀態課程和狀態小部件，兩者之間存在差異
當然，無狀態窗口小部件用於創建窗口小部件，
將某些內容呈現給ui，您可以將數據傳遞給ui
到目前為止，我們對應用程序中的產品小部件的處理方式
我們傳入的數據可以在外部進行更改，這就是
以及我們應用中發生的事情，我們在產品管理器小部件中對其進行了更改
當輸入數據更改時，該無狀態小部件的ui會重新呈現
現在，有狀態小部件還與返回小部件有關
在上一講中我們看到的用戶渲染的ui
可以接收輸入數據，這些數據也可能在外部發生變化，我們在這裡看不到
但這是有可能的，然後我們也有
內部狀態，我們可以從小部件內部更改
這也將導致重新渲染，因此外部數據都會發生變化
以及內部狀態的變化將導致用戶界面被重新渲染
小部件的生命週期是無狀態的和有狀態的小部件
雖然生命週期不同，但生命週期不同
您可以添加到類中的方法，這些方法將為您執行
通過顫抖，無狀態小部件具有構造函數，您可以
執行，然後具有構建功能
在屏幕上畫東西就是所有這兩個功能
這將在無狀態小部件構建的生命週期中調用
每當外部數據更改時，可以多次調用
構造函數始終在狀態完整的小部件中可用
但是在那之後我們調用init狀態然後再調用
第一次建立，然後我們也可以致電
從此構建函數內部設置狀態或
準確地說，大多數情況下，當按鈕發生故障時，您會調用它
也被按下，例如在http請求完成時
然後重新構建，以便再次調用構建
但在這種情況下，您也可以對外部數據進行一些更改
沒有執行更新小部件，所以如果您
將數據傳遞給您的有狀態窗口小部件，因為我們正在使用起始產品
然後您將更改數據，然後執行更新小部件
然後構建會再次運行，因此生命週期更加複雜
但是為什麼我們不看看實際情況
回到我們的代碼中，讓我們從狀態少的小部件開始
產品小部件，我們有構造函數
我們正在使用快捷方式為產品分配值
現在我們可以重新添加構造函數主體，因為這是
最後我們必須刪除分號，然後
儘管現在這將在創建此產品小部件時執行
所以我將在此處向控制台打印一些內容，然後我將進行打印
產品小部件構造函數，以便我們可以快速查看
執行，我將復制該行並轉到構建
方法，然後在該構建方法中返回
我們當然可以在這裡執行代碼
我也將留下產品小部件圖章，但隨後
構建，以便我們可以看到何時執行
如果我們保存了該代碼，然後使用ctrl f5完全重新啟動該應用程序
然後我們在這裡看到我們的應用程序，但是在終端
我們看到構造函數先被調用，然後構建被調用
現在，如果我現在單擊添加產品，一旦我們看到添加的圖像，在這裡我們看到
錯誤消息，因為我們超出了界限
如果我們現在向上滾動，您現在可以忽略它，您可能
需要向上滾動很多，然後我們看到一個錯誤
關於我們要走出國門，
不幸的是，現在隱藏了我想告訴你的東西，所以讓我們擺脫
現在，通過刪除該圖像以保存該錯誤
一些空間，以便我們可以在其中容納更多元素
屏幕上出現錯誤之前，讓我們再次執行完全重新啟動
然後如果我回去看看構造函數並立即構建
我單擊添加產品，我們在這裡看不到任何東西，但是如果我
再次單擊只是因為延遲了一個
單擊那裡總是打印聲明
我們現在看到構造函數build被再次調用
這很重要，因為它們確實會再次被調用
在產品經理中重建了整個小部件
我們更改了產品，導致再次執行此構建方法
然後導致產品被重新創建
這是第一部分，但我們還要看看產品中到底發生了什麼
經理，讓我們首先進入產品
經理構造函數，所以關閉有狀態的小部件，讓我們添加一個
主體，讓我們添加打印語句產品經理小部件構造函數
讓我們複製一下，然後將其折騰到創建狀態
這樣我們也可以看到何時執行
然後讓我們進入初始狀態
產品經理現在狀態
讓我們在這裡添加此行產品經理
狀態初始化狀態復制該行，讓我們進入
當我們打印所有印刷品時，這裡的構建方法
現在在這裡構建，保存並再次完全重啟，現在
您已經看到它實際上像以前一樣執行了
在重新啟動的應用程序被打印之前，因為它發生在我們看到之前
屏幕上第一次有東西，這就是為什麼我們延遲了
一個額外的點擊，而不是真正的延遲，只是
只有當我們在屏幕上看到一些東西時，重啟才會完成
但是現在我們可以在這裡看到這實際上是我們開始的地方
致電產品經理的構造函數
這很有意義，因為在我們開始的main.dart文件中
我們在使用產品之前初始化或添加產品經理，因為
產品在產品經理內部使用
因此我們將產品經理的構造函數稱為createstate
正如您所猜測的那樣，會創建狀態，因此
初始化狀態被調用，然後我們在狀態中調用build，因為在內部
建立我們的國家，我們在這裡創建產品
然後，我們調用產品的構造函數和構建方法
到目前為止，這應該很清楚，讓我們現在返回並單擊添加產品一次
如果我們回去，我們現在看到發生了什麼事
這是我們現在離開的地方產品經理
由於設置狀態而再次執行狀態構建
這不會重建產品經理小部件
這就是為什麼我們看不到該構造函數或創建狀態的原因
再次執行，但是它確實重新執行了build方法
狀態，因為我們重新執行了該產品
被重建，因此構造函數和
被稱為產品的構建方法
順便說一下，所有重建工作都是非常有效的
顫抖不僅要重繪整個應用程序，還要注意
但實際上要檢查需要更改的內容，即使執行構建
比較新的和更新的用戶界面，它將繪製到
舊的，只改變需要的部分
進行更改以確保這是非常
性能高效的方法，這是您應該使用的生命週期
現在明白，我想向你展示一件事
在產品經理狀態下循環
也可以添加did update widget方法
只要您連接的小部件將執行
產品經理收到新的外部數據
現在在我們的應用程序中現在這沒有發生讓我
仍然在這裡添加打印聲明，並確實更新了小部件，請
認識到我們還得到了舊的小部件，它等效於該小部件
我們都在這裡使用的關鍵字，但現在不涉及
接收到已更新外部數據的已更新小部件，您可以獲取已更新的外部數據
數據在widget關鍵字上，但是舊的widget上，所以數據
就像在舊窗口小部件中一樣，以防萬一您需要
也許像這樣將更新的數據與舊數據進行比較
最酷的是，如果我們進行熱重裝，我們實際上會看到更新小部件正在
之所以調用此處，是因為最後進行的熱加載只會調用設置狀態
整個應用程序，因此它偽造了這個開始
給這個食物測試儀發短信，即使它沒有被更改
它會假冒發生這種情況，因為它將整個應用程序的設置狀態稱為
重新渲染它，因此我們看到確實更新了小部件
在我們再次構建產品之前調用
經理狀態，因此如果您的
狀態屬於一個小部件，該小部件接收可能會
如果您想在這樣的環境下做某事，請更改
現在有關小部件的更改很多
所有這些小部件都使用了材料設計
現在設計的材料是什麼，您可能看起來像這樣
請注意，這是Google的設計系統
現在可以在網絡和移動設備上看到很多Google應用程序，而
由Google開發的不僅是每個人的Google設計
相反，材料是一個具有很多
指導效果最佳的最佳顏色組合
在用戶界面組件的某些外觀和字段中
可用於移動應用程序，Web應用程序和桌面應用程序
到處都可以使用它，它當然被谷歌所接受，但是它也
開放較少的googlish和更可定制的，因此在
ios應用程序也很棒，而且Flutter實際上使用了
材質設計，您仍然可以調整外觀
看起來像ios cupertino風格，這也是我還將展示的東西
您稍後將在本課程中學習，但我們將從材料的外觀入手
因為了解它不是Google的風格很重要
每個人的確可以像您一樣高度自定義
我會提到學習和材料設計
內置於顫振中，因此我們將使用它，並且我們將
得到這個不錯的設計，我至少喜歡它
開箱即用的應用程序，而無需我們做
現在我提到任何設計工作，我們都可以調整
主題，現在我們可以調整外觀了，我們可以在主dart文件中進行設置
在我們的材料應用程序中，我們可以添加另一個參數
主題參數，我們傳遞主題數據
這也是從顫振材料導入的對象
主題數據需要設置許多不同的顏色和样式
例如非常重要的主色板
色板是一組顏色，其中我們定義了一種顏色
其他所有顏色都會自動推斷出來
我們可以方便地使用顏色來分配顏色
顫振包提供的特殊對象
在那裡我們可以訪問所謂的靜態類型
所以基本上我們可以在不實例化顏色的情況下訪問屬性，所以我們不
在此處添加括號，我們直接在類上調用某些內容
在這裡，例如，如果我們現在保存此顏色，我們可以添加深橙色
您會看到應用程序欄自動為橙色，而不僅僅是
應用欄上的其他內容
應用程序，例如，如果你想給那個
看起來我們可以去產品經理的按鈕
這是我們使用該按鈕的地方
我們可以轉到該按鈕，然後將有一種顏色
我們可以通過的論點，在那裡我們現在可以使用我們的主題
通過使用由flutter提供的特殊對象（稱為主題）
它有一個off方法，現在我們在其中傳遞此上下文，因為此上下文
存儲元數據信息，例如我們應用的一般主題
所以我們將其傳遞給主題，然後我們可以訪問例如
原色在這裡，如果我們現在保存它
現在這個按鈕是橙色的，這很方便
順便說一句，讓我也重新添加該圖像，因為我不在乎損壞
列出更多，只是想讓該圖像回來
這樣我們就可以使用主題，並且我們可以添加的不僅僅是
我們可以為主要色板設置專用的強調色
我將在整個課程中使用深紫色，因為我認為紫色
非常適合橙色，您也可以設置
無需設置應用的亮度，因為默認設置沒問題
但在那裡您可以訪問亮度對象，而在黑暗處
還是light靜態屬性（如果我選擇Dark而不是默認值）
您現在看到我們的背景看起來很暗
如果我選擇，原色也被覆蓋
亮但是我們回到默認模式
我們使用白色背景的顏色，但您可以同時使用
這真的很方便，您可以隨意玩更多
您可以在此處設置不同的內容
他們中的大多數應該是非常描述性的
一旦完成課程，這就是材料設計
以及如何調整它，您可以隨時對其進行調整，使其更像ios
具有較少的陰影等等，但這就是我將要回到的內容
課程稍後的專用模塊
添加主題之後，讓我回到使用的語言上來
因為對於主題，我們將這些靜態屬性用作
我現在說什麼是靜態屬性
看起來像這樣，我們可以看看顏色對象
通過按住命令或控制並單擊它
大多數的ide應該提供這樣的功能
我們看一下flutter包添加的文件
在這裡，我們實際上看到瞭如何定義這樣的靜態屬性
名稱前面帶有static關鍵字
和const現在是和
最終有點不同，但最終意味著它是一個價值
不會改變，這就是我們定義
名為透明的靜態屬性，在這裡我們得到了所有屬性
可以導入黑色，如果我們搜索它，我們也會找到
深橙色在這裡
那裡我們得到了材料顏色類型的靜態常數
內部類型深橙色，所以這是飛鏢的另一個特點
我們可以定義靜態屬性，這些屬性可以從
類而不實例化類，因此
現在不執行構造函數，無論我們已經使用了什麼功能，但是
我也想向您展示如何自行創建
被命名為參數，我們在main.dart文件中使用它，例如
我們傳遞給themedata的參數，它們都有一個名字冒號，然後
到目前為止，我們和我們的構造函數的名稱值
示例，在我們的方法中，我們僅使用
位置參數，例如產品經理中的產品
經理構造器這裡的起始產品是位置
參數，因為第一個值傳遞給了產品經理，所以
main.dart文件，此字符串存儲在此
如果您只有一兩個的話，現在就開始產品
使用該參數很有意義，但也許您得到了
多個參數，您想按名稱定位
還允許您不為其中一些設置值
然後可以將其用花括號括起來，現在它已經是一個命名參數
就像現在一樣容易，我們可以通過定位來傳遞值
此處是初始產品，然後是冒號，然後是值
所以現在我們針對這個名為
起始產品，因為我們在這裡選擇了名稱，
我們將值傳遞給它並將其設置為此
最後一個字符串，我們也可以通過設置默認值
添加等號時間來切換產品，讓我們
現在轉到糖果測試儀，將糖果測試儀作為名稱
建議是測試糖果的專用工具
他們的成分是健康還是不健康
他們就是這樣，現在這將使我們能夠
實際上在我得到一個
錯誤，現在這很好，因為如果我們
現在進行完全重啟，我們看到我們從糖果測試器開始，但是
我們可以通過重新引入目標名稱來覆蓋它
參數，現在，如果我們執行完全重新啟動
我們再次從食物測試儀開始，所以可選參數
您也可以這樣做，也可以設置可選參數
對於像我們的產品這樣的位置論點，我們假設
我們默認要從此處的空列表開始
可以添加等號，然後添加您要開始的值
如果它是可選的，那麼您還需要包裝整個
這裡用方括號將參數賦值
對於命名的，在兩種情況下都使用花括號
對於位置一，僅包裝可選的，然後
現在這裡有方括號，我很快就得到紅色的線條，
必須是常數，這又是飛鏢的特殊功能
我們必須在此處添加const關鍵字，這意味著
這是一個無法更改的列表，所以現在您無法致電
在此處的產品列表中添加或添加等等，這就是我們現在在此處存儲的內容
意味著現在對於產品經理，我們實際上不必通過產品
我們可以刪除執行完整的應用重啟
然後我們當然不渲染任何東西，我們的應用程序壞了，因為
我們不會將要轉換的產品傳遞給產品
但這會起作用，在這裡沒有太大意義，所以讓我重新添加一下
因為我們當然想將我們的產品傳遞給此處的產品小部件
但您可以在整個課程中使用此類可選參數
我們將建立越來越多的方法並使用這些功能
我只想讓你知道這裡幕後發生的事情
所以我覺得一些重要的飛鏢功能很重要
在這一點上，而我做
盡我所能涵蓋很多我們在這裡使用的飛鏢功能並進行解釋
他們，如果你想學習一切
飛鏢還訪問dartlang.org，這是官方的飛鏢
語言頁面，例如，您可以在其中
語言導覽以全面了解所有內容
您需要了解dart的工作原理，它具有哪些關鍵字
您創建var變量final和
const是如何創建類，泛型等等的方法，因此請查看
如果您想了解有關飛鏢的所有知識，請訪問此頁面，但是我會再次
重申並解釋我們正在使用的核心概念
當我們在本模塊中使用它們時，我們學到了很多
洪水包裝的小部件和基礎知識
當然要消化很多信息，所以一定要來回走
並在這裡重申概念，我們還將在整個過程中使用它們
當然，這應該變得更清楚了，現在是時候練習最多
重要概念，所以這是您的第一個作業
您正在從一個空項目開始的新flutter應用，您發現它已附加到
該視頻，或者您只是創建一個新項目，
清空main.dart文件，以便您從這個項目開始
希望您創建一個新的flutter應用程序，以便創建該根窗口小部件
您學會瞭如何創建等等，因此創建
並確保您要在該頁面上使用一個應用欄，並且
現在，在第二步中，下面需要一些文本，然後
添加一個按鈕來更改該文本並將其更改為另一個
硬編碼文本，此時無需用戶輸入，我們將其添加
稍後，但是有點複雜，所以只需要一些硬編碼的文本和步驟
第三是拆分您的應用
可能現在位於一個小部件中，到目前為止分成三個小部件
應用小部件文本控件小部件，其中還包含按鈕
然後是一個用於輸出文本的小部件，這將是非常精細的
拆分可能沒有太大意義，因為
您可能不會有那麼多小部件
在文本小部件中，但仍然是關於練習這些內容的練習
您可以傳遞數據等等，這就是您的任務
它僅包含我們在本模塊中學到的內容，因此絕對可以回到
如果您需要再次練習一些較早的課程
然後將您的解決方案與您在解決方案部分中找到的解決方案進行比較
觀看我的解決方案視頻，我將帶您逐步了解
解決方案，所以讓我們解決這裡的分配是
我們的任務我會留在那兒，然後我們開始
首先，進口包裝材料是因為
material.dart文件包含我們通常需要的所有內容
然後我們需要一個類我的應用程序，您可以根據需要命名它，但是通常
根小部件稱為myapp，在這裡，我會在沒有括號的情況下鳴叫
然後擴展少或滿的狀態，讓我們開始
帶有最後一個狀態的小部件，因為我們只需要輸出一個應用欄
和一些文本，所以現在什麼都沒改變
因此，讓我們從這裡的最後一個狀態小部件開始，您了解到那裡我們需要
添加用於接收構建上下文的構建方法
參數，然後返回一個小部件
因此，定義該類型是一個好習慣
在構建方法的前面，我們也將其標記為
覆蓋，因此很明顯，我們正在覆蓋內置
現在這裡的方法我們需要返回一些東西，因為這將是我們的
根小部件，我們首先返回一個材質應用
完成所有核心連線工作後，我們就可以定義主題，例如
雖然我不會定義主題
您當然可以自由操作，我只會添加主屏幕，因此
第一個窗口小部件應顯示的第一個內容，以及
在那裡，我想使用應用程序欄創建一個完整的頁面
和背景，為此，我們使用腳手架小部件
它也隨風飄揚，現在腳手架小部件應保持
應用欄和該主體，所以讓我們定位應用欄
並添加內置的應用欄小部件
我們可以設置的title參數，並且title應該是一個數字小部件，它是一個
文本小部件，在這裡我只說作業1，我們不只是想要
有應用程序欄，儘管我們還將主體添加到
腳手架，現在將是我想要的文本
現在你不能只添加這樣的文字我
實際上會在這裡使用容器，甚至使用中心
你還沒有學到，所以我不希望
你知道這個中心只會使一個值居中
水平和垂直也需要一個孩子
然後應該居中的小部件，所以當然會建立中心
陷入撲朔迷離中，我將有我的文字，這是
第一次作業也許是
完全由您決定，我們有了第一個小部件
再次使用center在此處創建是可選的，僅使用文本即可
很好，現在可以將其繪製到屏幕上
該應用程序啟動後，我們必須添加一件重要的事情，
那是
main方法，如果您記得您在其中添加main，
否則它將無法正常工作，您必須調用run app並運行app
您傳遞了要創建的小部件，因此我的應用
用括號來構造一個基於
在那堂課上，現在您應該可以在屏幕上看到一些東西了
在進行瞭如此大的更改後，您可能需要在此處進行完全重新啟動
就我而言，這還不夠，因為我仍然有那麼老
應用程序正在運行，因此我們將退出調試過程
然後按ctrl 5重新啟動它，現在將再次構建項目
並將其運送到虛擬設備上，這可能需要花費幾秒鐘的時間
一旦完成，我們就在這裡
完成的應用程序或現在通過應用程序欄在模擬器上運行的現在完成的應用程序
然後中心文本再次成為中心
第二個可選任務是現在添加一個按鈕，允許我們更改該按鈕
要添加按鈕的文本，我們首先需要能夠渲染多個
小部件，讓我為此使用一個列，而我實際上將使用
列而不是中心，因為兩者
其實反正不能很好地合作我會生我的孩子
我現在將文本包裝在該列表中
當然，我不只是想要文本，我將擁有該按鈕，我將
使用凸起的按鈕，也有其他按鈕，但我會
在這裡再次使用提高按鈕，它將容納一個具有以下內容的孩子
該按鈕在我的情況下將是一些文本
我說的是更改文字，因為那是單擊後會發生的情況
按鈕，別忘了按一下
您將引用傳遞給函數的參數
現在該函數什麼都不做
有了這些，我們可以改變所有事情
以後如果我們想要，但是我們得到那個按鈕，當然
現在什麼都不做我們需要做什麼
為了使該按鈕做得很好，我們需要向該代碼中添加代碼
在按下時起作用，但當然在無狀態
小部件，我們將永遠無法更改代碼
或更改我們的數據，讓我們將其變成狀態已滿的小部件
現在我們可以關閉第一類了，讓我們關閉它
讓我們創建另一個類來強調我的應用
狀態高呼我的應用程序狀態類，該類擴展了通用的狀態
引用我的應用程序以創建該鏈接的對象
然後將具有此構建方法，並在我的應用程序小部件中添加create
由我的ide自動完成的狀態，該狀態將返回
鏈接到有狀態的小部件，然後返回我的應用狀態的新實例
像這樣，這是一個狀態已滿的小部件，它
允許我們向myappstate添加屬性，我們可以
從那裡改變，所以在這裡我將有我的
假設您可以根據需要將其命名為字符串類型的主文本
最初是說它是一個空字符串，或者說最初是不是
該文本當然是因為這是我們要開始的文本
所以我們現在在這裡添加它，主要文本是一個屬性
應該按照dart約定的方式在主文本上加下劃線
現在主文本是我可以在該狀態類中使用的屬性
我想在此文本中使用它，我不會
輸出一個字符串，否則我將輸出一個，但不帶引號，而是
引用主文本屬性，當然是該字符串
現在我們可以在其中單擊按鈕時進行更改
我們可以將設置狀態稱為重要狀態，否則ui不會重建
然後在其中設置等於此更改的主文本
現在，如果我保存並執行完全重啟
使用ctrl f5後，通常需要
你改變了這樣劇烈的事情，改變了你的狀態
如果您單擊更改文本，則現在在完整的陳述中的最後一個小部件
您會看到此變化並且位置發生變化，因為按鈕是
自動與頁面上的其他內容居中
因為該內容變短了，所以它在左邊
現在這是我們的按鈕，僅更改一次文本，否則實際上它將重置它
發生這種變化，但我們看不到
當然，第二個任務已經解決，讓我們繼續執行任務
第三，這是一個多餘的任務，
將其全部保留在一個小部件中會很好，但是
練習我們將其拆分為免費
然後，我們擁有的應用小部件應包含一個文本控件小部件，
包含文本小部件，所以我們添加兩個新的
文件文本下劃線控制點飛鏢和
文本輸出，我將其命名為文本輸出，而不是文本，因為已經有一個
內置文本小部件，以免與
我將使用不同的名稱，現在讓我們回到主飛鏢
讓我們在這裡抓住專欄
在該支架的主體中，讓我們將其放入文本控件中
在那裡，我們首先需要從
從材料飛鏢文件中扑出的包裝
然後我們創建一個類文本控件，它將擴展狀態
完整的小部件在這裡，因為我想在那裡管理我的文本
這意味著我當然要添加創建狀態，我們需要添加第二個
類下劃線文本控件狀態
擴展了指向文本控件的狀態
在那裡，我們將擁有構建方法和構建方法
好了，我們將返回我剛從主切出的內容
dart文件此列，其中有按鈕和文本
現在缺少主文本屬性，我們可以在主飛鏢2中使用它。
因此，讓我們複製或剪切主要文本將其移至文本控件狀態，例如
這個，現在這又在那里工作了
文本控件看起來也很棒，但是當然
創建狀態我們需要創建文本控件狀態的新實例
我們在這裡創建的類，所以現在我們添加了文本控件小部件
與小部件本身和保存我們專欄的狀態
現在我們還獲得了文本輸出小部件，現在我說這將有點多餘
因為它將很好地容納已經是
我猜只是一個小部件，但要練習傳遞數據
讓我們仍然將其封裝在我們自己的小部件中
讓我們再次轉到文本輸出，讓我們導入包flutter
將flutter材質的dart包打包，讓我們創建一個類文本輸出
再次未命名的文本不與內置文本小部件衝突
它在這裡擴展了狀態少的小部件，因為它只會接收數據而不會
內部更改以接收數據，我們需要添加一個構造函數
文本輸出，然後我們需要一個屬性來存儲我們要獲取的數據
這將是名為main text的最終屬性，例如，它將是
一個字符串，最初它是未定義的，但是在這裡我們將以此為目標
順便說一句，this是使用this的少數幾個地方之一
快捷方式的關鍵字，然後我們需要
當然，ide的構建方法可以為我完成它，而我們只是
返回我們引用主文本的文本，例如
這是我們的文本輸出小部件了
有點多餘的變化，但是適合現在就練習
文本控件，我想使用該文本輸出，所以我需要
導入它，所以我們添加一個導入語句
指向文本輸出點飛鏢，並與我們導入
該文件中的所有內容，因此我們正在導入該類
我們可以在這裡使用它來傳遞文本輸出並傳遞我們的主要文本
到它，以便現在可以呈現
最後一件事是現在還將我們的文本控件小部件也連接到主
dart文件，因此在主dart文件中，我們導入
從文本控件導入文本控件
這樣，我們現在可以在此處使用該文本控件小部件
現在我要在主dart文件中使用它，我將首先
將此轉換回無狀態小部件，因為我不在根目錄中管理狀態
應用程序，然後我們就可以擺脫創建狀態並
該類定義的下面，然後添加覆蓋的構建
方法到我的應用程序中，然後我將在其中添加它
導入的文本控件小部件，在這種情況下
沒有收到任何參數，因為它沒有配置為這樣做
並保存所有內容，然後進行完整
重新開始
您可以返回到您的應用，它的行為應與以前一樣
現在我們進行了拆分，現在有了這些核心功能
現在練習了，您可以做得更多
關於頁面佈局上的輸出
您可以做更多的事情，我們會做的，但是基礎知識
現在應該設置
現在，我們還練習了有關小部件以及如何傳遞數據的基礎知識
讓我們深入了解一個高級示例，我們得到了我們的產品
經理，在小部件樹中，
顯然有我們提出的按鈕，現在沒有具體
需要將凸起的按鈕移到
不同的組件讓我說，將其包含在
產品經理，但假設我們在一個更複雜的按鈕中
小部件，我們也有標題，也許有些
圖片，因此出於某些原因我們將其外包
將按鈕提升到自己的小部件中，讓我們快速進行操作
我會從產品經理那裡剪下來
並添加一個新的小部件，我將其命名為產品控件
現在在產品控件中先點點飛鏢，我首先要導入一個
包裹，那個包裹會撲朔迷離，
到目前為止，該包中的material.dart並不奇怪，並且在
在那裡，我想創建一個新的小部件，產品控制小部件
很明顯的問題是，這將是一個充滿狀態還是無狀態的狀態
小部件，它將是最後一個狀態小部件，因為我想要的
要做的是我想顯示該按鈕，它甚至不會收到任何外部
數據，它實際上只會呈現此按鈕
靜態地，這是一個小部件，其中小部件樹永遠不會改變
仍然是一個小部件，因此我們必須在覆蓋
內置一個，現在在這裡我想返回
我剛剛從產品經理那裡剪下的代碼，讓我們粘貼
它在凸起的按鈕，顯然我不能在
現在這裡不是高級食品測試儀
去上班，那我該怎麼辦
目標是在這裡使用該產品控件，該產品控件小部件
在產品經理內部，讓我們開始吧
並導入它，以便我在頂部添加一個導入並導入我的產品
control.dart文件，然後我將繼續進行構建
方法在這裡，我將使用我的產品控件
我將調用默認的構造函數
必須明確添加，這將給我一個新的實例
類，因此這個新的小部件對象
現在這幾乎可以工作，但現在這裡仍然不能設置狀態
顯然你可以說讓我們變成無國籍
產品控件小部件中的此處的小部件更改為狀態完整小部件
然後我們可以添加此狀態類並開始管理狀態
問題只是我不需要產品控件中的狀態
我需要產品經理，因為我可以將其傳遞給產品
這是我最終想要得到的地方
所以產品經理應該保持狀態飽滿
小部件，因為在那裡我需要那種狀態，因為在那裡我連接到小部件
我需要將信息傳遞到產品小部件本身的地方
變成有狀態的，因為即使我需要
這裡的產品信息我不會在該小部件中更改，因此
產品經理確實是產品控制之間的聯繫
和產品，這是我要你了解的第一件事
這也是一個叫做提升狀態的概念
我們要在具有訪問權限的小部件中管理狀態
所有可以更改它的小部件，例如產品控件
或要求小部件聲明我們正在更改的數據
在我們的案例中是產品小部件，因此產品經理
是連接小部件，可連接到所有執行此操作的小部件
更改或需要狀態現在的問題是我該如何通過
按下此按鈕的信息
產品控制權交給產品經理，這樣我就可以
然後在產品經理中很好地設置狀態
為此，我們在狀態中創建一個新方法
產品經理的狀態在這裡，我將在
初始化狀態和更新小部件，我將在此處添加新方法
而且此方法不會返回任何內容，因此我將白色添加為返回類型
那麼它將以下劃線開頭，原因與產品啟動的相同原因相同
帶有下劃線的是我僅在其中使用的類
文件，我不希望任何人導入此類或直接
訪問我不想要的此類的方法或屬性
任何人都可以直接使用該類，但此處的產品經理小部件除外
所以我先在名稱中使用下劃線，然後再命名
更新產品，名稱完全取決於您，因此
在這裡更新我的產品，我希望在這裡得到一個論點，
論點應該是新產品，也許
將其命名為添加產品，因此更加清晰
在這裡，我將收到要添加的產品的參數，
讓我們在這裡定義類型以編寫更好的代碼
讓我們在名稱前面添加一個字符串，以便清楚地知道
這裡的方法將收到一個參數，它是一個字符串，現在我
定義添加產品，現在我可以轉到產品控件
並從那裡剪切我的設置狀態代碼，因為無論如何我都無法在那使用它
這不是一個有狀態的小部件，現在將其移至添加產品中
在這裡，我不想添加高級食品測試儀，但是我要添加的產品
接收作為參數，所以我現在添加產品
調用設置狀態，我可以在這裡做，因為我在
屬於有狀態小部件的狀態對象
然後添加我收到的產品作為參數
剩下的問題是我想打電話給添加產品
每當按下此按鈕但該按鈕位於其他小部件中時
我們如何解決那是我要你帶走的第二件事
提升狀態是一個重要的概念，但現在要提供另一個小部件
訪問此小部件中的方法，我們可以簡單地傳遞一個引用
到應該具有此訪問權限的小部件
所以我可以將添加產品作為參數傳遞給產品控件，請注意我
不執行它，我不加括號
為什麼，因為如果添加括號，我不想立即執行它
在這裡它將執行該方法，無論
build方法運行，並且只會傳遞返回類型
產品控制的這種方法在這種情況下是無效的，所以我不
想要這樣做，我不想通過返回類型
我想傳遞對此功能的引用
因此該功能尚未執行，我們只是傳遞地址
功能到產品控制
現在我可以去產品控制並期望這個
作為構造函數的參數，所以我將在此處添加構造函數
我想接收該功能參考並將其存儲在
該類的屬性，我將創建一個新的決賽
屬性，除非重新創建此小部件，否則永遠不應更改
我將其命名為添加產品，您可以為其指定任何名稱，
您會看到它與表面上的小部件名稱不同，儘管
可能但是在這裡我沒有下劃線
我真的只是想澄清一下，可以命名為您想要的
我也可以定義類型，這裡的類型將是一個函數
函數是dart中的一個單獨類型，聽起來很簡單
就像這意味著在此屬性中，我們將存儲對
功能，這意味著現在在這裡我可以說
這個添加產品，所以無論我在此收到的任何論點
構造函數將綁定到該屬性，現在我們可以訪問
即使我們沒有在此小部件中起作用
在這個小部件中定義函數，這意味著當我按下它時
可以執行添加產品，然後當然也可以
傳遞參數，因為記住添加產品
是一個期望一個字符串的函數，所以我想傳遞一個字符串，讓我們離開
充滿異國情調的產品的世界，也許我們就以這種糖果命名
因為如果我們現在這是充滿糖果的形象
保存並重新啟動以清除所有內容
現有狀態，這是我們的應用程序，如果我單擊添加產品
我們仍然添加此新項目，但現在我們通過按鈕或
通過單擊位於不同小部件中的按鈕，然後
這是我想讓您理解的一個高級概念
如果您想向上傳遞數據，那麼如果小部件中發生了某些事情
父小部件需要了解它，而我們的父小部件
案例是產品經理，那麼您可以通過傳遞
引用在父小部件中執行的功能
在我們最終離開此模塊之前，現在了解至關重要
重要基礎知識這是關於
飛鏢語言，所以不是撲朔迷離的東西
但是要在產品經理中飛鏢，我們有清單
正確的產品列表，我們將更改此產品列表
例如，因為我們在這里以設置狀態添加新產品
現在我們之前在dart中也看到的一件事是，當我們通過
構造函數，我們通常將此綁定到屬性
我們要在其中添加最終註釋的地方
這不是運行代碼所必需的，而是使自身顫抖或飛鏢
本身告訴我們應該這樣做，因為我們會收到此警告
該類被標記為不可變的，這僅僅是
之所以發生，是因為無狀態小部件被標記為
這只是告訴我們，嘿，弄清楚事實是一個好習慣
您在此處使用的數據是不可變的，這意味著
您不能從內部更改它，因為這在這裡沒有任何作用
無論如何現在我們可以回到產品上
經理狀態，這可能會讓你感到驚訝
轉到我們肯定會做的我的產品清單
更改，我也可以在其中添加final，如果我保存此代碼並完整
重新啟動，我回到應用程序，它仍然有效
像現在一樣，為什麼當我將其標記為最終版本時
為什麼我們仍然可以添加產品，這是需要了解的重要信息
飛鏢語言及其運作方式
final確實表示此屬性為final我們無法分配新值
但這是重要的
在現有列表上添加我們不會分配新列表
我們正在編輯現有的，但重要的是，這個概念稱為
僅更改現有參考類型
內存中的對像不會創建新對象
因此，它不會為產品分配新的
順便說一句，如果我有一個數字，這對數字是另一回事
8這裡說42歲，那不是我的年齡
但可以說這是我們的年齡，現在處於設定狀態
我想將年齡設為29歲，即我的年齡
好吧，那麼我在這裡得到警告，年齡不能用作二傳手
最後，因此我們無法分配新值，很明顯我們在做什麼
這裡我們分配一個新值，因為這裡帶有等號
您不會在此處看到產品的等號，並且
因此，如果您說產品，您當然會失敗
現在是具有一個字符串的數組，這將是一個有效列表，其中包含一個
字符串和乘積應該是字符串列表，但是
我們得到與年齡相同的錯誤，我們無法做到這一點
因為這是最終的，所以分配新值需要
等號不可能改變現有的
價值是可能的，因為列表和對象通常
是引用類型，這意味著我們僅在此處存儲對對象的引用
在產品中對此數組的引用，如果我們再使用
該對像上的方法以及此數組或列表也只是對象的所有內容
是dart中的一個對象，甚至是一個數字，如果我們隨後在其上調用方法
好的，這會更改現有元素，但是
不會創建和分配新的，這是唯一的
最終阻止，因此，例如，如果我接受我的
再次變老，我在上面調用一個方法，如將其四捨五入，然後您會看到
我在那裡沒有任何錯誤，因為它具有相同的邏輯
我可能正在與現有的做某事
數字雖然回合將返回一個新值，但實際上不會改變舊值
一個，但我可以安全地做到這一點，我可以做到
如果我不將其重新分配給年齡，更改它的數字上的任何內容
現在，這是一個挑戰，將您的頭纏住
但是了解最終的基本條件至關重要，這使我們
如果要確保我們也絕不重複使用等號一次
可以使用例如add方法更改值
那麼我們可以在dart中使用另一個工具，那就是const關鍵字
在等號的右邊，這意味著
這個值現在是常數，因此如果我現在
保存此內容，我們進行完全重啟，您已經可以知道似乎
會出現一些錯誤，如果我返回，我們確實會在屏幕上看到錯誤
不支持的操作無法添加到不可修改的列表
很明顯，我們的清單被聲明為不是
由於該const關鍵字可修改，因此它已經可以理解
不幸的是，在這裡調用add將是一個問題，但這並沒有告訴我們
至少不在Visual Studio代碼中，但是一旦運行我們就會收到該錯誤
代碼，甚至在我單擊任何地方之前，我們都已經知道了，因為它不是
只是在我們調用添加產品時發生，當我們嘗試添加產品時已經是一個問題
在此處為其狀態分配一個值，我們第一次調用添加，
那裡我們已經嘗試更改一個標記為不可更改的列表，所以如果
您要確保永遠不能更改值的使用
等號右側的const如果
您只想確定自己將永遠無法分配一個
屬性的新值，然後在屬性前使用final
這個名稱可能看起來超級先進，而且
有點不必要的理解，但這是
語法，您會看到很多，我希望您了解這裡發生的情況
所以讓我在這裡刪除const，我也會刪除
最後，因為我不在乎我們是否在此處分配新值
我只想讓您了解最終的做法和缺點
當在等號的左或右符號上添加時
就是這個模塊，我們學到了很多重要的基礎知識
最重要的是，我們了解到
都是關於小部件的，這確實是您的事
必須帶走，你必須進入頭腦，這樣才能說出顫動是
所有有關您組成用戶界面的小部件的信息
您通過一組內置小部件在應用程序中看到的內容
當然也可以放到自己的習慣中
小部件，以便您獲得可重用的ui組件
然後可以用來構建用戶界面
所以一切歸結為這些小部件，然後您構建此小部件
樹記住，您擁有該根小部件，該小部件是應用程序小部件
包裹在您的根小部件中，然後您得到了腳手架小部件
一個頁面，然後在該頁面上將正文
您擁有一列的所有其他小部件，其中可能有一個
圖片和文字，這就是您的製作方式
奉承的應用程序，然後您一方面擁有無狀態的小部件
這些是僅將數據作為
輸入他們不一定要輸入的內容，然後返回
一個新的小部件樹，它們具有此構建方法，該方法將返回小部件或樹
的小部件，此小部件樹可能會受到影響
通過構造函數收到的外部數據
但這不是必須的，您也可以有一個無需任何操作即可運行的小部件
僅顯示靜態樹的外部數據
永不改變，您還擁有狀態完整的小部件
也可以像狀態少一樣接收外部數據
小部件，儘管它們存在於
屬於這些小部件的狀態對象
但他們也可以很好地使用該狀態對象
他們可以管理可以更改的內部數據
設置狀態，它也會再次調用build函數，因此
也導致生成方法被執行，
重新渲染窗口小部件樹，因為這是對
小部件中的外部或內部數據
導致重新渲染週期，因此生成方法
重新執行並創建新的小部件樹
然後顫振將這棵新樹與舊樹進行比較
已經渲染到屏幕上的樹，將渲染任何差異
並更新您的視圖，我們還使用了
飛鏢，重要的是要了解如何飛鏢
dutter是與flutter相關的編程語言
這不是替代方案，它只是一種編程語言，因為
顫振是工具附帶的sdk
您需要構建本機移動應用程序，因此需要編譯工具
將dart代碼轉換為本機代碼，以便說出或包裝它
在本機代碼中，但它也是一個dart框架
因此它不僅是一種工具，還是一個框架，它提供了豐富的
您可以用來構建應用程序的類和小部件
我們一直在使用的所有這些小部件都被顫動了
dart是一種面向對象的編程語言，這意味著您可以使用
類，您可以通過調用實例化這些類
他們的構造函數，它也使用靜態類型
只是意味著您定義要獲取的數據類型
存儲在變量中的由函數返回等等
看看我指著你的飛鏢語言之旅
如果您想潛水，請在本模塊中了解有關飛鏢的更多信息
真的很深入，您將在本課程中學習更多
儘管現在也很重要
使用更扁平的小部件的一部分是，您可以通過
周圍的數據以及您了解小部件的生命週期
現在您可以使用小部件的構造方法在小部件之間傳遞數據
這是您可以沿小部件樹向下傳遞數據的方式
數據到有狀態小部件的子小部件
數據也可以從小部件傳遞到狀態對象
因為請記住，您通過以下方式創建有狀態的小部件
基本上連接兩個類，您可以通過此特殊小部件傳遞它
屬性，可讓您訪問自己的窗口小部件的屬性
狀態和狀態小部件提供了其他功能
您可以執行代碼的生命週期方法
初始化狀態並完成了更新小部件，這些將在某些事情發生時執行
首次創建窗口小部件及其狀態時的狀態
在小部件收到新的外部數據時確實更新了小部件
您可以使用它們在這些事件上運行代碼
所有無狀態和有狀態的小部件都具有構造函數和構建
當構造函數被調用時的方法
小部件已創建或重新渲染，因此如果父級
重新渲染此小部件所屬的樹
然後始終在重新渲染小部件時調用build方法
奉承者需要build方法和它返回的小部件來知道它是什麼
應該畫在屏幕上，這是關於顫動的基礎
您現在必須知道，我們顯然會更深入
但是現在這是你應該知道的
您