Flutter 获取子级 Widget 宽度:使用 GlobalKey 和 LayoutBuilder
可以使用 GlobalKey 来获取子级 widget 的宽度。
-
在父级 widget 中创建一个 GlobalKey。
-
在子级 widget 中使用 LayoutBuilder 获取子级 widget 的宽度。
-
将子级 widget 的宽度保存到父级 widget 的 GlobalKey 中。
下面是一个简单的示例代码:
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
final GlobalKey _childKey = GlobalKey();
double _childWidth = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
ChildWidget(
key: _childKey,
),
Text('Child width: $_childWidth'),
],
);
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
}
void _afterLayout(_) {
RenderBox renderBox =
_childKey.currentContext.findRenderObject() as RenderBox;
setState(() {
_childWidth = renderBox.size.width;
});
}
}
class ChildWidget extends StatelessWidget {
const ChildWidget({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Container(
width: constraints.maxWidth / 2,
height: 100,
color: Colors.blue,
);
},
);
}
}
在这个示例中,ParentWidget 包含一个 ChildWidget,并且使用 GlobalKey 来获取 ChildWidget 的宽度。在 ChildWidget 中,使用 LayoutBuilder 获取 ChildWidget 的宽度,并将宽度保存到 ParentWidget 的 GlobalKey 中。在 ParentWidget 的 initState 方法中,使用 WidgetsBinding.instance.addPostFrameCallback 方法来等待 ChildWidget 布局完成后再获取宽度,最后将宽度保存到 _parentWidth 变量中。在 ParentWidget 的 build 方法中,显示 _childWidth 变量的值。
原文地址: https://www.cveoy.top/t/topic/na7y 著作权归作者所有。请勿转载和采集!