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 方法有关。您使用了 awaitthen,您不需要同时使用两者。

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