前言
开发过程中遇到了一个问题,需要在网络请求拦截器中统一处理登录失效的错误码,给出提示后跳转到登录页面让用户重新去登录,于是开始写Navigator.of(context)???context这里报红的时候就意识到问题不对了,我在网络请求处理类里,根本不知道当前界面是什么,哪来的context,于是开始寻找之路。
任意地方跳转界面解决
首先点进了Navigator.of(context)这个方法,发现这个方法返回了一个NavigatorState对象,即Navigator对象的state。
static NavigatorState of(
BuildContext context, {
bool rootNavigator = false,
bool nullOk = false,
})
想起了MaterialApp的navigatorKey属性,于是解决方案出来了:
1、定义NavigatorState的GlobalKey
static GlobalKey<NavigatorState> navigatorState = new GlobalKey();
2、将这个key传给MaterialApp的navigatorKey属性。
MaterialApp(
navigatorKey: navigatorState,
);
3、在需要跳转的地方调用navigatorState.currentState获取到NavigatorState进行界面跳转即可。
Flutter全局Context
虽然解决了问题,但是是通过跳过context获取NavigatorState解决的,做Android开发的都知道,我们可以在application中使用getApplicationContext()方法来获取全局的context,那么怎么在Flutter中获取全局context呢?
Flutter的中的widget是以Widget树形式存在的,能拿到顶层树的context,不就可以了么。实现:
1、定义 static BuildContext appContext;
2、将主页最外层context赋值给appContext。
3、在需要的地方使用即可。