繁体   English   中英

我该如何呼唤未来<string>在颤动中休息 api?

[英]How can i call the Future<string> rest api in flutter?

如何调用Future 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

这应该做你想做的:

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
}

你所在的那条线

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

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

你应该做

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

或者

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM