📅  最后修改于: 2023-12-03 14:52:20.020000             🧑  作者: Mango
当我们需要在 StatelessWidget 中使用 StatefulWidget 中的数据或方法时,我们需要使用 GlobalKey 和 传递参数来实现。但是在 StatefulWidget 中,我们可以直接使用 BuildContext 来访问其他 widget 的数据和方法。在 initState 中使用BuildContext 也是同样的道理。
BuildContext 是 Flutter 中非常重要的概念,它是构建 Widget 树的每个 widget 之间的通信桥梁。通过BuildContext,我们可以访问到父 widget、子 widget 和兄弟 widget 中的数据和方法。
在 StatefulWidget 中,initState 是一个非常重要的生命周期方法,它在 widget 创建之后立即调用,但是在 widget 初次渲染之前调用。由于 initState 在 widget 创建之后立即调用,所以此时我们无法直接使用 context,因为 context 需要在 widget 当中构建完成之后才能够获取到。但是,我们可以使用 addPostFrameCallback 方法来在 widget 构建完成之后再获取到 context。
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late BuildContext _context;
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback(_afterLayout);
}
void _afterLayout(_) {
_context = context;
// 在这个 _afterLayout 回调方法中可以使用 _context 访问 context
}
@override
Widget build(BuildContext context) {
return Container();
}
}
在 initState 中使用 this.context 得到的是 state 的 buildContext,因为 initState 是在 state 的 build 方法之前就被调用的。我们需要在 Widget 构建完成后,使用 WidgetsBinding.instance!.addPostFrameCallback 方法来获取到 widget 树的上下文,然后在回调方法中保存BuildContext。
在 initState 中使用 BuildContext 可以用 addPostFrameCallback 来延迟获取BuildContext,这样我们就可以使用context 变量了。WithContext 可以访问上下文中的其他 widget 的数据和方法,有助于构建 Flutter 中一些复杂的 widget。