Flutter获取指定View的Size

51 阅读1分钟

`

class AfterLayout extends SingleChildRenderObjectWidget {
  const AfterLayout({
    super.key,
    required this.callback,
    super.child,
  });

  @override
  RenderObject createRenderObject(BuildContext context) {
    return RenderAfterLayout(callback);
  }

  @override
  void updateRenderObject(BuildContext context, RenderAfterLayout renderObject) {
    renderObject.callback = callback;
  }

  final ValueSetter<RenderAfterLayout> callback;
}

class RenderAfterLayout extends RenderProxyBox {
  RenderAfterLayout(this.callback);

  ValueSetter<RenderAfterLayout> callback;

  @override
  void performLayout() {
    super.performLayout();
    SchedulerBinding.instance.addPostFrameCallback((timeStamp) => callback(this));
  }

  // component offset
  Offset get offset => localToGlobal(Offset.zero);

  // component size
  Rect get rect => offset & size;
}

`

使用示例:

AfterLayout(
    callback: (layout) {
    // 在回调中获取size
      toolbarFeature.tabBarHeight = layout.size.height;
    },
    child: bottomBar),