获取列表中小部件的高度

Get the height of a widget in a List

我正在开发一个接收 List<Widget> 作为参数的 CustomPainter 小部件。 我想知道每个 Widget 的大小,以便调整我的绘画。 List<Widget> 将是用户选择的 List,所以我不能在这里使用 GlobalKeys

我看了 Whosebug 上的一些答案和有关该主题的文章,但每次答案似乎都不适合我的问题。

class MyPainter extends CustomPainter {
  final List<Widget> myWidgetList;

  MyPainter({
    this.myWidgetList,
  });

  @override
  void paint(Canvas canvas, Size size) {

    for (var item in myWidgetList) {
      // print my widget height.
    }
    ...
  }
}

因为我无法在渲染之前获取小部件的大小,所以我将 List<Widget> 中的每个小部件包装到另一个将使用 GlobalKey 的小部件中,然后访问我的每个小部件都带有 Context.

这不是一个完美的解决方案,但它是迄今为止我能找到的最好的解决方案。

class SubtaskWrapper extends StatelessWidget {
  final Widget child;
  final Function onChange;
  final SubTasksViewModel model;

  SubtaskWrapper({
    Key? key,
    required this.onChange,
    required this.model,
    required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    SchedulerBinding.instance!.addPostFrameCallback(postFrameCallback);

    return Container(
      key: widgetKey,
      child: child,
    );
  }

  GlobalKey widgetKey = GlobalKey();
  Size? oldSize;

  void postFrameCallback(_) {
    BuildContext? context = widgetKey.currentContext;
    if (context == null) return;

    Size? newSize = context.size;
    if (oldSize == newSize) return;

    oldSize = newSize;
    onChange(newSize, model);
  }
}