【问题标题】:How to use Future<bool> in Widget如何在 Widget 中使用 Future<bool>
【发布时间】:2020-01-16 12:05:08
【问题描述】:

我的 Provider Repository 中有一个 Future 函数。但是它是Future&lt;bool&gt;,因为我需要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 build(BuildContext context) {
    var user = Provider.of<UserRepository>(context);
    if(user.hasCard())
    {
      //do something
    }

但我收到一条错误消息:

条件必须有一个静态类型'bool'.dart(non_bool_condition)

因为它是Widget 类型,所以我不能在这里使用async。有什么办法可以解决这个问题?

【问题讨论】:

  • 你应该使用futurebuilder,在等待数据时你可以显示一个progresshud

标签: flutter dart


【解决方案1】:

您可以使用FutureBuilder,它将根据future 的值构建小部件,在future 完成之前,该值将为空。这是一个例子。

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

【讨论】:

    【解决方案2】:

    不仅Future&lt;bool&gt; 用于任何其他未来,您还可以使用FutureBuilder,其中未来是返回未来类型的内容,快照是从中接收到的数据。

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

    我建议为您的布尔值分配一个默认值。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2021-07-06
      • 2020-07-04
      • 1970-01-01
      • 2021-01-29
      相关资源
      最近更新 更多