最近在寫一個flutter-ui庫,類似于antd一樣的ui庫,google了很久,都沒有發(fā)現(xiàn)一個類似antd這種國人喜歡用的ui庫,大部分都是國外的那種material ui,因為公司多個flutter項目都需要用,每次都是寫好幾遍,而且還很難維護所以才有了這個打算,第一個要寫的ui組件就是日歷組件,日歷的ui以及數(shù)據(jù),都已經(jīng)寫完了,目前正好需要給日歷寫控制器,所以才有了這篇文章

專業(yè)領(lǐng)域包括做網(wǎng)站、網(wǎng)站制作、商城網(wǎng)站制作、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
在無狀態(tài)組件當(dāng)中,組件的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的用處就是提供給外部操作當(dāng)前組件的能力,包括組件的各種狀態(tài),以及組件的各種行為,這里舉個栗子????
綜上,個人理解controller的作用就是暴露組件內(nèi)部的行為,屬性給父元素,使父元素可以很方便使用子元素提供的參數(shù),而不需要去實現(xiàn)監(jiān)聽事件來獲取
回到正題,那么如何實現(xiàn)一個自己的controller呢,對我而言,不會就抄,抄誰的呢,當(dāng)然是超官方的!讀官方的源碼,看它如何實現(xiàn),然后我們加以模仿,不就是自己的了。竊書不能算偷……竊書!……讀書人的事,能算偷么?
這里借鑒了ScrollController的源碼,首先分析下源碼,以下是ScrollerController的源碼,我把看不懂的英文注釋刪掉了...本菜????看不懂就刪
看了看好像也沒多少東西,注意當(dāng)前類的定義
是繼承了ChangeNotifier類,看著這個類頓時覺得好眼熟有沒有,對了,不就是我們平時寫provider用的那個東東嘛,查閱了官方文檔,具體是這么解釋的
用我這渣渣英語翻譯大概的意思就是,一個類,它可以被繼承,它可以被混合并且它提供了使用VoidCallback進行通知的 notification Api
盲猜和provider用法差不多,都是觀察者模式模式,父組件可以訂閱該controller的更改,當(dāng)該controller通知其他監(jiān)聽器的時候,監(jiān)聽器的回調(diào)函數(shù)將被執(zhí)行,上面ScrollController中的attach中正好也使用了notification方法來通知監(jiān)聽者,具體滾動執(zhí)行的過程沒有看到,但是大致了解了controller的工作原理
好了,知道原理了,開搞
首先得思考,這個controller會提供什么,按照我當(dāng)前給日歷組件的設(shè)計,目前會給外部提供當(dāng)前日歷所有的行為事件以及最終的值
目前我寫的controller很簡單,只需要給外部父容器提供上一個月,下一個月的方法可以使用就可以,所以我的控制器很簡單,只有兩個方法,并且方法執(zhí)行完成之后進行消息通知,通知到各個訂閱者,也就是這里的日期組件 在日期組件的 initState方法中,對controller進行監(jiān)聽,從而改變ui
最外層父容器是這樣的,當(dāng)前demo用setState臨時刷新ui
看起來還不錯,還有一些ui上的交互需要后續(xù)去調(diào)整
未完待續(xù)...
最近入了flutter的坑,就想著做一行愛一行,也不能把自己的頭銜寫死了就只做前端,只寫頁面。flutter寫起來也蠻舒服的,加油,打工人!
首先,需要引用多語言庫
按如上文檔部署多語言后,就可以直接使用了
在日常開發(fā)中,總是需要將字符串轉(zhuǎn)化成指定格式的日期,可以使用DateFormat。
可以顯示多語言
更多格式輸出
使用 DateTime 的 timeZoneName 直接獲取時區(qū)
得到的結(jié)果是當(dāng)前的時區(qū)的簡寫,結(jié)果太寬泛不是我們想要的結(jié)果
其使用簡潔,只需要使用下面的方法就可以獲取到當(dāng)前時區(qū)
打印的結(jié)果:
flutter_native_timezone 有個缺點是,這個時區(qū)的結(jié)果只有英文結(jié)果,如果是要中文結(jié)果的小伙伴,需要自己手動轉(zhuǎn)換為中文了。
我想你想要的是:target.difference(DateTime.now()).toString().split('.')[0])
使用.split('.')[0]持續(xù)時間來去掉秒的分?jǐn)?shù)。
其中target是DateTime對象。flutter計算給定小時的剩余時間,以秒為單位更新flutter,因此,時間以h:m:s為單位,例如,如果給定的時間是(6:27pm),我希望得到此結(jié)果(剩余時間02:21:02)。
打印結(jié)果:Text('Timeuntil${DateFormat.Hms().format(target)}');Text(target.difference(DateTime.now()).toString().split('.')[0])
通過使用插件 package_info 可以獲取到當(dāng)前APP的包名,版本名,版本號等信息。
修改+號后的構(gòu)建號,+號前的版本號。
在android和ios原生(ios必須打包)中能發(fā)現(xiàn)version變化
要使用這個插件,首先在工程的pubspec.yaml文件中加入對這個插件的依賴:
網(wǎng)頁標(biāo)題:flutter獲取日期,flutter 日期選擇
標(biāo)題網(wǎng)址:http://chinadenli.net/article35/dsegjpi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、服務(wù)器托管、微信公眾號、全網(wǎng)營銷推廣、網(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)