在編寫幾個 Flutter 項目后,發現 Flutter 的強大之處在于業務中所有用到的控件以及場景都有對應的處理方案;而 Dart 語言也與 Java 、 Kotlin 類似,所以對 Android 開發者來說門檻非常低;特意記錄一下常用的控件及其使用:
創新互聯于2013年成立,是專業互聯網技術服務公司,擁有項目成都網站建設、成都做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元遂寧做網站,已為上家服務,為遂寧各地企業和個人服務,聯系電話:18982081108
StatelessWidget 不需要額外的創建 State
StatefulWidget 創建 State 類,并可以在其中保存一些狀態
only 可以單獨設置每個方向的內邊距
類似于 LinearLayout 中的 orientation 設置為 vertical , mainAxisAlignment 表示豎向的一個對齊方式, crossAxisAlignment 表示橫向的對齊方式
與 Column 相反,主軸是橫向,對齊方式類似, crossAxisAlignment 表示豎向的對齊方式
類似 SizedBox ,一個容器,但是主要功能是有一個 decoration —— 裝飾器,作用是繪制背景,或者使用 item 中的陰影
棧,先入后出,類似于 Android 上的 FrameLayout
通常配合 Stack 使用,固定顯示在某一個位置
配合多 child 使用,會填充剩余的空間
Image 功能強大,使用不同的方法可以加載不同來源的圖片
看到這些方法,突然覺得 Flutter 太香了,而且 Image 可以配置 clip 等裁剪出不同形狀的圖片,無論是圓形還是五角星都不在話下,然而 Android 要實現不規則的形狀,可是要下不少功夫的。
名字和 Android 的一模一樣,但是用法卻比 Android 的簡單很多:
主要就是 itemCount 與 itemBuilder ,其余就是配置樣式, itemBuilder 需要返回一個 widget ,當然了,每個 ListView 都有其對應的 item ,在里面的方法中編寫 widget 即可
與 ListView 類似,但是需要有一個 delegate 類,作用是設置有多少列,每一列之間的間距是多少
GridView 沒有 build , children 表示所有的子 view
最常用的控件之一,有非常多的樣式, Flutter 中通常是使用裝飾器來處理控件的,如背景使用 BoxDecoration , TextFiled 使用 InputDecoration ; 使用如下
Flutter支持穩定的桌面設備開發已經一段時間了,不得不說,Flutter多平臺支持的特性真的很香。我本人并沒有任何桌面開發的經驗,但仍然使用Flutter開發出了一個桌面版小程序,功能很簡單,就是對輸入的json做格式化處理和轉模型。
話不多說,先來看看實際效果。 項目源碼地址
開發環境如下:
Flutter : 2.8.1
Dart : 2.15.1
IDE : VSCode
JSON作為我們日常開發工作中經常要打交道的一種數據格式,它共有6種數據類型: null , num , string , object , array , bool 。我們勢必對它又愛又恨。愛他因為他作為數據處理的一種格式確實非常方便簡潔。但是在我們做Flutter開發中,又需要接觸到json解析時,就會感覺非常棘手,因為flutter沒有反射,導致json轉模型這塊需要手寫那繁雜的映射關系。就像下面這樣子。
數據量少還能接受,一旦量大,那么光手寫這個解析方法都能讓你懷疑人生。更何況手寫還有出錯的可能。好在官方有個工具**json_serializable**可以自動生成這塊轉換代碼,也解決了flutter界json轉模型的空缺。當然,業界也有專門解析json的網站,可以自動生成dart代碼,使用者在生成后復制進項目中即可,也是非常方便的。
本項目以json解析為切入點,和大家一起來看下flutter是如何開發桌面應用的。
要讓我們的flutter項目支持桌面設備。我們首先需要修改下flutter的設置。如下,讓我們的項目支持 windows 和 macos 系統。
接下來使用 flutter create 命令創建我們的模版工程。
創建完項目后,我們就可以 run 起來了。
先來看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。
我們在新建一個桌面應用時,默認的模版又一個Appbar,此時應用可以用鼠標拖拽移動,放大縮小,還可以縮到很小。但是,我們一旦去掉這個導航欄,那么窗口就不能用鼠標拖動了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會導致頁面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過 bitsdojo_window ,我們可以實現窗口的定制化,拖動,最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關閉的按鈕等。
通過 InkWell 組件,可以捕捉到手勢、鼠標、觸控筆的移動和停留位置
這個功能是鼠標移動后的UI交互界面。要在窗口上顯示一個提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結點不是 Material 風格的組件,因此會出現黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創建的 OverlayEntry 一個位置,否則它將全屏顯示。
讀取說表拖拽的文件一開始想嘗試使用 InkWell 組件,但是這個組件無法識別拖拽中的鼠標,并且也無法從中拿到文件信息。因此放棄。后來從文章《Flutter-2天寫個桌面端APP》中發現一個可讀取拖拽文件的組件 desktop_drop ,能滿足要求。
使用開源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。
Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫 buildTextSpan 方法。
在做導出功能時遇到下列報錯,保存提示為沒有權限訪問對應目錄下的文件。
通過Apple的開發文檔找到有關權限問題的說明。其中有個授權私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對用戶的下載文件夾的讀/寫訪問權限 。那么,使用Xcode打開Flutter項目中的mac應用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設置為YES,保存后重啟Flutter項目。發現已經可以向下載目錄中讀寫文件了。
當然,這是正常操作。還有個騷操作就是關閉系統的沙盒機制。將 entitlements 文件的 App Sandbox 設置為NO。這樣我們就可以訪問任意路徑了。當然關閉應用的沙盒也就相當于關閉了應用的防護機制,因此這個選項慎用。
原文地址:
源碼分析:
分析源碼可得,TextField 是有狀態 StatefulWidget,有豐富的屬性,自定義化較高,實踐中需要合理利用各種回調;
1、光標的相關屬性;cursorColor 為光標顏色,cursorWidth 為光標寬度,cursorRadius 為光標圓角;其中 Radius 提供了 circle 圓角和 elliptical 非圓角兩種;
2、textAlign 為文字起始位置,可根據業務光標居左/居右/居中等;注意只是文字開始方向;textDirection 問文字內容方向,從左向右或從右向左;
3、maxLength 為字符長度,設置時默認是展示一行,且右下角有編輯長度與整體長度對比;與 maxLengthEnforced 配合,maxLengthEnforced 為 true 時達到最大字符長度后不可編輯;為 false 時可繼續編輯展示有差別;
4、設置 maxLength 之后右下角默認有字符計數器,設置 TextField.noMaxLength 即可只展示輸入字符數;
5、maxLines 為允許展現的最大行數,在使用 maxLength 時內容超過一行不會自動換行,因為默認 maxLines=1,此時設置為 null 或固定展示行數即可自動換行;區別在于 null 會展示多行,而 maxLines 最多只展示到設置行數;
6、obscureText 是否隱藏編輯內容,常見的密碼格式;
7、enableInteractiveSelection 長按是否出現【剪切/復制/粘貼】菜單;不可為空;
8、keyboardAppearance 為鍵盤亮度,包括 Brightness.dark/light 兩種,但僅限于 iOS 設備;
9、textCapitalization 文字大小寫;理論上 sentences 為每句話第一個字母大寫;characters為每個字母大寫;words 為每個單詞首字母大寫;但該屬性僅限于 text keybord,和尚在本地更換多種方式并未實現,有待研究;
10、keyboardType 為鍵盤類型,和尚理解整體分為數字鍵盤和字母鍵盤等;根據設置的鍵盤類型,鍵盤會有差別;
a. 數字鍵盤
--1-- datetime 鍵盤上可隨時訪問 : 和 /;
--2-- phone 鍵盤上可隨時訪問 # 和 *;
--3-- number 鍵盤上可隨時訪問 + - * /
b. 字母鍵盤
--1-- emailAddress 鍵盤上可隨時訪問 @ 和 .;
--2-- url 鍵盤上可隨時訪問 / 和 .;
--3-- multiline 適用于多行文本換行;
--4-- text 默認字母鍵盤;
11、textInputAction 通常為鍵盤右下角操作類型,類型眾多,建議多多嘗試;
12、autofocus 是否自動獲取焦點,進入頁面優先獲取焦點,并彈出鍵盤,若頁面中有多個 TextField 設置 autofocus 為 true 則優先獲取第一個焦點;
13、focusNode 手動獲取焦點,可配合鍵盤輸入等減少用戶操作次數,直接獲取下一個 TextField 焦點;
14、enabled 設為 false 之后 TextField 為不可編輯狀態;
15、decoration 為邊框修飾,可以借此來調整 TextField 展示效果;可以設置前置圖標,后置圖片,邊框屬性,內容屬性等,會在后續集中嘗試;若要完全刪除裝飾,將 decoration 設置為空即可;
16、inputFormatters 為格式驗證,例如原生 Android 中通常會限制輸入手機號或其他特殊字符,在 Flutter 中也可以借此來進行格式限制,包括正則表達式;使用時需要引入 package:flutter/services.dart;
a. LengthLimitingTextInputFormatter 限制最長字符;
b. WhitelistingTextInputFormatter 僅允許輸入白名單中字符;如 digitsOnly 僅支持數字 [0-9];
c. BlacklistingTextInputFormatter 防止輸入黑名單中字符;如 singleLineFormatter 強制輸入單行;
分析源碼 RegExp("[/]") 可以設置正則表達式;
17、onChanged 文本內容變更時回調,可實時監聽 TextField 輸入內容;
18、controller 文本控制器,監聽輸入內容回調;
19、onTap 點擊 TextField時回調;
20、onEditingComplete 在提交內容時回調,通常是點擊回車按鍵時回調;
21、onSubmit 在提交時回調,不可與 onEditingComplete 同時使用,區別在于 onSubmit 是帶返回值的回調;
問題小結:
當 TextField 設置 enableInteractiveSelection 屬性后長按會出現菜單,默認為英文,可通過設置 Flutter 國際化來處理;
(1)在 pubspec.yaml 中集成 flutter_localizations;
2)在 MaterialApp 中設置本地化代理和支持的語言類型;
(1)將 maxLength 設置為 null 僅使用 LengthLimitingTextInputFormatter 限制最長字符;
(2)設置 InputDecoration 中 decoration 屬性為空;但是底部有空余,只是隱藏而并非消失;
一年半前玩過flutter,忘光光...現在是時候重新拾取了。~
啟動頁一般只放圖片或者加幾行文字。
1、創建好flutter項目之后,在lib文件下面新建launch.dart或xx.dart.
2、在根目錄下新建images文件夾,如已有直接放入圖片
3、flutter_yijiake.iml中加入注入該圖片,并注意空格
4、在根目錄下的test/widget_test.dart中更改默認的啟動頁為當前的啟動頁路徑
5、最后重新設置啟動時的頁面
6、非常簡單的啟動頁面放logo圖片
值得一說的是,flutter框架的UI組件需要已new 組件的形式展開。
此控件比較簡單,按鈕的功能可劃分為UI樣式與事件回調
這里將幾種不同的按鈕一起運行,做下對比動圖如下:
這里對五種按鈕進行column居中排列如下
Text用于顯示簡單樣式文本,它包含一些控制文本顯示樣式的一些屬性。
TextStyle用于指定文本顯示的樣式如顏色、字體、粗細、背景等。
TextStyle更多屬性設置如下:
如果我們需要對一個Text內容的不同部分按照不同的樣式顯示,即富文本,這時就可以使用TextSpan,它代表文本的一個“片段”。
如上述,我們當然也可以在上述鏈接上添加手勢事件,后續會提到。
在widget樹中,文本的樣式默認是可以被繼承的,因此,如果在widget樹的某一個節點處設置一個默認的文本樣式,那么該節點的子樹中所有文本都會默認使用這個樣式,而DefaultTextStyle正是用于設置默認文本樣式的。
舉例如下:
新聞名稱:flutter光標設置,flutter 圖標
網頁鏈接:http://m.kartarina.com/article28/dsesjcp.html
成都網站建設公司_創新互聯,為您提供外貿建站、軟件開發、品牌網站設計、域名注冊、網站改版、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯