获取列表中小部件的高度
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);
}
}
我正在开发一个接收 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);
}
}