在出現(xiàn)布局錯誤時能盡快找到錯誤原因。
目前成都創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、永康網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
以下是對關(guān)鍵內(nèi)容的翻譯和注解。
flutter的布局模型是“一步布局模型”(one-pass layout model),在渲染樹中,向下treewalk傳遞給子 盒約束,然后再向上treewalk將計算好的幾何形狀(比如高度、寬度等)傳遞給父。我理解one-pass layout model就是一遍就將布局計算好。不會多次treewalk去計算布局,或多次重繪(repaint)并多次計算布局。
計算的好的幾何形狀必須符合盒約束的要求。
盒約束有四個值,minWidth,maxWidth,minHeight,maxHeight,符合盒約束的意思就是說 計算出的寬高必須在最大值和最小值之間 。
我猜測,在將盒約束向子傳遞的過程中,子會根據(jù)父的盒約束,設(shè)置自己的盒約束,而不是單純的繼承父的盒約束。稍后結(jié)合Flex布局可以解釋。
盒約束的最小值和最大值相等。因此在tight約束下的子的高寬將等于父的高寬,也就是說子是緊緊(tight)貼著父的。
盒約束的最小值為0,也就是說子可以是小于盒約束最大值的任何值,也就是說子是不緊貼(松的,loose)父的。
盒約束的最大值不是infinite(無窮大)
盒約束的最大值是infinite(無窮大)
盒約束的最小值是infinite(無窮大),他的子的寬或高只能取無窮大。
子的寬高(Size)符合盒約束的要求。
以下摘抄原文檔并翻譯,并加以分析。為了關(guān)注要點, 忽略crossAxis方向(水平方向)的處理 。
以下圖為Column布局實例。
給column布局進(jìn)行了以下6步操作
首先給每個非flex子元素,設(shè)置豎直方向unbounded(無界)的盒約束。結(jié)合圖片,也就是將1、2兩個子設(shè)置好豎直方向無界的盒約束。示例中1和2設(shè)置了高度,因此一共占用高度是5+3=8.
按flex的比例給flex元素分配剩余的空間。因為示例只有一個flex元素,即3號元素,因此將占有剩余全部空間,高度是20-5-3 = 12。
在第二步中分配好空間的flex元素,給他設(shè)置的盒約束不是豎直方向unbounded(給非flex元素設(shè)置的是豎直方向unbounded),而是有界的盒約束,盒約束的maxHeight是12,即第二步中被分配的高度。
水平方向不解釋了。高度設(shè)置完了他去設(shè)置寬度。
Column組件的總高度是由mainAxisSize屬性決定的,如果值是MainAxisSize.max,Column的高度就是Column的盒約束的maxHeight值,示例中我們給Column設(shè)置了高度為20的bounded盒約束,假設(shè)Column.mainAxisSize=MainAxisSize.max,那么Column的高度就是20.如果mainAxisSize=MainAxisSize.min,Column的高度將由其子元素的高度和決定。假設(shè)3號flex元素不設(shè)置成flex元素,而是固定高度為8,那么Column的高度就是5+3+8=16.
設(shè)置子元素的位置,即設(shè)置靠左,靠右,居中,分散等,與本示例關(guān)系不大。
根據(jù)第一步,inner column被outer column設(shè)置了無界(unbounded)的盒約束,Column會緊包children,而inner column的Expanded要撐開以占用inner column的剩余空間,這就沖突了。
解決方案:給inner column設(shè)置有界的盒約束即可。比如給inner column外包一層有高度的Container。
下面這種方案,給inner column包一層Expanded也可以,是因為在outer column中,Expanded會被設(shè)置成有界的盒約束(結(jié)合第三步),因此Expanded就可以向外擴(kuò)展(expand)了。
Dart作為高級語言,支持面向?qū)ο蟮暮芏嗵匦?,并且支持基于mixin的繼承方式,基于mixin的繼承方式是指:一個類可以繼承自多個父類,相當(dāng)于其他語言里的多繼承。所有的類都有同一個基類Object,這和特性類似于Java語言,Java所有的類也都是繼承自O(shè)bject,也就是說一切皆對象。
Dart 是一門面向?qū)ο蟮恼Z言, 全部的類都是繼承自 Object , 除了支持傳統(tǒng)的 繼承、封裝、多態(tài) , 還有基于組合(Mixin-based)的繼承特性
類型推導(dǎo)(var/final/const)
var
final和const的區(qū)別
3.非零即真( )
4.字符串
5.集合
Dart中變量初始值為null,即使是int類型也可以是null(java中int默認(rèn)是0, boolean默認(rèn)是false); Dart支持自識別,可以是用var定義變量,也可以直接指定具體類型; final或者const都可修飾不可變的變量,final變量只能賦值一次,const是編譯時常量。
int和double是num子類,沒有float類型; 支持字符串模板,用${expression}的方式來實現(xiàn)字符串效果,類似如字符串拼接; String可以使用單引號或者雙引號; Dart沒有數(shù)組,只有列表; 其中List,Set,Map不是抽象接口,是具體實現(xiàn)類,可直接使用; Map的key沒有指定類型,key類型不一致不會報錯;key不能相同,但是value可以相同,value可以為null。 var name = 'Tom';
方法也是對象,方法可賦值給一個變量; 如果方法的參數(shù)是解構(gòu)出來的可以通過 @required 注解標(biāo)注為必填 const Scrollbar({Key key, @required Widget child}); 支持可選參數(shù),可選命名參數(shù)用{}包圍,可選位置參數(shù)寫在最后并且使用[]包圍 String say(String from, String msg, [String device]); 支持默認(rèn)參數(shù) void enableFlags({bool bold = false, bool hidden = false}) {…}; 以_開頭的方法都是私有的。 void main() {
支持閉包,閉包能夠訪問外部方法內(nèi)部的局部變量
1.空替換?? expr1 ?? expr2,如果expr1是non-null,返回其值。否則執(zhí)行expr2并返回其結(jié)果; 2.條件成員訪問?.P?.y = 4; 如果p是non-null,則設(shè)置y的值等于4; 3.類型判定操作符(as,is,is!); 4.級聯(lián)操作,可以在同一個對象上連續(xù)調(diào)用多個函數(shù)以及訪問成員變量;
和java不同的是,Dart可以拋出任意類型的對象; 程序不會強(qiáng)制要求開發(fā)中處理異常,但若發(fā)生異常,程序會中斷; 其中異常主要分為Error和Exception兩種類型。
創(chuàng)建對象可以不使用new關(guān)鍵字; Dart中沒有public,private,protected這些關(guān)鍵字; 沒有interfaces關(guān)鍵字,每一個類都是一個接口。我們可以用抽象類來類比java中的接口; Dart把多重繼承的類叫做Mixins。
支持語法糖 Point(this.x, this.y); 每個實例變量都會自動生成一個getter方法,Non-final變量還會自動生成一個setter; 命名構(gòu)造函數(shù),使用命名構(gòu)造函數(shù)可以為一個類實現(xiàn)多個構(gòu)造函數(shù),也能更加清晰的表明你的意圖;
斷言是如果條件表達(dá)式不滿足則停止代碼執(zhí)行; 斷言只在檢查模式下運(yùn)行有效,如果在生產(chǎn)模式下運(yùn)行則不會執(zhí)行。
Dart 以兩種模式運(yùn)行: Dart 1.x 有生產(chǎn)模式和檢查模式兩種模式, Dart 2.x 中移除了檢查模式。
注:建議在開發(fā)/測試模式中使用 檢查模式 運(yùn)行 Dart VM ,因為它會添加警告和錯誤以幫助開發(fā)和調(diào)試過程;選中的模式會強(qiáng)制執(zhí)行各種檢查,例如類型檢查等。
dart標(biāo)識符可以包括字符和數(shù)字,但不能以 數(shù)字開頭 。
Dart 是一種面向?qū)ο蟮木幊陶Z言。
代碼說明:定義了一個類 TestClass ,這個類擁有一個方法 disp() ,方法可以實現(xiàn)在終端打印字符串 Hello Dart! ,使用 new 關(guān)鍵字創(chuàng)建類的對象,該對象調(diào)用方法 disp() 。
關(guān)于dart的學(xué)習(xí)還有很多;我列出如下: Flutter高級工程師進(jìn)階學(xué)習(xí)資料;需要可以私信我。發(fā)送“核心筆記”或“手冊”,即可領(lǐng)取資料!
使用注解@JSONField
其中name: "list"的list就是后臺返回字段名稱,deserialize(默認(rèn)true)是否參與fromJson解析,serialize(默認(rèn)true)是否參與tojson,
比如包含如下json
可以解析出來list中map的所有字段,并且每個list的map字段不同或者為null問題有會做出處理
helper文件內(nèi)容
直接傳遞上面生成的entity就可以自動根據(jù)map解析出對應(yīng)實例,并自動賦值
網(wǎng)絡(luò)請求實例
dio請求部分
這些操作完成后自動生成如下文件
@JSONField作用在Field時,其name不僅定義了輸入key的名稱,為了防止后臺返回數(shù)據(jù)不規(guī)范,但是flutter端需要按照駝峰命名
a_b_c_entity_helper.dart類提供了eitity類的tojson和fromjson代理方法
json_convert_content.dart提供了json_convert_content.dart.fromJsonAsT方法 根據(jù)泛型來解析json成對象
external關(guān)鍵字估計用到人很少,在看源碼的時侯經(jīng)??梢钥吹?,如下:
我看到網(wǎng)上一句英文總結(jié)的很好
翻譯過來就是external用來修飾不是抽象class里的抽象方法,簡單來說, external只聲明方法,聲明的方法需要由外部去實現(xiàn) ,通常是由底層sdk根據(jù)不同平臺(vm、web等)實現(xiàn);若外部沒實現(xiàn),則會返回null;
external聲明的方法,通過@patch注解實現(xiàn) ,結(jié)構(gòu)如上;
比如Object里各種external聲明方法的實現(xiàn)如下:
更多信息,請移步 如何找到flutter external聲明方法的實現(xiàn)
當(dāng)前名稱:flutter注解,flutter 注解
分享地址:http://aaarwkj.com/article0/dssphio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、全網(wǎng)營銷推廣、App開發(fā)、響應(yīng)式網(wǎng)站、靜態(tài)網(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)