首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Flutter如何在未经授权时重定向到登录

Flutter如何在未经授权时重定向到登录
EN

Stack Overflow用户
提问于 2019-03-08 06:26:32
回答 1查看 9.5K关注 0票数 8

我正在尝试重定向到登录,以防令牌在抖动中过期

正在尝试获取帖子:

代码语言:javascript
复制
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和捕获错误:

代码语言:javascript
复制
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?就像在代码示例的注释中提到的那样,上下文给了我“未定义的”。

这是否可能是我正在做的事情,或者我只是完全错误地处理了整个检查?

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 23:32:32

更新:added a package containing several guards like this

我使用了一个StreamBuilder来对更改做出反应,并且能够在我们还不知道用户是否连接时显示一个SplashScreen。

代码语言:javascript
复制
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更改屏幕:

代码语言:javascript
复制
return MaterialApp(
  // ...
  home: authGuard,
);

和我的auth类

代码语言:javascript
复制
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 {
    // ...
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55053803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档