Flutter - 使用 .then()、Provider.of() 和 Navigator 重定向到新屏幕
Flutter - redirect to new screen using .then(), Provider.of(), and Navigator
我有一个按钮,初始 click/tap/touch,它 POST 到 API 和 return 基于身份验证的真假。
onPressed: ()=>{
Provider.of<Login>(context, listen: false).login()
.then((value) => {
if(value == true)
Navigator.pushReplacementNamed(context, '/home')
}),
},
Future<bool> login() async {
try{
var payload = jsonEncode({
'email': usrname,
'password': pswd
});
Map<String,dynamic> response = await fetch.post(url, body:payload, headers: {
'Accept':'application/json',
'content-type': 'application/json'
})
.then((value) => jsonDecode(value.body));
if(response['token'] != ''){
return true;
}
}
catch(e){
errorMsg = e.toString();
notifyListeners();
return false;
}
return false;
}
身份验证成功后,它不会按预期重定向到新屏幕。我是不是遗漏了什么或者我的逻辑有问题?
await
旨在中断流程,直到 async
方法完成。然而,then
不会中断流程(意味着将执行下一条指令),但允许您在异步方法完成时 运行 编写代码。
在您的代码中:
问题与您的 login
方法有关。您使用了 await
和 then
,您不需要同时使用两者。
Future<bool> login() async {
try{
var payload = jsonEncode({
'email': usrname,
'password': pswd
});
Map<String,dynamic> response = await fetch.post(url, body:payload, headers: {
'Accept':'application/json',
'content-type': 'application/json'
});
var decodedResponse = jsonDecode(response.body);
if(decodedResponse['token'] != ''){
return true;
}
}
catch(e){
errorMsg = e.toString();
notifyListeners();
return false;
}
return false;
}
您可以在 SO 问题中找到更多示例:
- Future<void>, async, await, then, catchError in Flutter/Dart
我有一个按钮,初始 click/tap/touch,它 POST 到 API 和 return 基于身份验证的真假。
onPressed: ()=>{ Provider.of<Login>(context, listen: false).login() .then((value) => { if(value == true) Navigator.pushReplacementNamed(context, '/home') }), },
Future<bool> login() async { try{ var payload = jsonEncode({ 'email': usrname, 'password': pswd }); Map<String,dynamic> response = await fetch.post(url, body:payload, headers: { 'Accept':'application/json', 'content-type': 'application/json' }) .then((value) => jsonDecode(value.body)); if(response['token'] != ''){ return true; } } catch(e){ errorMsg = e.toString(); notifyListeners(); return false; } return false; }
身份验证成功后,它不会按预期重定向到新屏幕。我是不是遗漏了什么或者我的逻辑有问题?
await
旨在中断流程,直到 async
方法完成。然而,then
不会中断流程(意味着将执行下一条指令),但允许您在异步方法完成时 运行 编写代码。
在您的代码中:
问题与您的 login
方法有关。您使用了 await
和 then
,您不需要同时使用两者。
Future<bool> login() async {
try{
var payload = jsonEncode({
'email': usrname,
'password': pswd
});
Map<String,dynamic> response = await fetch.post(url, body:payload, headers: {
'Accept':'application/json',
'content-type': 'application/json'
});
var decodedResponse = jsonDecode(response.body);
if(decodedResponse['token'] != ''){
return true;
}
}
catch(e){
errorMsg = e.toString();
notifyListeners();
return false;
}
return false;
}
您可以在 SO 问题中找到更多示例:
- Future<void>, async, await, then, catchError in Flutter/Dart