1

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

我看了一些关于 StackOverflow 的答案和关于这个主题的文章,但每次答案似乎都不适合我的问题。

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.
    }
    ...
  }
}
4

1 回答 1

0

由于在渲染之前我无法获得我的小部件的大小,我将我的每个小部件包装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);
  }
}
于 2021-11-17T13:24:53.587 回答