記錄下自己踩過的坑,怕忘了
習(xí)水網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
一.TextField:
1.去掉輸入數(shù)字的計(jì)數(shù):decoration中的counterStyle: TextStyle(color: Colors.transparent).
2.去掉獲取和失去焦點(diǎn)時(shí)邊框改變顏色的效果:decoration內(nèi)border: InputBorder.none,
3.去邊框時(shí)設(shè)置BorderSide的width為0或color: Colors.transparent后依然存在邊框時(shí),需要設(shè)置為borderSide: BorderSide.none
4.設(shè)置背景色需要在decoration內(nèi) ? ? filled:true, ? fillColor: Colors.blue同時(shí)設(shè)置才會(huì)顯示
二.Uint8List類型和string類型,Listint的轉(zhuǎn)換
連續(xù)兩次base64解碼時(shí),參數(shù)只能使用string類型,但是base64解碼后是Uint8List類型,此時(shí)需要將Uint8List類型轉(zhuǎn)換為string類型,使用:utf8.decode(Uint8List)即可,需要import 'dart:convert';
Listint轉(zhuǎn)Uint8List:讀取接口時(shí)獲取的數(shù)據(jù)是Listint的圖片數(shù)據(jù),想顯示時(shí)需要轉(zhuǎn)成Uint8List,然后使用Image.memory(),使用:Uint8List.fromList(Listint)即可
三.報(bào)錯(cuò):DioError [DioErrorType.DEFAULT]: FormatException: Unexpected character (at character 1)MGFlMFo0NEZ3RWNMbE5YbGNGOXZGcUlJdUhIS2x2Q3NlckxqWXlEeG5JWndZdXIrSUpLN3ZOczR...
這是因?yàn)閐io請(qǐng)求返回的數(shù)據(jù)默認(rèn)是以json的格式讀取的,而返回的數(shù)據(jù)是密文形式,需要修改dio的Options的responseType為ResponseType.PLAIN,這樣返回的數(shù)據(jù)就以字符串形式處理.
四.去掉點(diǎn)擊控件背景出現(xiàn)的水波紋效果,即去掉md的效果:
在main.dart的MaterialApp內(nèi)的theme加上splashColor: Colors.transparent
五.布局去掉沉浸式效果和布局設(shè)置占滿全屏卻無效的問題
使用Scaffold的body的布局默認(rèn)是沉浸式的,將狀態(tài)欄一起包含了,可以通過在body后添加一層SafeArea即可.
布局設(shè)置double.infinity占滿全屏高度卻無效,大部分情況都是因?yàn)槟骋患?jí)的父布局的高度已經(jīng)有了限制,所以設(shè)置充滿屏幕只會(huì)充滿父布局,有些widget默認(rèn)是按內(nèi)容填充類似wrap_content就會(huì)導(dǎo)致寫布局的過程中自己沒有限制高度但最后的布局不是自己想要的,可以給各個(gè)父布局設(shè)置不同背景顏色來查看是從哪兒開始被限制了高度來排查問題.
六.占滿剩余空間,類似android的match_parent可以使用double.infinity
七.LinearProgressIndicator
1.LinearProgressIndicator設(shè)置進(jìn)度值的顏色為單一顏色:valueColor : new AlwaysStoppedAnimation(Color(JColor.blue))
2.給LinearProgressIndicator設(shè)置圓角:ClipRRect(
borderRadius:BorderRadius.circular(60.0),
child:LinearProgressIndicator(value:0.2,backgroundColor:Color(JColor.grayBg),valueColor:new AlwaysStoppedAnimation(Color(JColor.blue)),
)
八.Expanded:
1.若嵌套多層column且內(nèi)容的高度都不確定需要占滿剩余空間,需要每層的column的內(nèi)容都嵌套一層expanded來申明每層都占滿剩余的空間,否則最里面的內(nèi)容層需要指定高度,不然會(huì)報(bào)錯(cuò)
九.Container設(shè)置最小/大寬度或高度:
constraints:BoxConstraints(minHeight:56),
十.滑動(dòng)的widget嵌套:
1.解決滑動(dòng)沖突:內(nèi)層嵌套的滑動(dòng)widget設(shè)置physics:NeverScrollableScrollPhysics()
2.解決滑動(dòng)嵌套u(yù)i顯示不出來或者報(bào)錯(cuò),內(nèi)層的滑動(dòng)widget設(shè)置shrinkWrap:true
十一.使用multi_image_picker: ^4.3.4安卓運(yùn)行報(bào)錯(cuò)Didn't find class "com.sangcomz.fishbun.FishBunFileProvider"
1.需要android工程支持androidx,需要在android工程的gradle.properties內(nèi)添加android.enableJetifier=true和android.useAndroidX=true并點(diǎn)擊右上角的open for editing in android studio,運(yùn)行成功后就可以了
十二.使用textfield時(shí)的文字ui總是很高
使用了maxlength且只是在textfield的InputDecoration設(shè)置counterStyle的顏色為透明使下面的計(jì)數(shù)文字消失會(huì)導(dǎo)致文字ui很高,counter的計(jì)數(shù)文字只是顏色是透明但依然在布局中占了位置所以導(dǎo)致文字很高,直接使用counterText:""即可
十三.使用ListView報(bào)錯(cuò)Vertical viewport was given unbounded height
需要將ListView放入Expanded內(nèi)部
ClipOval例子(默認(rèn)全圓角):
new ClipOval(
? ? ? ? child: Container(
? ? ? ? ? width: 100,
? ? ? ? ? height: 100,
? ? ? ? ? color: Colors.red,
? ? ? ? ),
? ? ? ),
ClipRRect例子(可自定義圓角):
new ClipRRect(
? ? ? ? borderRadius: BorderRadius.circular(50),
? ? ? ? child: Container(
? ? ? ? ? width: 100,
? ? ? ? ? height: 100,
? ? ? ? ? color: Colors.red,
? ? ? ? ),
? ? ? )
ClipRect控件默認(rèn)是通過限制子widget的繪制區(qū)域來達(dá)到裁剪的效果的,通過custom clipper,可以自定義裁剪的大小跟坐標(biāo)
ClipRect的定義如下
ClipRect class默認(rèn)是沒有任何裁剪效果的,需要通過clipper參數(shù)告訴ClipRect如何去裁剪,clipper是個(gè)CustomClipper類型,CustomClipper是個(gè)抽象接口類,我們通過繼承CustomClipper,重寫 getClip 方法可以定義一個(gè)裁剪區(qū)域,通過重寫 shouldReclip 方法來告訴ClipRect當(dāng)一個(gè)新的clipper被設(shè)置了是否需要更新裁剪區(qū)域,譬如開始設(shè)置的clipper裁剪坐標(biāo)是從(10,10)開始的,新設(shè)置的clipper裁剪坐標(biāo)是(20,20),那么shouldReclip需要返回true來通知ClipRect更新裁剪區(qū)域。
下面這個(gè)例子從網(wǎng)絡(luò)上加載一張圖片,并且進(jìn)行裁剪,裁剪坐標(biāo)是(10,10) 裁剪的寬高是圖片的寬高減去10
效果如下
flutter能設(shè)置圓角的組件:ClipRRect、ClipOval、CircleAvatar、BoxDecoration BorderRadius.circular、BoxDecoration BoxShape.circle
1.ClipRRect:將 child 剪裁為寬高相等的圓角組件,可設(shè)置圓角度數(shù)
2.ClipOval: 將child裁剪為寬高相等的圓角組件(只包括圓形和橢圓形),不可設(shè)置圓角度數(shù)
3.CircleAvatar:只能設(shè)置自身圓形,不能裁剪child
4.BoxDecoration BorderRadius.circular 設(shè)置自身圓角,不能裁剪child
4.BoxDecoration BoxShape.circle 只能設(shè)置自身為圓形,不能裁剪child
參考: flutter 圓角設(shè)置
Flutter中自定義組件一般有兩種方式:
CustomPaint繼承自SingleChildRenderObjectWidget,即它可以在通過嵌套引入到widget樹中,并且可以有一個(gè)child子widget。它的構(gòu)造方法如下:
painter和foregroundPainter需要接收CustomPainter對(duì)象,是CustomPaint核心。CustomPainter是進(jìn)行UI繪制的核心類,繪制時(shí), CustomPaint 首先在畫布上調(diào)用 painter繪制 , 然后再繪制它的 child Widget, child 繪制完成后再調(diào)用 foregroundPainter 進(jìn)行繪制。
size屬性標(biāo)識(shí)繪制區(qū)域大小,但當(dāng)CustomPaint有child,該屬性將會(huì)忽略,而使用child的大小為繪制區(qū)域大小。
isComplex和willChange用于控制繪制層緩存處理的,這里暫不討論。
可實(shí)現(xiàn)CustomPainter子類進(jìn)行UI繪制
實(shí)現(xiàn)paint方法進(jìn)行真正的繪制,canvas是畫布對(duì)象,size是繪制區(qū)域,是從CustomPaint中size屬性傳遞得到的。繪制過程與Android原生開發(fā)十分類似,連API都十分相像,這點(diǎn)對(duì)熟悉Android原生開發(fā)者真是太友好了。
Paint對(duì)象是畫筆對(duì)象,就是繪圖工具,我們可以設(shè)置畫筆的顏色、粗細(xì)、是否抗鋸齒、筆觸形狀以及作畫風(fēng)格等,通過這些屬性我們可以很方便的來定制自己的UI效果,在繪制的過程中可以定義多個(gè)畫筆,以便實(shí)現(xiàn)多種風(fēng)格圖形的集合。
根據(jù)需求選擇合適的畫筆屬性,完成你的繪制。
Canvas是繪制的畫布,它包含了很多繪制方法,可以繪制出各種形狀的圖形。需要注意的是,畫布是應(yīng)用所有控件都在使用的, 所以通過這個(gè)畫布其實(shí)是可以繪制充滿屏幕的內(nèi)容的,每次繪制都應(yīng)該限制在本控件的區(qū)域(Size)內(nèi), 以免繪制覆蓋到其他組件。
下面介紹下Canvas的繪制方法:
PointMode是個(gè)枚舉
p1、p2為線段兩個(gè)端點(diǎn)
Rect定義矩形的大小位置,有多種構(gòu)造方式:
RRect描述圓角矩形,他通過Rect和Radius來構(gòu)造
畫圓比較簡(jiǎn)單,c表示圓心位置,radius是半徑。
橢圓使用外接矩形確定大小位置,rect就是外接矩形。
繪制弧形,先確定弧形對(duì)應(yīng)的橢圓,同樣地用外接矩形rect確定橢圓,然后根據(jù)起始點(diǎn)和結(jié)束點(diǎn)角度來確定那一段弧度,startAngle,sweepAngle分別代表起始和結(jié)束點(diǎn)角度,角度用弧度表示法。
useCenter表示是否連接閉合形狀,userCenter = false表示不閉合,即畫一段弧線,userCenter = true表示閉合,即繪制一個(gè)扇形。
繪制路徑,關(guān)鍵在于構(gòu)建路徑Path,可以直接new Path對(duì)象,然后通過path方法可以連接出圖形,path關(guān)鍵方法如下:
還有其他方法,有興趣可以查看API。
小菜在學(xué)習(xí)時(shí)需要用到氣泡效果,為了更加靈活,小菜封裝了一個(gè)簡(jiǎn)單的 flutter_bubble 氣泡插件,方便日常的使用;
小菜準(zhǔn)備用 Canvas 的 drawPath 進(jìn)行繪制,主要分為三個(gè)部分,圓角弧線,普通直線,尖角折線,均可由 drawPath 自帶方法繪制;小菜以前整理過關(guān)于 Canvas 繪制的小博客,實(shí)現(xiàn)很簡(jiǎn)單;
小菜繪制了一個(gè)簡(jiǎn)陋的原型圖,整體黑框?yàn)? Bubble Widget 整體范圍;藍(lán)色圓弧為圓角位置;紅色尖角可根據(jù)上下左右參數(shù)進(jìn)行配置,且只可展示一個(gè),尖角的高度和角度可自由配置,當(dāng)確定一個(gè)尖角位置時(shí),其余三個(gè)方向?qū)捀哐由斓胶诳虿糠郑欢染€則是連接圓角與尖角等直線;中間空余部分為子 Widget 位置; Tips: Child Widget 寬高小于等于 Bubble Widget ;
首先在邊角處繪制四個(gè)圓弧,直接用 arcTo 即可,需要注意的是:小菜整體以 drawPath 方式實(shí)現(xiàn),準(zhǔn)備從左上角開始順時(shí)針繪制,所以繪制圓弧時(shí)也是順時(shí)針方向;
小菜理解, Rect 為繪制圓角的矩形,包括位置及大小; startAngele 為起始角度; sweepAngle 為繪制弧形角度;小菜需要的四個(gè)圓弧大小均為 pi/2 ,只需調(diào)整矩形位置與起始角度即可;
其次繪制尖角,小菜的尖角是由 lineTo 兩段直線拼接起來的,只需要處理起點(diǎn)與終點(diǎn)即可;小菜為了更加靈活,可以設(shè)置尖角高度與尖角角度(0 ~ 180),通過三角函數(shù)進(jìn)行計(jì)算;
最后就是將處理好的連接起來,小菜為了適應(yīng)更多場(chǎng)景,尖角位置也可自由配置,長(zhǎng)度為到圓角的距離,默認(rèn)為邊框中間位置;
小菜將配置邏輯編輯好發(fā)布到 Pub 庫(kù),基本 BubbleWidget 便完成,簡(jiǎn)單分析一下可配置項(xiàng);
自定義 Bubble Widget 是小菜發(fā)布的第二款 Pub 插件,還有很多不完善的地方,如有錯(cuò)誤請(qǐng)多多指導(dǎo)!
本文標(biāo)題:包含flutterrect的詞條
網(wǎng)站鏈接:http://chinadenli.net/article28/dsdeojp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、小程序開發(fā)、移動(dòng)網(wǎng)站建設(shè)、軟件開發(fā)、電子商務(wù)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)