dart 如何< bool>在Widget中使用Future

s71maibg  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(171)

我在我的提供者仓库中有一个Future函数。但是它是Future<bool>,因为我需要async来进行http请求。

Future<bool> hasCard() async {
    String token = await getToken();
    var body = jsonEncode({"token": token, "userID": user.getUserID()});

    var res = await http.post((baseUrl + "/hasCard"), body: body, headers: {
      "Accept": "application/json",
      "content-type": "application/json"
    });

    print(res.toString());

    if (res.statusCode == 200) {
      this.paymentModel = PaymentModel.fromJson(json.decode(res.body));
      return true;
    }
    return false;
  }

在我的Widget中,我想检查这个值:

Widget build(BuildContext context) {
    var user = Provider.of<UserRepository>(context);
    if(user.hasCard())
    {
      //do something
    }

但我得到一个错误消息:
条件必须具有静态类型'bool'. dart(non_bool_condition)
因为它是Widget类型,我不能在这里使用async。有什么方法可以解决这个问题?

63lcw9qa

63lcw9qa1#

你可以使用一个FutureBuilder,它会根据future的值来构建widget,在future完成之前,这个值将为null。下面是一个例子。

FutureBuilder(
  future: hasCard(),
  builder: (context, snapshot) {
    if (snapshot.data == null)
      return Container(
          width: 20,
          height: 20,
          child: CircularProgressIndicator());
    if (snapshot.hasData) // something has returned
      return Icon(
        Icons.check,
        color: Colors.green,
      );
    else
      return Icon(
        Icons.cancel,
        color: Colors.red,
      );
  },
)
g6baxovj

g6baxovj2#

好吧,不仅仅是Future<bool>,对于任何其他未来,你都可以使用FutureBuilder,其中未来是返回你未来的类型,快照是从它接收的数据。

FutureBuilder(
      future: hasCard(),
      builder: (context, snapshot) {
        if (snapshot.data != null){
          print(snapshot.data)}
        else{
         print("returned data is null!")}  
      },
    )

我建议给你的bool赋值一个默认值。
祝你好运!

相关问题