之前一直有个疑问,不用无界widget(ListView、Coulmn、Row等等)怎么样实现线性布局,或者更加复杂的布局。因为使用无界widget实现上下排列的布局固然容易,但是,要是内部嵌套的又是一个无界布局那这时候就麻烦了,无界与无界嵌套的话,sdk会不知道怎么布局,当然可以通过设置shrinkWrap属性或者包一层SizedBox来解决,但如果作为一个通用容器,需要使用者额外的去设置这样东西,似乎不太友好,所以找到了CustomMultiChildLayout的控件,他可以实现自定义布局,使用如下
他需要两个参数,一个是布局委托,一个是需要布局的widgets,其中widget需要是LayoutID,因为在委托中需要根据id来布局
return CustomMultiChildLayout(
delegate:,
children:,
);
然后实现自己的布局委托,需要重写两个方法
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;
}
}