我对rest api
和flutter
有点陌生。我想用用户名和密码登录并获得令牌响应。如何从authorization
的文本字段中获取用户名和密码?我也不确定身份验证代码是否正确?
imports
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _HomePageState();
}
}
class _HomePageState extends State<HomePage> {
final usernameController = TextEditingController();
final passwordController = TextEditingController();
Future<String> authorization() async {
var request = http.MultipartRequest(
'POST', Uri.parse('url'));
request.fields.addAll({
'grant_type': 'info',
'client_id': 'info',
'username': username,
'password': password,
});
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
Map<String, dynamic> auth =
jsonDecode(await response.stream.bytesToString());
return auth['access_token'];
} else {
return "";
}
}
void _setText() {
setState(() {
username = usernameController.text;
password = passwordController.text;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Login'),
backgroundColor: Colors.green,
),
body: Column(
children: [
Padding(
child: TextField(
decoration: InputDecoration(labelText: 'username'),
controller: usernameController,
),
),
Padding(
child: TextField(
decoration: InputDecoration(labelText: 'password'),
controller: passwordController,
),
),
RaisedButton(
onPressed: _setText,
child: Text('Login'),
),
],
),
);
}
}
- 由于您使用的是TextEditingControllers,因此不必使用Strings来保存用户名和密码的值
这样更改它们:
TextEditingController usernameController = TextEditingController();
TextEditingController passwordController = TextEditingController();
然后,将您的API帖子更改为:
Future<String> authorization() async {
var request = http.MultipartRequest(
'POST', Uri.parse('url'));
request.fields.addAll({
'grant_type': 'info',
'client_id': 'info',
'username': usernameController.text, //notice you have to use .text
'password': passwordController.text, //notice you have to use .text
});
你的
onPressed
是这样的:RaisedButton( onPressed: () async { String token = await authorization(); print(token); //This will be your token. }, child: Text('Login'),),
你不再需要这个了:
//void _setText() { //setState(() { //username = usernameController.text; // password = passwordController.text; //}); //}
您应该更改一些方法,将参数提供给将调用API的函数authorization
:
// Add parameters
Future<String> authorization(username,password) async {
...
}
void _setText() {
// This will call your API with the form parameters
result = await authorization(usernameController.text, passwordController.text);
// result should have your token (= the response from the API)
}