有时,在网络工具类中,要对数据做弹框,或对没有登录的 api 做跳转登录页面时,需要用到 context。但在这些类中,又没有 context。这时,就需要一个全局的 context 了,在任意地方跳转界面。
什么是 Context?
build 方法有一个 context 参数,它是 BuildContext 类的一个实例,表示当前 widget 在 widget 树中的上下文,每一个 widget 都会对应一个 context 对象(因为每一个 widget都是 widget 树上的一个节点)。实际上, context 是当前 widget 在 widget 树中位置中执行”相关操作“的一个句柄,比如它提供了从当前 widget 开始向上遍历 widget 树以及按照 widget 类型查找父级 widget 的方法。
全局取得 Context
可以通过 navigatorKey 的方式
首先我们进入 Navigator.of(context) 这个方法,发现这个方法返回了一个 NavigatorState 对象,即 Navigator 对象的 state。
static NavigatorState of(
BuildContext context, {
bool rootNavigator = false,
bool nullOk = false,
})
然后在 MaterialApp 有一个 navigatorKey 属性,所以如下取得。
入口文件 main 文件
void main() {
runApp(MyApp());
}
// 定义全局 navigatorKey
class NavKey{
static final navKey = new GlobalKey<NavigatorState>();
}
// 配置 MaterialApp 的 navigatorKey
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
);
}
应用
1.Navigator 跳转
// 引用之前的定义
import 'package:smarthome/main.dart';
navigatorKey.currentState.pushName('/');
2.获取 context
BuildContext context = navigatorKey.currentState.overlay.context
注意 通过这种方式获取的 context 在某些情况下需要放在以下代码内使用
Future.delayed(Duration(seconds:0)).then((onValue) {
});
网友评论