2017-10-18 74 views
1

我试过Flutter时遇到了一个问题,我无法弄清楚。我想的情况下,有一个FutureBuilder插件象下面这样:颤振:根据未来的快照采取行动

@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}"),); 
        } 
       } 
      } 
     ) 
    ); 
    } 

现在让我们假设未来是一个HTTP调用401错误结束,指示用户未经批准。此时,我希望应用程序清除存储并重定向到登录页面的任何令牌或重新构建应用程序。但我不能调用一个方法,在构建函数中这样做,我不认为didUpdateWidget()保证被调用,因为在调用build之前未来可能会返回它的值?也许我正在接近这个完全错误的,但有没有办法在Flutter中做到这一点?

+0

我已经调整了我的代码一点点。 – aziza

回答

3

您可以检查一个statusCodeAsync方法内,并使用setState抹去基础上,statusCode值令牌的值;否则,如果连接被授权,则返回您所需的数据。现在,在您的FutureBuilder中,检查您的快照是否为空,以显示SignIn()页面。

例如,你的方法处理HTTP请求可能看起来像:

_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; 

     } 
} 

然后你就可以有这样的FutureBuilder:

@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