본문 바로가기

개발하자

권한이 없는 경우 로그인으로 리디렉션하는 방법

반응형

권한이 없는 경우 로그인으로 리디렉션하는 방법

플러터에서 토큰이 만료된 경우 로그인으로 리디렉션하려고 합니다

게시물을 가져오는 중:

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
        }
    )
)

게시물을 받고 오류를 파악합니다:

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으로 다시 리디렉션할 수 있는 방법은 무엇입니까? 코드 예시의 코멘트에서 언급된 것처럼, 문맥은 나에게 "정의되지 않은" 것을 준다.

제가 하는 방식으로 가능한 건가요, 아니면 단순히 전체 수표를 완전히 잘못 처리하고 있는 건가요?




나는 사용자가 연결되어 있는지 모를 때 변경 시 반응하고 로딩 화면을 표시할 수 있도록 하기 위해 그것을 했다.

StreamBuilder authGuard = StreamBuilder(
  stream: Auth.authState$,
  builder: (context, snapshot) {
    switch (snapshot.data) {
      case AuthState.PENDING:
        return LoadingScreen();
      case AuthState.UNAUTHENTICATED:
        return SignInScreen();
      case AuthState.AUTHENTICATED:
        return HomeScreen();
      default:
        return LoadingScreen();
    }
  },
);

따라서 AuthState에 따라 화면이 바뀝니다:

return MaterialApp(
  // ...
  home: authGuard,
);



코드는 단일 공명성을 가져야 한다. 당신의 방법은 두 가지 일을 동시에 하고 있습니다. 게시물을 성공적으로 얻거나 예외를 던지도록 이 기능을 중단해야 합니다. 그러면 발신자가 예외를 처리하게 됩니다. 호출자는 메소드 내에 있어야 하는데, 메소드만이 이와 같은 것을 가지고 있기 때문이다:

      if (response.body.toString().contains('Token is Expired')) {
        throw new Exception("Token is Expired") // you may want to implement different exception class
      }
      body: new Container(
        padding: new EdgeInsets.only(bottom: 8.0),
        color: Color(0xff2c3e4e),
        child: FutureBuilder<List<Post>>(
            future: api.getposts(),
            builder: (context, snapshot) {
              if (snapshot.hasError) {
                // you might want to handle different exception, such as token expires, no network, server down, etc.
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => LoginScreen()),
                );
                return Container(); // return empty widget
              }
              if (snapshot.hasData) {
                // do somthing with data
                return Text('Some data here');
              }
              // has no data
              return Text("Loading...");

            }),
      ),

갱신하다

@Truong Sinh 덕분에 알게 됐어요.

그의 예를 따라 작동하는 빌드 네비게이터 방법을 알아냈습니다:

if (snapshot.hasError) {

              @override
              void run() {
                scheduleMicrotask(() {

                  Navigator.pushReplacement(
                    context,
                    MaterialPageRoute(builder: (context) => LoginScreen()),
                  );
                });
              }
              run();
}

반응형