1、
flex 和 flexible 是flutter? 彈性布局的布局算法
Flex 是 Row和Column的父組件.
Flex組件可以沿著水平或垂直方向排列子組件

Flexible是一個(gè)控制Row、Column、Flex等子組件如何布局的組件。
Flexible組件可以使Row、Column、Flex等子組件在主軸方向有填充可用空間的能力
Flexible并不會(huì)強(qiáng)制子組件填充可用空間,子組件實(shí)際大小是多少,它就是多大.
2、Expanded 的父組件是Flexible
可以按比例“擴(kuò)伸” Row、Column和Flex子組件所占用的空間
flex參數(shù)為彈性系數(shù),默認(rèn)是1,如果為0或null,,則child是沒有彈性的,即不會(huì)被擴(kuò)伸占用的空間。如果大于0,所有的Expanded按照其flex的比例來分割主軸的全部空閑空間。
Expanded、Flexible只在Row、Column組件使用。
3、
flutter 中尺寸限制類容器組件包括ConstrainedBox、UnconstrainedBox、SizedBox、AspectRatio、FractionallySizedBox、LimitedBox、Container,Expanded。這些組件可以約束子組件的尺寸
ConstrainedBox用于對(duì)子組件添加額外的約束?,最大寬高、最小寬高

UnconstrainedBox組件不對(duì)子組件做任何約束,但仍然受父控件的約束,超出父控件的區(qū)域會(huì)報(bào)錯(cuò)
A RenderConstraintsTransformBox overflowed by 50 pixels on the left, 50 pixels on the top, 50 pixels on the bottom, and 50 pixels on the right.

SizedBox是具有固定寬高的組件,直接指定具體的寬高
4、單組件布局容器? IntrinsicWidth / IntrinsicHeight
IntrinsicHeight的作用是調(diào)整child到固定的高度。官方說這個(gè)很有用,但是應(yīng)該盡量少用,因?yàn)槠湫蕟栴}。
這個(gè)控件的作用,是將可能高度不受限制的child,調(diào)整到一個(gè)合適并且合理的尺寸。
IntrinsicWidth
當(dāng)stepWidth不是null的時(shí)候,child的寬度將會(huì)是stepWidth的倍數(shù),當(dāng)stepWidth值比child最小寬度小的時(shí)候,這個(gè)值不起作用;
可以防止子組件過高或過寬導(dǎo)致的屏幕越界,

5、FittedBox
在開發(fā)的過程中經(jīng)常會(huì)遇到子widget大小超過父widget大小的現(xiàn)象。子widget應(yīng)該遵循父widget的約束,如果子widget的原始大小超過了父原始視圖的大小,就需要進(jìn)行相應(yīng)的處理(比如:縮小、裁剪等)。
如果父 widget 寬度固定高度不固定,則默認(rèn)情況下 Text 會(huì)在文本到達(dá)父組件寬度的時(shí)候換行。
如果我們想讓 Text 文本在超過父組件的寬度時(shí)不要換行而是字體縮小,這時(shí)候就需要用到 FittedBox 組件。

6、
通過 LayoutBuilder,我們可以在布局過程中拿到父組件傳遞的約束信息,然后我們可以根據(jù)約束信息動(dòng)態(tài)的構(gòu)建不同的布局。

7、
FutureBuilder?是flutter中用于構(gòu)建基于?Future?返回的最新計(jì)算快照(Snapshot)的?Widget。使用?FutureBuilder?可以非常方便地根據(jù)異步計(jì)算的結(jié)果來創(chuàng)建 UI。
比如請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)回來后創(chuàng)建widget。
builder?方法可能會(huì)被多次調(diào)用,尤其是在?Future?函數(shù)執(zhí)行的過程中,它可能會(huì)調(diào)用多次?builder?來重建 UI。

8、狀態(tài)管理
在 Flutter 中,有不同的狀態(tài)管理方法可供選擇,包括:
StatefulWidget、InheritedWidget、Provider就是基于InheritedWidget、Redux、BLoC?、GetX
InheritedWidget 它可以使 Widget 樹中的祖先 Widget 共享數(shù)據(jù)給它們的后代 Widget
允許你共享數(shù)據(jù)和狀態(tài),并且可以讓子部件自動(dòng)更新當(dāng)共享的數(shù)據(jù)發(fā)生變化時(shí)。
9、
而Dart是一個(gè)在單線程中運(yùn)行的,一般使用Future異步來處理耗時(shí)操作。
項(xiàng)目中用到最多的就是通過future去處理網(wǎng)絡(luò)請(qǐng)求
但是Future是表示單個(gè)計(jì)算結(jié)果的異步封裝
Stream也是用來處理異步操作的,Stream所用的設(shè)計(jì)模式則是觀察者模式,getx的obx就是使用的觀察者模式
Stream和Future都是用于接收異步事件數(shù)據(jù),而Stream表示的是多個(gè)序列化事件的異步封裝
Completer? 用來控制Future的調(diào)用,比如兩個(gè)異步網(wǎng)絡(luò)請(qǐng)求,第二個(gè)要依賴第一個(gè)結(jié)果,這時(shí)就可以用到 Completer
10、isolate?
Dart是單線程模型,單線程模型中主要就是在維護(hù)著一個(gè)事件循環(huán)(Event Loop)。
所以Dart只有一個(gè)主線程, 在Dart叫isolate(隔離)
所有的Dart代碼都是運(yùn)行在Isolate之中
isolate是Dart對(duì)?「Actor并發(fā)模型」?的實(shí)現(xiàn)
任何Dart程序的并發(fā)都是運(yùn)行多個(gè)isolate的結(jié)果
isolate單向通信、isolate雙向通信
什么場(chǎng)景該使用Future還是isolate
如果代碼片段不能被中斷,使用傳統(tǒng)的同步過程(一個(gè)或多個(gè)相互調(diào)用的方法);
如果代碼片段可以獨(dú)立運(yùn)行而不影響應(yīng)用的性能,可以考慮通過Future使用事件循環(huán);
如果繁重的處理可能需要一些時(shí)間才能完成,并且可能影響應(yīng)用的性能,考慮使用Isolate。
如果一個(gè)方法需要幾毫秒用Future
如果一個(gè)處理流程需要幾百毫秒用Isolate