📜  如何在 initstate Flutter 中使用 buildcontext - C# (1)

📅  最后修改于: 2023-12-03 14:52:20.020000             🧑  作者: Mango

如何在 initState Flutter 中使用 BuildContext

当我们需要在 StatelessWidget 中使用 StatefulWidget 中的数据或方法时,我们需要使用 GlobalKey 和 传递参数来实现。但是在 StatefulWidget 中,我们可以直接使用 BuildContext 来访问其他 widget 的数据和方法。在 initState 中使用BuildContext 也是同样的道理。

什么是BuildContext

BuildContext 是 Flutter 中非常重要的概念,它是构建 Widget 树的每个 widget 之间的通信桥梁。通过BuildContext,我们可以访问到父 widget、子 widget 和兄弟 widget 中的数据和方法。

在 initState 中使用BuildContext

在 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。