【问题标题】:Flutter futurebuilder nested futures returning nullFlutter futurebuilder嵌套期货返回null
【发布时间】:2021-05-04 08:51:43
【问题描述】:

我正在尝试使用不同的用户角色,登录后他们应该被定向到不同的页面,但是我尝试使用的 futurebuilder 会返回 null。 element.data['role'] 是正确的,在future返回之前被打印出来但没有返回futurebuilder。

Future<String> getUserRole() async {
    final result = await FirebaseAuth.instance.currentUser().then(
      (user) async {
        await Firestore.instance.collection("Users").getDocuments().then(
          (docs) {
            docs.documents.forEach((element) {
              print(element.documentID);
              print(user.uid);
              if (element.documentID == user.uid) {
                print(element.data['role']);
                return element.data['role'];
              }
            });
          },
        );
      },
    );
    return result;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: getUserRole(),
      builder: (ctx, AsyncSnapshot<String> futureResult) {
        if (futureResult.connectionState == ConnectionState.waiting) {
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        } else if (futureResult.hasError) {
          Center(
            child: Text("Error"),
          );
        } else if (futureResult.hasData) {
          print("BUILDER");
          print(futureResult.data);
          if (futureResult.data == "Employer") {
            return EmployerTabsScreen();
          } else {
            return EmployeeTabsScreen();
          }
        } else {
          return Text("NONE");
        }
      },
    );
  }

【问题讨论】:

    标签: flutter flutter-futurebuilder flutter-future


    【解决方案1】:

    尝试在所有迭代中调用 return 并添加 null(或其他值)以处理您不返回数据的情况:

    Future<String> getUserRole() {
      return FirebaseAuth.instance.currentUser().then((user) {
        return Firestore.instance.collection("Users").getDocuments().then((docs) {
          var role = null;
          docs.documents.forEach((element) {
            print(element.documentID);
            print(user.uid);
            if (element.documentID == user.uid) {
              print(element.data['role']);
              role = element.data['role'];
            }
          });
          return role;
        });
      });
    }
    

    【讨论】:

      【解决方案2】:

      因为您将“async/await”与“then”回调随机混合。 猜猜这样做并没有错,但是就像在您的示例中一样,它完全不可读,并且使一切变得比想象的更难。

      起初:

          final result = await FirebaseAuth.instance.currentUser().then(
            (user) async {
      

      如果您将某些内容声明为“等待”,则不需要回调。您应该声明结果正确。如果你想对结果做一些事情,也可以将新请求作为等待。而已。如果您有此响应,请接受它并使用 lambda 或 foreach 它。 最后一步是,检查你得到的东西并归还它。 当你做出“承诺”(用 javascript 表示)时,“等待”某事是没有意义的

      【讨论】:

        猜你喜欢
        • 2020-07-10
        • 2019-03-21
        • 1970-01-01
        • 2021-10-08
        • 2021-02-04
        • 2020-03-08
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多