Search code examples
flutterflutter-futurebuilderflutter-future

Flutter futurebuilder nested futures returning null


I am trying to work with different user roles and after logging in they should be directed to different pages however the futurebuilder I am trying to use to do so returns null. The element.data['role'] is correct and is being printed out before the future is returned but is not returned to the 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");
        }
      },
    );
  }

Solution

  • Try to call return at all iterations and add a null (or other value) for handling situation where you are not returning a data:

    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;
        });
      });
    }