對于一些復雜或不規(guī)則的UI,我們可能無法使用現(xiàn)有的 Widget 組合去實現(xiàn),比如需要一個帶動畫的進度條,

我們提供的服務有:做網(wǎng)站、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、武都ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的武都網(wǎng)站制作公司
又或者是一個特殊形狀的多邊形等等,當然有時候我們可以直接用圖片去實現(xiàn),但是并沒有達到我們想要
的效果,反而會讓我們產(chǎn)生不良的體驗。
幾乎所有的UI系統(tǒng)都會提供一個自繪UI的接口,這個接口通常會提供一塊2D畫布Canvas,Canvas內(nèi)部封裝了
一些基本繪制的API,開發(fā)者可以通過Canvas繪制各種自定義圖形。在Flutter中,提供了一個CustomPaint Widget,
它可以結(jié)合一個畫筆CustomPainter來實現(xiàn)繪制自定義圖形。
我們看看 CustomPaint 構(gòu)造函數(shù):
1.painter: 背景畫筆,會顯示在子節(jié)點后面;
2.foregroundPainter: 前景畫筆,會顯示在子節(jié)點前面
3.size:當child為null時,代表默認繪制區(qū)域大小,如果有child則忽略此參數(shù),畫布尺寸則為child尺寸。如果有child但是想指定畫布為特定大小,可以使用SizeBox包裹CustomPaint實現(xiàn)。
4.isComplex:是否復雜的繪制,如果是,F(xiàn)lutter會應用一些緩存策略來減少重復渲染的開銷。
5.willChange:和isComplex配合使用,當啟用緩存時,該屬性代表在下一幀中繪制是否會改變。
可以看到,繪制時我們需要提供前景或者背景畫筆,兩者也可以同時提供,
我們的畫筆需要繼承 CustomPainter 類,我們在畫筆類中實現(xiàn)真正的繪制邏輯。
顧名思義畫布的意思,我們繪制布局當然是在一張畫布上進行繪制,畫布為我們繪制圖形提供了很多方法。(熟悉畫布的就無需再看了)
在繪制之前我們需要準備畫筆 Paint,就如畫畫一樣,你用什么筆就能畫什么樣的畫,在Paint中,
我們可以配置畫筆的各種屬性如粗細、顏色、樣式等。如:
好了,繼承CustomPainter類,然后準備好畫筆,就可以在畫布上盡情的揮灑了!
寫的挺簡單的,就是介紹了一下自定義view的準備工作以及畫布畫筆的功能,具體實戰(zhàn)請看下一篇博客。
封裝的彈窗必須要靈活,滿足實際開發(fā)中的大部分彈窗,比如有無標題、有無內(nèi)容、有無關(guān)閉按鈕、有無操作按鈕以及按鈕的排列樣式等需要滿足多元化~
共有四個文件: ww_dialog.dart 、 ww_middle_bottom_dialog_widget.dart 、 ww_top_dialog_widget.dart 、 ww_top_dialog_item_data.dart
彈窗主要調(diào)用類,主要包含: WWDialog.showTopDialog 、 WWDialog.showMiddleDialog 、 WWDialog.showBottomDialog
支持自定義配置背景顏色、字體大小、顏色、統(tǒng)一回調(diào)、自定義按鈕、單獨回調(diào)、是否帶三角標志、任意位置、最大高度、超過可以滑動等~
部分展示效果:
支持配置背景顏色、字體大小、顏色、字重、按鈕排列方式、標題、內(nèi)容、按鈕支持完全自定義、點擊的回調(diào)等~
部分展示效果:
支持配置背景顏色、字體大小、顏色、字重、按鈕排列方式、標題、內(nèi)容、按鈕支持完全自定義、點擊的回調(diào)等~
部分展示效果:
中間、底部彈窗的彈窗widget
頂部彈窗的彈窗widget
頂部彈窗的數(shù)據(jù)源數(shù)據(jù)模型item
github傳送門:
最近在寫一個flutter-ui庫,類似于antd一樣的ui庫,google了很久,都沒有發(fā)現(xiàn)一個類似antd這種國人喜歡用的ui庫,大部分都是國外的那種material ui,因為公司多個flutter項目都需要用,每次都是寫好幾遍,而且還很難維護所以才有了這個打算,第一個要寫的ui組件就是日歷組件,日歷的ui以及數(shù)據(jù),都已經(jīng)寫完了,目前正好需要給日歷寫控制器,所以才有了這篇文章
在無狀態(tài)組件當中,組件的ui由傳入它的參數(shù)決定的,組件本身的不需要管理狀態(tài)。而有狀態(tài)組件會有多種狀態(tài),而它的狀態(tài)是可以通過外部控制器來控制的。比如TextField,創(chuàng)建一個controller可以給TextField賦值初始值,也可以通過controller來獲取到變化之后的value值,而這個控制器就是controller。可以用來控制一個有狀態(tài)組件的行為以及狀態(tài)的一個類
為什么要用controller呢,起初我也沒想明白為什么要用,因為傳參數(shù)也可以解決類似的問題啊,就拿TextField來說,
但后來我發(fā)現(xiàn),很多組件內(nèi)部的行為是沒辦法通過傳參數(shù)來控制的,尤其是在特殊的組件生命周期中,沒辦法實現(xiàn),而通過controller,可以很好的解決這個問題,我自己感覺,controller的用處就是提供給外部操作當前組件的能力,包括組件的各種狀態(tài),以及組件的各種行為,這里舉個栗子????
綜上,個人理解controller的作用就是暴露組件內(nèi)部的行為,屬性給父元素,使父元素可以很方便使用子元素提供的參數(shù),而不需要去實現(xiàn)監(jiān)聽事件來獲取
回到正題,那么如何實現(xiàn)一個自己的controller呢,對我而言,不會就抄,抄誰的呢,當然是超官方的!讀官方的源碼,看它如何實現(xiàn),然后我們加以模仿,不就是自己的了。竊書不能算偷……竊書!……讀書人的事,能算偷么?
這里借鑒了ScrollController的源碼,首先分析下源碼,以下是ScrollerController的源碼,我把看不懂的英文注釋刪掉了...本菜????看不懂就刪
看了看好像也沒多少東西,注意當前類的定義
是繼承了ChangeNotifier類,看著這個類頓時覺得好眼熟有沒有,對了,不就是我們平時寫provider用的那個東東嘛,查閱了官方文檔,具體是這么解釋的
用我這渣渣英語翻譯大概的意思就是,一個類,它可以被繼承,它可以被混合并且它提供了使用VoidCallback進行通知的 notification Api
盲猜和provider用法差不多,都是觀察者模式模式,父組件可以訂閱該controller的更改,當該controller通知其他監(jiān)聽器的時候,監(jiān)聽器的回調(diào)函數(shù)將被執(zhí)行,上面ScrollController中的attach中正好也使用了notification方法來通知監(jiān)聽者,具體滾動執(zhí)行的過程沒有看到,但是大致了解了controller的工作原理
好了,知道原理了,開搞
首先得思考,這個controller會提供什么,按照我當前給日歷組件的設(shè)計,目前會給外部提供當前日歷所有的行為事件以及最終的值
目前我寫的controller很簡單,只需要給外部父容器提供上一個月,下一個月的方法可以使用就可以,所以我的控制器很簡單,只有兩個方法,并且方法執(zhí)行完成之后進行消息通知,通知到各個訂閱者,也就是這里的日期組件 在日期組件的 initState方法中,對controller進行監(jiān)聽,從而改變ui
最外層父容器是這樣的,當前demo用setState臨時刷新ui
看起來還不錯,還有一些ui上的交互需要后續(xù)去調(diào)整
未完待續(xù)...
最近入了flutter的坑,就想著做一行愛一行,也不能把自己的頭銜寫死了就只做前端,只寫頁面。flutter寫起來也蠻舒服的,加油,打工人!
網(wǎng)頁題目:flutter組件自定義,flutter 常用組件
分享路徑:http://chinadenli.net/article14/dsijhge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、定制網(wǎng)站、品牌網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、云服務器、網(wǎng)站導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)