如何在Flutter中调用Future <string> rest api?

时间:2018-09-06 07:54:30

标签: request flutter

如何调用未来 API?这是我的API代码

class ApiClient{

  Future<String> getPasswordToken(String username, String password) async {
    var response =
        await http.post(Uri.parse(this.apiBaseUrl + "/auth/token"), headers: {
      "Accept": "application/json"
    }, body: {
      "username": username,
      "password": password
    });

    if (response.statusCode == 200) {
      var token = OAuthToken.fromJson(json.jsonDecode(response.body));
      return token.accessToken;
    } else {
      throw Exception('Failed to fetch access token');
    }
  }
}

并且正在使用以下容器来调用API。根据API响应的需要导航到另一个屏幕,我在 onPressed

中点击了调用API
var apiClient = new ApiClient();
Container(
      margin: const EdgeInsets.only(top: 20.0),
      padding: const EdgeInsets.only(left: 20.0, right: 20.0),
      child: new Row(
        children: <Widget>[
          new Expanded(
            child: FlatButton(
              shape: new RoundedRectangleBorder(
                  borderRadius: new BorderRadius.circular(28.0)),
              splashColor: this.primaryColor,
              color: this.primaryColor,
              child: new Row(
                children: <Widget>[
                  new Padding(
                    padding: const EdgeInsets.only(left: 20.0),
                    child: Text(
                      "LOGIN",
                      style: TextStyle(color: Colors.white),
                    ),

                  ),

                 new Expanded(
                    child: Container(),
                  ),
                  new Transform.translate(
                    offset: Offset(15.0, 0.0),
                    child: new Container(
                      padding: const EdgeInsets.all(5.0),
                      child: FlatButton(
                        shape: new RoundedRectangleBorder(
                            borderRadius: new BorderRadius.circular(28.0)),
                        splashColor: Colors.white,
                        color: Colors.white,
                        child: Icon(
                          Icons.arrow_forward,
                          color: this.primaryColor,
                        ),
                      onPressed: apiClient.getPasswordToken("",""),

                  /*        child:new FutureBuilder(future: apiClient.getClientToken(),
                            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"),
                                ),
                              );
                            }
                        );*/
                      ),
                    ),
                  )
                ],
              ),
              onPressed: () => {},
              //onPressed: apiClient.getPasswordToken(emailInputField.key,emailInputField.key),
            ),
          ),
        ],
      ),
    );

我尝试了上面的代码。它显示不能将参数类型'Future'分配给参数类型'()→void

2 个答案:

答案 0 :(得分:1)

这应该做您想要的:

onPressed: () => apiClient.getPasswordToken("",""),

onPressed: () async {
  var result = await apiClient.getPasswordToken("","");
  print(result);
  setState(() => this.foo = result); // you can omit `this.` it's just for demonstration purposes that this line would modify the widgets state
}

答案 1 :(得分:0)

所在行

onPressed: apiClient.getPasswordToken("",""),

您正在传递Future(这是getPasswordToken返回给onPressed的返回值,该返回值需要一个函数。

您应该这样做

onPressed: () => apiClient.getPasswordToken("",""),

onPressed: () {
  apiClient.getPasswordToken("","");
}