此控件的package我已經(jīng)托管到了 pub倉庫
壺關(guān)網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
如果你被墻住了,也可以看 國內(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ā),所以習(xí)慣了iOS上的UITableView的調(diào)用風(fēng)格,所以在實現(xiàn)flutter的SectionTableView時,決定實現(xiàn)如下功能
為了實現(xiàn)這些功能,并且方便后期增加滾動功能,上下拉刷新功能,使用了StatefulWidget作為父類:
接著在對應(yīng)的_SectionTableViewState中的build方法中,返回ListView:
熟悉flutter ListView的同學(xué)知道,ListView的builder類方法,有一個itemBuilder回調(diào)函數(shù),參數(shù)是當(dāng)前的上下文,和將要渲染的行索引index,index對應(yīng)想要獲取的某一行控件(cell或者叫ListItem),返回非空的組件就證明這個index有值,返回null就表示列表到盡頭了。
我們需要做的就是對index進行映射,判斷當(dāng)前index對應(yīng)的控件,應(yīng)該是列表里的section header,還是分隔線devider,還是某一行的真正內(nèi)容cell。
出于性能的考慮,不可能每次調(diào)用 _buildCell的時候,都計算一遍index對應(yīng)的section和row的位置,所以定義了一個類成員變量indexPathSearch,是數(shù)組,數(shù)組長度就是ListView所有的行,當(dāng) _buildCell 的參數(shù)index大于等于indexPathSearch的長度的時候,就返回null,表示列表內(nèi)容到此為止了。
indexPathSearch里每一個元素,就是index對應(yīng)的section和row(稱為indexPath),index指向?qū)嶋H行(cell)的時候,section和row都是大于等于0的,當(dāng)section大于等于0,row==-1的時候,表示這里是一個section header,當(dāng)兩者都等于-1的時候,表示這里是一個分割線:
計算好了index到indexPath的映射,剩下的就好說了,在_buildCell中,提取indexPath并判斷indexPath的內(nèi)容,返回對應(yīng)的控件:
這是我的第一個flutter package,目前還很簡陋,flutter目前尚且如此,所以大家一起改善它,
下一步將優(yōu)化如下內(nèi)容:
如果大家喜歡,請多多star我的 項目GitHub
Flutter的數(shù)據(jù)存儲分為三類
Preference相當(dāng)于iOS的NSUserDefaults,其實也是按plist的方式存儲的
step1:添加依賴
step2:pub get
step3:導(dǎo)入頭文件
在path_provider中有三個獲取文件路徑的方法:
- getTemporaryDirectory()
://獲取應(yīng)用緩存目錄,等同iOS的NSTemporaryDirectory()和Android的getCacheDir() 方法。
- getApplicationDocumentsDirectory():
//獲取應(yīng)用文件目錄類似于iOS的NSDocumentDirectory和Android上的 AppData目錄。
step1:添加依賴
step2:pub get
step3:導(dǎo)入頭文件
選擇一個aar文件,我這里用DynamsoftBarcodeReader.aar。
把目錄flutter/examples/hello_services/android/導(dǎo)入到Android Studio中。
點擊File New New Module,選擇Import .JAR/.AAR Package,添加AAR文件。打開工程屬性,添加依賴模塊就可以了。
如果我們目前的項目是Android的,但是接下來我們希望部分頁面可以使用Flutter進行開發(fā),甚至我們希望在Native頁面中嵌入FlutterUI組件,那么我們該如何實現(xiàn)呢?
假設(shè)你現(xiàn)在Android項目的目錄的結(jié)構(gòu)是這樣的
這時候如果你想創(chuàng)建一個Flutter模塊,使得Android模塊和Flutter模塊之間可以進行交互,我們可以通過Android Studio新建一個Flutter Module,具體過程是:File — New — New Module ,之后選擇Flutter Module,指定Project Location的路徑為
也就是說,最終你的項目結(jié)構(gòu)會是這樣的
接下來在Android Module的 build.gradle 文件中添加flutter依賴
先創(chuàng)建一個Flutter頁面
這里比較重要的是 window.defaultRouteName 這個字段,這個字段可以接收從Native傳遞過來的參數(shù) (下文我們會介紹原生傳遞參數(shù)的方法),也就是說通過這個字段我們就可以進行Flutter頁面的路由的分發(fā)
我們可以直接在Android的 MainActivity 中啟動一個 FlutterActivity ,這里的 initialRoute 方法中傳遞的參數(shù)就對應(yīng)Flutter層的 window.defaultRouteName
注意:需要在 AndroidManifest.xml 注冊 FlutterActivity
自己創(chuàng)建一個 FlutterAppActivity 繼承自 FlutterActivity
在 MainActivity 中啟動 FlutterAppActivity (另外別忘了在 AndroidManifest.xml 中注冊 FlutterAppActivity )
兩種啟動方式的區(qū)別
如果單純只是想打開一個Flutter頁面,兩種方式實際上基本沒有太大區(qū)別,第一種方式也許還會更簡單一點。但是,在Flutter開發(fā)中,我們往往還需要開發(fā)一些Native插件供Flutter調(diào)用,如果使用復(fù)寫 FlutterActivity 的方式更有利于我們在 FlutterActivity 中注冊我們的Native插件,所以實際開發(fā)中一般推薦使用第二種方式
擴展思考
initialRoute 從名稱上看起來是Flutter提供給我們進行Native與Flutter交互的路由跳轉(zhuǎn)的,但是實際上他就是一個字符串,我們不僅僅可以傳遞一個路由名稱,有時候我們也可以通過這個參數(shù)傳遞一串JSON數(shù)據(jù),然后在Flutter端進行解析,這樣我們就可以通過這個參數(shù)做更多的事情
activity_main.xml
FrameLayout 用于承載Flutter組件
MainActivity.java
使用 FragmentManager 將 FlutterFragment 添加到 FrameLayout 容器中
運行結(jié)果
上半部分是原生的TextView,下半部分是Flutter的Text組件
本節(jié)主要介紹了Native和Flutter之間的頁面跳轉(zhuǎn),以及同一個頁面中Native與Flutter組件的組合。接下來會介紹如何編寫Android插件與Flutter進行數(shù)據(jù)交互