Flutter之ParentData

1,473 阅读1分钟
  1. ParentData使用过程中伴随的Dart语法现象。 (对比java更好用了,有没有😘)
// 将父类声明为子类,语法是正确的
class Person{
  BaseInfo b;
}

class BaseInfo{

}

class FurtherInfo extends BaseInfo {
  num age;
}

void main(){
  FurtherInfo info = Person().b;
  var age = info.age;
  print('info:'+age.toString());
}

// 实例flex.dart,其中FlexParentData extends ParentData
  int _getFlex(RenderBox child) {
    final FlexParentData childParentData = child.parentData;
    return childParentData.flex ?? 0;
  }
  1. 设置和传递ParentData案例介绍
            Expanded(
              flex: 1,
              child: Container(
                color: Colors.amber,
                height: 100,
              ),
            ),

Expanded 继承链

Expanded > Flexible > ParentDataWidget

其中Expanded负责接收参数,Flexible通过applyParentData函数,将flex塞到parentData中.

传递数据的调用栈:

Flexible.applyParentData (basic.dart:4333)
RenderObjectElement._updateParentData (framework.dart:4970)
RenderObjectElement.attachRenderObject (framework.dart:4989)
RenderObjectElement.mount (framework.dart:4752)
SingleChildRenderObjectElement.mount (framework.dart:5126)
Element.inflateWidget (framework.dart:3101)
Element.updateChild (framework.dart:2904)
ComponentElement.performRebuild (framework.dart:3961)
...
  1. 使用ParentData案例介绍(RenderFlex使用flex进行layout)
@override
  void performLayout() {
  ...
  final int flex = _getFlex(child);
  ...
}

  FlexFit _getFit(RenderBox child) {
    final FlexParentData childParentData = child.parentData;
    return childParentData.fit ?? FlexFit.tight;
  }

总结:ParentData是框架将数据从Widget传递给RenderObject的容器。