Flutter 获取某个widget的 context

在 Flutter 中获取一个Widget的context,可以使用BuildContext的ancestorWidgetOfExactType或ancestorStateOfType方法。

ancestorWidgetOfExactType方法接收一个泛型类型的TypeMatcher参数,返回指定类型的祖先Widget。如果找到了匹配的Widget,返回该Widget的BuildContext,否则返回null。

示例代码如下:

BuildContext context = context.ancestorWidgetOfExactType(MyWidget)?.context;


ancestorStateOfType方法接收一个泛型类型的TypeMatcher参数,返回指定类型的祖先State。如果找到了匹配的State,返回该State对象,否则返回null。

示例代码如下:

MyState state = context.ancestorStateOfType(TypeMatcher<MyState>());


需要注意的是,如果指定类型的Widget或State不是该BuildContext的祖先,则以上两个方法都会返回null。

另外,如果您要在build方法中获取context,需要确保获取的context是Widget的父级context,而不是当前build方法中的context。可以通过使用Builder组件来获取正确的context,示例代码如下:

class MyWidget extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Builder(

      builder: (BuildContext context) {

        return RaisedButton(

          onPressed: () {

            BuildContext parentContext = context; // 获取父级 context

          },

          child: Text('Get Parent Context'),

        );

      },

    );

  }

}


在上面的代码中,我们使用 Builder 组件包裹 RaisedButton,以获取 RaisedButton 父级的 context。


除了使用BuildContext的ancestorWidgetOfExactType或ancestorStateOfType方法之外,还可以在State对象中使用GlobalKey来获取BuildContext。

GlobalKey是一个可以跨组件获取State或BuildContext的全局键。使用GlobalKey可以在整个应用程序范围内查找Widget或State,而不仅限于BuildContext的祖先。

以下是一个示例代码,演示如何使用GlobalKey获取BuildContext:

class MyWidget extends StatefulWidget {

  @override

  _MyWidgetState createState() => _MyWidgetState();

}

class _MyWidgetState extends State<MyWidget> {

  final GlobalKey _key = GlobalKey(); // 定义 GlobalKey

  @override

  Widget build(BuildContext context) {

    return Container(

      key: _key, // 绑定 GlobalKey

      child: RaisedButton(

        onPressed: () {

          BuildContext context = _key.currentContext; // 获取 context

        },

        child: Text('Get Context'),

      ),

    );

  }

}

在上面的代码中,我们定义了一个GlobalKey对象_key,并在Container组件中绑定该对象。在RaisedButton的onPressed方法中,我们使用_key.currentContext来获取Container组件的BuildContext。

需要注意的是,如果GlobalKey对象所绑定的Widget在build方法中没有被创建,那么currentContext将会返回null。因此,在使用GlobalKey获取BuildContext时需要注意这一点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容