Flutter有生成構造函數(shù)、默認構造函數(shù)、命名構造函數(shù)、重定向構造函數(shù)、常量構造函數(shù)、工廠構造函數(shù)
公司主營業(yè)務:網(wǎng)站設計制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出周村免費做網(wǎng)站回饋大家。
生成構造函數(shù)是最常見的構造函數(shù),即生成實體類對象。
如果未聲明構造函數(shù),則會提供默認構造函數(shù)。 默認構造函數(shù)沒有參數(shù),并調用父類無參數(shù)構造函數(shù)。
默認情況下,子類中的構造函數(shù)調用父類的未命名無參數(shù)構造函數(shù)。 父類的構造函數(shù)在子類構造函數(shù)體的開頭被調用。 如果還使用初始化了列表,則會在調用父類構造函數(shù)之前執(zhí)行。 執(zhí)行順序如下:
如果父類沒有未命名的無參數(shù)構造函數(shù),則必須手動調用父類中的一個構造函數(shù)。 在子類的構造函數(shù)體之后用冒號(:)指定父類構造函數(shù)
當需要定義一個有特別含義的構造函數(shù)的時候,可以通過命名構造 形式:構造函數(shù).XXX來命名構造函數(shù)
有時構造函數(shù)需要重定向到同一個類中的另一個構造函數(shù),在冒號后面用this:
如果你的類需要成為永遠不會更改的對象,則可以使這些對象成為編譯時常量。 定義const構造函數(shù)要確保所有實例變量都是final。
不用直接創(chuàng)建對象(可以通過調用其他構造函數(shù)創(chuàng)建)
Flutter支持穩(wěn)定的桌面設備開發(fā)已經(jīng)一段時間了,不得不說,F(xiàn)lutter多平臺支持的特性真的很香。我本人并沒有任何桌面開發(fā)的經(jīng)驗,但仍然使用Flutter開發(fā)出了一個桌面版小程序,功能很簡單,就是對輸入的json做格式化處理和轉模型。
話不多說,先來看看實際效果。 項目源碼地址
開發(fā)環(huán)境如下:
Flutter : 2.8.1
Dart : 2.15.1
IDE : VSCode
JSON作為我們日常開發(fā)工作中經(jīng)常要打交道的一種數(shù)據(jù)格式,它共有6種數(shù)據(jù)類型: null , num , string , object , array , bool 。我們勢必對它又愛又恨。愛他因為他作為數(shù)據(jù)處理的一種格式確實非常方便簡潔。但是在我們做Flutter開發(fā)中,又需要接觸到json解析時,就會感覺非常棘手,因為flutter沒有反射,導致json轉模型這塊需要手寫那繁雜的映射關系。就像下面這樣子。
數(shù)據(jù)量少還能接受,一旦量大,那么光手寫這個解析方法都能讓你懷疑人生。更何況手寫還有出錯的可能。好在官方有個工具**json_serializable**可以自動生成這塊轉換代碼,也解決了flutter界json轉模型的空缺。當然,業(yè)界也有專門解析json的網(wǎng)站,可以自動生成dart代碼,使用者在生成后復制進項目中即可,也是非常方便的。
本項目以json解析為切入點,和大家一起來看下flutter是如何開發(fā)桌面應用的。
要讓我們的flutter項目支持桌面設備。我們首先需要修改下flutter的設置。如下,讓我們的項目支持 windows 和 macos 系統(tǒng)。
接下來使用 flutter create 命令創(chuàng)建我們的模版工程。
創(chuàng)建完項目后,我們就可以 run 起來了。
先來看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。
我們在新建一個桌面應用時,默認的模版又一個Appbar,此時應用可以用鼠標拖拽移動,放大縮小,還可以縮到很小。但是,我們一旦去掉這個導航欄,那么窗口就不能用鼠標拖動了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會導致頁面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過 bitsdojo_window ,我們可以實現(xiàn)窗口的定制化,拖動,最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關閉的按鈕等。
通過 InkWell 組件,可以捕捉到手勢、鼠標、觸控筆的移動和停留位置
這個功能是鼠標移動后的UI交互界面。要在窗口上顯示一個提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結點不是 Material 風格的組件,因此會出現(xiàn)黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創(chuàng)建的 OverlayEntry 一個位置,否則它將全屏顯示。
讀取說表拖拽的文件一開始想嘗試使用 InkWell 組件,但是這個組件無法識別拖拽中的鼠標,并且也無法從中拿到文件信息。因此放棄。后來從文章《Flutter-2天寫個桌面端APP》中發(fā)現(xiàn)一個可讀取拖拽文件的組件 desktop_drop ,能滿足要求。
使用開源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。
Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫 buildTextSpan 方法。
在做導出功能時遇到下列報錯,保存提示為沒有權限訪問對應目錄下的文件。
通過Apple的開發(fā)文檔找到有關權限問題的說明。其中有個授權私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對用戶的下載文件夾的讀/寫訪問權限 。那么,使用Xcode打開Flutter項目中的mac應用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設置為YES,保存后重啟Flutter項目。發(fā)現(xiàn)已經(jīng)可以向下載目錄中讀寫文件了。
當然,這是正常操作。還有個騷操作就是關閉系統(tǒng)的沙盒機制。將 entitlements 文件的 App Sandbox 設置為NO。這樣我們就可以訪問任意路徑了。當然關閉應用的沙盒也就相當于關閉了應用的防護機制,因此這個選項慎用。
原文地址:
由于 Flutter 不支持運行時反射,JSON 解析完全是手動的。
所謂手動解析,是指使用 dart:convert 庫中內置的 JSON 解碼器,將 JSON 字符串解析成自定義對象的過程。使用這種方式,我們需要先將 JSON 字符串傳遞給 JSON.decode 方法解析成一個 Map,然后把這個 Map 傳給自定義的類,進行相關屬性的賦值。
下面動手解析一個用戶的信息
首先,我們根據(jù) JSON 結構定義 User類,并創(chuàng)建一個工廠類,來處理 User 類屬性成員與 JSON 字典對象的值之間的映射關系:
數(shù)據(jù)解析類創(chuàng)建好了,剩下的事情就相對簡單了,我們只需要把 JSON 文本通過 JSON.decode 方法轉換成 Map,然后把它交給 User 的工廠類 fromJson 方法,即可完成 User 對象的解析:
項目中往往會碰到 嵌套對象屬性 情況,
面對這種情況,我們需要為每一個非基本類型屬性創(chuàng)建一個解析類。
然后,我們只需要在 User 類中,增加 dog 屬性及對應的 JSON 映射規(guī)則即可:
通過這種方法,無論對象有多復雜的非基本類型屬性,我們都可以創(chuàng)建對應的解析類進行處理。
不過到現(xiàn)在為止,我們的 JSON 數(shù)據(jù)解析還是在主 Isolate 中完成。如果 JSON 的數(shù)據(jù)格式比較復雜,數(shù)據(jù)量又大,這種解析方式可能會造成短期 UI 無法響應。下面我們可以用 compute 函數(shù)優(yōu)化一下
通過 compute 的改造,我們就不用擔心 JSON 解析時間過長阻塞 UI 響應了。