此控件的package我已經(jīng)托管到了 pub倉庫

網(wǎng)站制作、建網(wǎng)站找專業(yè)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián):定制網(wǎng)站、模板網(wǎng)站、仿站、微信小程序定制開發(fā)、軟件開發(fā)、成都App定制開發(fā)等。做網(wǎng)站價格咨詢創(chuàng)新互聯(lián):服務(wù)完善、10多年建站、值得信賴!網(wǎng)站制作電話:028-86922220
如果你被墻住了,也可以看 國內(nèi)鏡像
使用方式就是在你的flutter pubspec.yaml中添加依賴:
然后flutter packages get更新依賴即可
最近寫demo時發(fā)現(xiàn)Flutter自帶的ListView widget很簡陋,沒有分隔線,沒有section/row之分,也沒有sectionHeader,如果要實現(xiàn)一個有分割線,有section區(qū)分,有section header的ListView,耦合會非常嚴重:
在 上沒有找到封裝好的這種TableView,于是乎決定自己寫一個,命名為SectionTableView
本人是iOS開發(fā),所以習慣了iOS上的UITableView的調(diào)用風格,所以在實現(xiàn)flutter的SectionTableView時,決定實現(xiàn)如下功能
為了實現(xiàn)這些功能,并且方便后期增加滾動功能,上下拉刷新功能,使用了StatefulWidget作為父類:
接著在對應(yīng)的_SectionTableViewState中的build方法中,返回ListView:
熟悉flutter ListView的同學知道,ListView的builder類方法,有一個itemBuilder回調(diào)函數(shù),參數(shù)是當前的上下文,和將要渲染的行索引index,index對應(yīng)想要獲取的某一行控件(cell或者叫ListItem),返回非空的組件就證明這個index有值,返回null就表示列表到盡頭了。
我們需要做的就是對index進行映射,判斷當前index對應(yīng)的控件,應(yīng)該是列表里的section header,還是分隔線devider,還是某一行的真正內(nèi)容cell。
出于性能的考慮,不可能每次調(diào)用 _buildCell的時候,都計算一遍index對應(yīng)的section和row的位置,所以定義了一個類成員變量indexPathSearch,是數(shù)組,數(shù)組長度就是ListView所有的行,當 _buildCell 的參數(shù)index大于等于indexPathSearch的長度的時候,就返回null,表示列表內(nèi)容到此為止了。
indexPathSearch里每一個元素,就是index對應(yīng)的section和row(稱為indexPath),index指向?qū)嶋H行(cell)的時候,section和row都是大于等于0的,當section大于等于0,row==-1的時候,表示這里是一個section header,當兩者都等于-1的時候,表示這里是一個分割線:
計算好了index到indexPath的映射,剩下的就好說了,在_buildCell中,提取indexPath并判斷indexPath的內(nèi)容,返回對應(yīng)的控件:
這是我的第一個flutter package,目前還很簡陋,flutter目前尚且如此,所以大家一起改善它,
下一步將優(yōu)化如下內(nèi)容:
如果大家喜歡,請多多star我的 項目GitHub
轉(zhuǎn)自
在 Flutter 中,有兩類常用的 Widget:
在開發(fā)過程中,我們經(jīng)常需要繼承它們兩來實現(xiàn)自己的 Widget。
一個 StatelessWidget 是不能被改變的,比如: Icon 、 Text 等。
如果你的控件一旦顯示,就不需要再做任何的變更,那么你應(yīng)該使用 StatelessWidget 。
實現(xiàn)一個自己的 StatelessWidget 很簡單。
當你看到下面這個例子?時,你就知道它有多簡單了。
看,只要在 build() 中返回你的視圖就可以了。
一個 StatefulWidget 是有狀態(tài)的,可變的。
它可以改變自己的外觀,以響應(yīng)用戶的操作或者數(shù)據(jù)的變化。
比如: CheckBox 、 Switch ..
我們之所以能夠改變一個 StatefulWidget ,是因為它有一個設(shè)置狀態(tài)的函數(shù):
調(diào)用這個函數(shù)后,就會觸發(fā) StatefulWidget 的視圖樹重建。
因此,當我們需要一個可交互的,即能根據(jù)用戶操作或數(shù)據(jù)變化而改變視圖的 Widget 時,那就得用上 StatelessWidget 了。
現(xiàn)在,來創(chuàng)建一個自定義的 StatefulWidget:
從上面的例子中可以看到, StatefulWidget 會要求提供一個含有視圖樹的 State 。
既然 State 能夠控制一個視圖的狀態(tài),那它肯定會有一系列的生命周期。
上圖就是 State 的生命周期圖。
Flutter中Widget,State和BuildContext的概念是每個Flutter開發(fā)人員需要完全理解的最重要概念之一。這里先講解一下Widget以及Widget。三者之間的關(guān)系會在最后一篇總結(jié)一下。
Widget類在Flutter中是非常重要的,繼承自Widget類的有PreferredSizeWidget、ProxyWidget、RenderObjectWidget、StatefulWidget、StatelessWidget。我們?nèi)粘J褂玫慕^大部分widget都是繼承自Widget類,查看Widget類源碼,內(nèi)部實現(xiàn)非常簡單,構(gòu)造函數(shù)如下:
在flutter中構(gòu)建APP是由widget樹構(gòu)建起來的,所以這個key的作用是用來控制在widget樹中替換widget的時候使用的。其中Key類是Widget、Element以及SemanticsNode的唯一標識符,繼承自Key的還有LocalKey以及GlobalKey。詳細可以去framework.dart文件查看相關(guān)源碼及說明。
在Flutter中,我們平時自定義的widget,一般都是繼承自StatefulWidget或StatelessWidget(并不是只有這兩種),這兩種widget也是目前最常用的兩種。如果一個控件自身狀態(tài)不會去改變,創(chuàng)建了就直接顯示,不會有色值、大小或者其他屬性的變化,這種widget一般都是繼承自StatelessWidget,常見的有Container、ScrollView等。如果一個控件需要動態(tài)的去改變或者相應(yīng)一些狀態(tài),例如點擊態(tài)、色值、內(nèi)容區(qū)域等,那么一般都是繼承自StatefulWidget,常見的有CheckBox、AppBar、TabBar等。兩者的差別在于是否有狀態(tài)。
對于StatelessWidget,build方法會在如下三種情況下調(diào)用:
我們在創(chuàng)建State的時候可以看到和StatefulWidget相似的build方法,也就是說我們也可以獲得一個BuildContext,在使用StatefulWidget.createState創(chuàng)建它們之前以及在調(diào)用initState之前,框架將State對象與BuildContext關(guān)聯(lián)起來,該關(guān)聯(lián)是永久的:State對象永遠不會改變它的BuildContext(但是BuildContext本身可以在控件樹中移動)。后面講解一下這個BuildContext對象在整個程序中什么角色
State的作用有兩點:
State的生命周期有四種狀態(tài):
完整生命周期如下:
當控件的配置被更改時會調(diào)用State.didUpdateWidget方法,此時框架會重新繪制控件。你也可以使用State.setState方法在狀態(tài)發(fā)生變化時通知框架,告訴框架該對象的內(nèi)部狀態(tài)已經(jīng)改變,框架接到通知后也會重新繪制控件。
State中比較重要的一個方法是setState,當修改狀態(tài)時,widget會被更新。比方說點擊CheckBox,會出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過修改狀態(tài)來達到的。查看setState源碼,在一些異常的情況下將會拋出異常:
markNeedsBuild內(nèi)部,則是通過標記element為diry,在下一幀的時候重建(rebuild)。可以看出setState并不是立即生效,它只是將widget進行了標記,真正的rebuild操作,則是等到下一幀的時候才會去進行。
StatefulWidget的兩個主要類別:
在我的小部件的生命周期中,我是否需要考慮一個將要更改的變量,何時更改,將強制重建小部件?
如果問題的答案是肯定的,那么您需要一個有狀態(tài)的小部件,否則,您需要一個無狀態(tài)小部件。
比如:
Flutter有生成構(gòu)造函數(shù)、默認構(gòu)造函數(shù)、命名構(gòu)造函數(shù)、重定向構(gòu)造函數(shù)、常量構(gòu)造函數(shù)、工廠構(gòu)造函數(shù)
生成構(gòu)造函數(shù)是最常見的構(gòu)造函數(shù),即生成實體類對象。
如果未聲明構(gòu)造函數(shù),則會提供默認構(gòu)造函數(shù)。 默認構(gòu)造函數(shù)沒有參數(shù),并調(diào)用父類無參數(shù)構(gòu)造函數(shù)。
默認情況下,子類中的構(gòu)造函數(shù)調(diào)用父類的未命名無參數(shù)構(gòu)造函數(shù)。 父類的構(gòu)造函數(shù)在子類構(gòu)造函數(shù)體的開頭被調(diào)用。 如果還使用初始化了列表,則會在調(diào)用父類構(gòu)造函數(shù)之前執(zhí)行。 執(zhí)行順序如下:
如果父類沒有未命名的無參數(shù)構(gòu)造函數(shù),則必須手動調(diào)用父類中的一個構(gòu)造函數(shù)。 在子類的構(gòu)造函數(shù)體之后用冒號(:)指定父類構(gòu)造函數(shù)
當需要定義一個有特別含義的構(gòu)造函數(shù)的時候,可以通過命名構(gòu)造 形式:構(gòu)造函數(shù).XXX來命名構(gòu)造函數(shù)
有時構(gòu)造函數(shù)需要重定向到同一個類中的另一個構(gòu)造函數(shù),在冒號后面用this:
如果你的類需要成為永遠不會更改的對象,則可以使這些對象成為編譯時常量。 定義const構(gòu)造函數(shù)要確保所有實例變量都是final。
不用直接創(chuàng)建對象(可以通過調(diào)用其他構(gòu)造函數(shù)創(chuàng)建)
Dart的 IO 庫包含了文件讀寫的相關(guān)類,它屬于 Dart 語法標準的一部分,所以通過 Dart IO 庫,無論是 Dart VM 下的腳本還是 Flutter,都是通過 Dart IO 庫來操作文件的,不過和 Dart VM 相比,F(xiàn)lutter 有一個重要差異是文件系統(tǒng)路徑不同,這是因為Dart VM 是運行在 PC 或服務(wù)器操作系統(tǒng)下,而 Flutter 是運行在移動操作系統(tǒng)中,他們的文件系統(tǒng)會有一些差異。
Android 和 iOS 的應(yīng)用存儲目錄不同, PathProvider 插件提供了一種平臺透明的方式來訪問設(shè)備文件系統(tǒng)上的常用位置。該類當前支持訪問兩個文件系統(tǒng)位置:
File代表一個整體的文件,他有三個構(gòu)造函數(shù),分別是:
文件讀取本身有兩種形式,一種是文本,一種是二進制。
2.2.1 讀取文本內(nèi)容
如果是文本文件,F(xiàn)ile提供了readAsString、readAsLines、readAsStringSync、readAsLinesSync方法,讀取文本內(nèi)容
readAsString 一次性讀取所有文本
readAsLines 一行行的讀取文本
結(jié)果返回的是一個List,list中表示文件每行的內(nèi)容
readAsStringSync、readAsLinesSync同步讀取文本
2.2.2 讀取二進制內(nèi)容
如果文件是二進制,那么可以使用readAsBytes或者同步的方法readAsBytesSync:
dart中表示二進制有一個專門的類型叫做Uint8List,他實際上表示的是一個int的List。
上面提到的讀取方式,都是一次性讀取整個文件,缺點就是如果文件太大的話,可能造成內(nèi)存空間的壓力。
所以File為我們提供了另外一種讀取文件的方法,流的形式來讀取文件.
示例
dart提供了open和openSync兩個方法來進行隨機文件讀寫:
寫入和文件讀取一樣,可以一次性寫入或者獲得一個寫入句柄,然后再寫入。
一次性寫入的方法有四種,分別對應(yīng)字符串和二進制
句柄形式可以調(diào)用openWrite方法,返回一個IOSink對象,然后通過這個對象進行寫入:
默認情況下寫入是會覆蓋整個文件的,但是可以通過下面的方式來更改寫入模式:
雖然dart中所有的異常都是運行時異常,但是和java一樣,要想手動處理文件讀寫中的異常,則可以使用try,catch:
我們還是以計數(shù)器為例,實現(xiàn)在應(yīng)用退出重啟后可以恢復點擊次數(shù)。 這里,我們使用文件來保存數(shù)據(jù):
1.引入PathProvider插件;在pubspec.yaml文件中添加如下聲明:
執(zhí)行 flutter pub get
2.實現(xiàn)如下
參考:
由于 Flutter 不支持運行時反射,JSON 解析完全是手動的。
所謂手動解析,是指使用 dart:convert 庫中內(nèi)置的 JSON 解碼器,將 JSON 字符串解析成自定義對象的過程。使用這種方式,我們需要先將 JSON 字符串傳遞給 JSON.decode 方法解析成一個 Map,然后把這個 Map 傳給自定義的類,進行相關(guān)屬性的賦值。
下面動手解析一個用戶的信息
首先,我們根據(jù) JSON 結(jié)構(gòu)定義 User類,并創(chuàng)建一個工廠類,來處理 User 類屬性成員與 JSON 字典對象的值之間的映射關(guān)系:
數(shù)據(jù)解析類創(chuàng)建好了,剩下的事情就相對簡單了,我們只需要把 JSON 文本通過 JSON.decode 方法轉(zhuǎn)換成 Map,然后把它交給 User 的工廠類 fromJson 方法,即可完成 User 對象的解析:
項目中往往會碰到 嵌套對象屬性 情況,
面對這種情況,我們需要為每一個非基本類型屬性創(chuàng)建一個解析類。
然后,我們只需要在 User 類中,增加 dog 屬性及對應(yīng)的 JSON 映射規(guī)則即可:
通過這種方法,無論對象有多復雜的非基本類型屬性,我們都可以創(chuàng)建對應(yīng)的解析類進行處理。
不過到現(xiàn)在為止,我們的 JSON 數(shù)據(jù)解析還是在主 Isolate 中完成。如果 JSON 的數(shù)據(jù)格式比較復雜,數(shù)據(jù)量又大,這種解析方式可能會造成短期 UI 無法響應(yīng)。下面我們可以用 compute 函數(shù)優(yōu)化一下
通過 compute 的改造,我們就不用擔心 JSON 解析時間過長阻塞 UI 響應(yīng)了。
本文題目:查看flutter類函數(shù),flutter 類方法
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article5/dseocoi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、定制開發(fā)、ChatGPT、定制網(wǎng)站、網(wǎng)站排名、搜索引擎優(yōu)化
聲明:本網(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)