我正在尝试重定向到登录,以防令牌在抖动中过期
正在尝试获取帖子:
body: new Container(
padding: new EdgeInsets.only(bottom: 8.0),
color: Color(0xff2c3e4e),
child: FutureBuilder<List<Post>>(
future: api.getposts(),
builder: (context, snapshot) {
// doing stuff with response
}
)
)
getposts和捕获错误:
Future<List<Post>> getposts() async {
url = 'url';
var response = await http.get(url,
headers: {HttpHeaders.authorizationHeader: 'bearer ' + token},
);
//part I can't understand how to get to work, how do I push? This gives error about context not being defined.
if (response.body.toString().contains('Token is Expired')) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
LoginScreen()),
);
}
}
因此,问题是,在这种情况下,我如何正确使用导航器,并且在令牌已过期并需要续订的情况下,我可以重定向回loginScreen?就像在代码示例的注释中提到的那样,上下文给了我“未定义的”。
这是否可能是我正在做的事情,或者我只是完全错误地处理了整个检查?
发布于 2020-07-29 23:32:32
更新:added a package containing several guards like this
我使用了一个StreamBuilder
来对更改做出反应,并且能够在我们还不知道用户是否连接时显示一个SplashScreen。
StreamBuilder authGuard = StreamBuilder(
stream: Auth.authState$,
builder: (context, snapshot) {
switch (snapshot.data) {
case AuthState.PENDING:
return SplashScreen();
case AuthState.UNAUTHENTICATED:
return SignInScreen();
case AuthState.AUTHENTICATED:
return HomeScreen();
default:
return SplashScreen();
}
},
);
因此,它将根据AuthState更改屏幕:
return MaterialApp(
// ...
home: authGuard,
);
和我的auth类
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:rxdart/rxdart.dart';
enum AuthState { PENDING, AUTHENTICATED, UNAUTHENTICATED }
class Auth {
static final FirebaseAuth _auth = FirebaseAuth.instance;
static final GoogleSignIn _googleSignIn = GoogleSignIn();
static Stream<AuthState> authState$ = FirebaseAuth.instance.onAuthStateChanged
.map((state) =>
state != null ? AuthState.AUTHENTICATED : AuthState.UNAUTHENTICATED)
.startWith(AuthState.PENDING);
static Future<FirebaseUser> signInWithGoogle() async {
// ...
}
}
https://stackoverflow.com/questions/55053803
复制相似问题