之前一直有個疑問,不用無界widget(ListView、Coulmn、Row等等)怎么樣實(shí)現(xiàn)線性布局,或者更加復(fù)雜的布局。因?yàn)槭褂脽o界widget實(shí)現(xiàn)上下排列的布局固然容易,但是,要是內(nèi)部嵌套的又是一個無界布局那這時候就麻煩了,無界與無界嵌套的話,sdk會不知道怎么布局,當(dāng)然可以通過設(shè)置shrinkWrap屬性或者包一層SizedBox來解決,但如果作為一個通用容器,需要使用者額外的去設(shè)置這樣?xùn)|西,似乎不太友好,所以找到了CustomMultiChildLayout的控件,他可以實(shí)現(xiàn)自定義布局,使用如下
他需要兩個參數(shù),一個是布局委托,一個是需要布局的widgets,其中widget需要是LayoutID,因?yàn)樵谖兄行枰鶕?jù)id來布局
return CustomMultiChildLayout(
delegate:,
children:,
);
然后實(shí)現(xiàn)自己的布局委托,需要重寫兩個方法
class _StatusPageLayoutDelegate extends MultiChildLayoutDelegate {
static const String actionBar = 'action_bar';
static const String body = 'body';
@override
void performLayout(Size size) {//布局
//布局actionbar
Size actionBarSize = layoutChild(actionBar,
new BoxConstraints(maxHeight: size.height, maxWidth: size.width));
//offset(0,0),放在頂部
positionChild(actionBar, Offset(0.0, 0.0));
//布局body,約束為剩下的空間
layoutChild(body, BoxConstraints.tight(Size(size.width, size.height)));
//offset(0,actionbar高度),排在actionbar下方
positionChild(body, Offset(0.0, actionBarSize.height));
}
//是否需要重新布局
@override
bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) {
return false;
}
}