國外地址:
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供永興企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都網(wǎng)站設計、H5頁面制作、小程序制作等業(yè)務。10年已為永興眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。
國內(nèi)鏡像:
以 flutter_screenutil 為例
路由框架 annotation_route
狀態(tài)管理 provider
UI適配 flutter_screenutil
刷新控件 flutter_easyrefresh
網(wǎng)絡請求 dio
toast控件 fluttertoast
圖表庫 charts_flutter
網(wǎng)絡監(jiān)聽 connectivity
事件總線 event_bus
日歷組件 table_calendar
官方webview webview_flutter
第三方webview flutter_webview_plugin
該篇文章為常用依賴包總結,用來記錄所需要的常用依賴包,后續(xù)會不斷擴充內(nèi)容~
一年半前玩過flutter,忘光光...現(xiàn)在是時候重新拾取了。~
啟動頁一般只放圖片或者加幾行文字。
1、創(chuàng)建好flutter項目之后,在lib文件下面新建launch.dart或xx.dart.
2、在根目錄下新建images文件夾,如已有直接放入圖片
3、flutter_yijiake.iml中加入注入該圖片,并注意空格
4、在根目錄下的test/widget_test.dart中更改默認的啟動頁為當前的啟動頁路徑
5、最后重新設置啟動時的頁面
6、非常簡單的啟動頁面放logo圖片
值得一說的是,flutter框架的UI組件需要已new 組件的形式展開。
新建一個Flutter工程,android模塊。
1,只有一個Activity組件,它是Dart層繪制Widget的容器。
2,Application配置FlutterApplication。
應用Application配置io.flutter.app.FlutterApplication類,App首次啟動時,初始化。
調(diào)用FlutterMain.startInitialization()方法。
initConfig方法,從AndroidManfest.xml配置的applicaion節(jié)點獲取meta-data數(shù)據(jù),初始化以下默認值。
這些值都是使用中用到的name,例如,抽取apk中asset資源時,flutter_assets打包目錄,打包產(chǎn)物data名稱。
initResources方法, 初始化資源。
在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項,將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。
/data/user/0/包名/app_flutter目錄。
在目錄中創(chuàng)建一個時間戳文件,根據(jù)apk版本和包信息記錄的lastUpdateTime更新時間,第二次啟動時,若apk未更新,不需要再次抽取。
加載so庫,libflutter.so,System.loadLibrary()。
主頁面繼承FlutterActivity,配置啟動模式singleTop。
FlutterActivity類在io.flutter.app包, (區(qū)別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類。
組件啟動,onCreate方法。
FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創(chuàng)建FlutterView視圖(io.flutter.view),繼承SurfaceView類,setContentView方法,設置組件主布局即FlutterView視圖。
最后,根據(jù)Bundle路徑,runBundle()加載運行,
調(diào)用FlutterView的runFromBundle方法,入口點在dart的main方法,
通過FlutterNativeView,調(diào)用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道遠
講道理我起的好長的名字啊,不過文如上題,搜索到這里的兄弟應該都知道我說的是啥情況,正好
~~
我這個方案可能有點笨拙TT,不過自測有效,有其它想法的老哥希望可以幫忙指點一下~
下面進入正題
點進源碼里面看,可以發(fā)現(xiàn)他直接繼承了StatelessWidget,那我們就直接看看build方法
可以看到,這里直接返回一個scrollable或者一個子節(jié)點是scrollable的InheritedWidget
scrollable是一個StatefulWidget,那我們就看看它的state
首先scrollable持有一個scrollposition對象,是通過其scrollcontroller構建的
在其state的setCanDrag方法中,對其拖動設置了一系列的監(jiān)聽
這里就可以看出來,當拖動觸發(fā)時,就會通過當前scrollable的position生成一個Drag/Hold對象,并調(diào)用相應的方法 這個position有幾個子類,我們先隨便看一個實現(xiàn)
可以看到生成了一個ScrollDragController對象,當手勢拖動而調(diào)用這個對象的update方法時
可以看到直接調(diào)用其委托對象的applyUserOffset方法進行偏移,而這個委托對象根據(jù)剛才的drag方法可以得知正是我們scrollable中的position
最后,由position通知其scrollcontext,也就是之前的scrollable進行滑動
具體的滑動流程這里就不細說了,我們只是要知道這個事件是怎么傳遞的就好了,有興趣的老哥可以自行分析
NestedScrollView是一個statefulwidget,那我們就先看看它的build方法
先忽略其他奇奇怪怪的方法,我們發(fā)現(xiàn)在我們body的外面,包裹了一層PrimaryScrollController,同時它還持有innerController,這個innerController暫時先不管它是啥
還記不記得在最開始ScrollView的build方法中,生成Scrollable的時候,我們已經(jīng)見過這個PrimaryScrollController了,再回顧一下
再看看PrimaryScrollController.of(context)
可以看到,在生成scrollable的時候,在primary = true的情況下是會向上查找的,看看有沒有PrimaryScrollController,如果有的話,scrollable使用的controller實際就是nestedscrollview中的innerController了
而之前看過了,scrollable中的position就是scrollcontroller來生成的,那么在這種情況下:
實際上是生成了_NestedScrollPosition并返回給了body中的scrollable
構造方法中有一個參數(shù)coordinator 暫時先不管
好了,下面我們在回頭看剛才NestedScrollView的build方法,實際上是生成了一個_NestedScrollViewCustomScrollView,繼承自大名鼎鼎的CustomScrollView,它當然也是scrollview啦,而我們傳給它的controller也是一個_NestedScrollController,不過叫做_outerController,和body中的不是同一個罷了,那么自然這個父scrollview的position也是_NestedScrollPosition。
下面我們按照之前的邏輯,當拖動開始時,就會調(diào)用position.drag方法
可以看到,實際上吧方法交給了我們之前多次見到的coordinator來完成,那我們就簡單看一下吧
這里可以看到,他把返回的ScrollDragController的委托者設成了自己
那么自然在拖動的時候,調(diào)用的就是coordinator的applyUseroffset方法了 我們分析一下
可以看到,在需要子列表滾動時,是對innerPositions中的所有position調(diào)用滑動方法的
而這innerPositions中的position是怎么來的呢?跟蹤一下可以發(fā)現(xiàn)是在調(diào)用NestedScrollController的attach時添加進來的,如下
因為之前我們看到過,子scrollable中的controller就是這個NestedScrollController,所以在updateopsition時會把舊的detach調(diào),把新生成的position attach進來
另外,在dispose中也會detach
由此我們就知道啦,因為開啟了緩存后就不會調(diào)用劃出屏幕的頁面的dispose,自然所有子scrollable的position都存在nestedScrollController里面了,當發(fā)生滑動時,遍歷調(diào)用positions數(shù)組,就導致屏幕外的列表也跟著滑動了~
既然開啟了緩存,手動dispose肯定是沒啥意義的,實際上我們只要在頁面切換過后把未顯示的position 給detach掉就好了。
然鵝,因為flutter不支持反射,子布局傳遞的position我們拿不到,nestedScrollController我們也不能直接拿到=。=
不過有一個對象我們之前見到過,scrollable就是通過他獲取controller的,而position則是傳給了獲取到的controller 就是PrimaryScrollController了,所以我打算在中間第三者插足,對傳遞Position的PrimaryScrollController進行Hook
在使用的時候把子列表添加進去,并設置對應的GlobalKey。
然后監(jiān)聽Tab切換
以上是我的方案,有問題的話還希望老哥幫忙指正,也希望有其他思路的老哥指點一下~~
上一下Github項目地址 用Flutter寫的WanAndroid 其中用到了這個方案
= =
3
一般這樣的問題都是Flutter內(nèi)部導致的問題,所以優(yōu)先建議命令執(zhí)行:flutter clean,然后再次執(zhí)行操作。
分享標題:flutter_hook,flutter_hooks
當前網(wǎng)址:http://aaarwkj.com/article4/dssgioe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、標簽優(yōu)化、移動網(wǎng)站建設、App開發(fā)、ChatGPT、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)