2017-10-18 5 views
1

나는 밖으로 알 수없는 펄터를 시험해 보는 동안 문제를 보았습니다.흔들림 : 미래의 스냅 샷을 기반으로 조치를 취하십시오.

@override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
      title: new Text("Example Page"), 
     ), 
     body: new FutureBuilder(
      future: _exampleFuture, 
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) { 
       switch (snapshot.connectionState) { 
       case ConnectionState.waiting: return new Center(child: new CircularProgressIndicator(),); 
       default: 
        if(snapshot.hasError) { 
        return new Center(child: new Text('Error: ${snapshot.error}'),); 
        } 
        else { 
        return new Center(child: new Text("Result: ${snapshot.data}"),); 
        } 
       } 
      } 
     ) 
    ); 
    } 

지금의 미래는 사용자가 권한이없는 것을 나타내는, 401 오류와 함께 끝나는 HTTP 호출 가정하자 : 나는 생각하고 사건은 FutureBuilder 위젯 아래와 같이 있습니다. 이 시점에서 앱에 저장된 토큰을 지우고 로그인 페이지로 리디렉션하거나 앱을 다시 작성하고 싶습니다. 하지만 빌드 함수에서 그렇게하는 메서드를 호출 할 수 없습니다 및 build 호출되기 전에 미래 값을 반환 할 수 있으므로 didUpdateWidget() 호출 될 것이라고 생각하지 않습니다? 어쩌면 내가 완전히 잘못 접근하고 있지만, 펄터에서 이것을 할 수있는 방법이 있습니까?

+0

내 코드를 조금 쥐게 한 : 그럼 당신은 이런 FutureBuilder을 가질 수

_Request() async { var httpClinet = createHttpClient(); var response = await httpClinet.get( url, headers: {'Authorization': "Bearer $_currentUserToken"}); if (response.statusCode == 200) { var myRequest = JSON.decode(response.body); var myDesiredData; ///TODO: Some data conversions and data extraction return myDesiredData; } else { setState(() { _currentUserToken = null; }); return null; } } 

합니다. – aziza

답변

3

Async 방법에서 statusCode을 확인할 수 있으며 setState을 사용하여 statusCode 값을 기반으로 토큰 값을 지울 수 있습니다. 그렇지 않으면 연결이 허가되면 원하는 데이터를 반환하십시오. 이제 FutureBuilder에서 스냅 샷이 null인지 확인하여 SignIn() 페이지를 표시하십시오. 예를 들어

, HTTP 요청 같은 것을 보일 수 처리 당신의 방법

@override 
    Widget build(BuildContext context) { 
    return new FutureBuilder(future: _request(), 
     builder: (BuildContext context, AsyncSnapshot response) { 
      response.hasData==false? new SignIn(): new Scaffold(
      appBar: new AppBar(title: new Text("Future Builder"),), 
      body: new Center(
       child: new Text("Build your widgets"), 
      ), 
     ); 
    } 
    ); 
} 
+1

감사합니다. aziza. 그건 나에게 의미가있다. 나는 응답을 캐싱 했으므로'initState()'에서 미래 가치를 얻었을 것으로 생각한다. 그리고 그것은 내가 페이지로 돌아 가면 미래가 캐시에서 검색 될 때 스크린의 깜빡 거림을 제거하는 것처럼 보인다. 어쩌면 나는'FutureBuilder'에서 메소드를 호출하고 로직의 나머지 부분을 다시 생각해 볼 필요가 있습니다. – Brad

+0

도움이 되서 기쁘다. – aziza