skip to Main Content

am developing a flutter application with firestore. in firestore I have a field called role and I managed to access it in my code. The role is printed correctly in the console.But I need help in displaying differnt page for each user.

`

class _UserMangmentState extends State<UserMangment> {
  String role = "";
  @override
  void initState() {
    getRole();
    super.initState();
  }

  Future getRole() async {
    String id = FirebaseAuth.instance.currentUser!.uid.toString();
    FirebaseFirestore.instance
        .collection('users')
        .doc(id)
        .get()
        .then((DocumentSnapshot doc) {
      role = doc.get('role');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder(
          builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Container();
        } else {
          getRole();
          if (role == "vendor") {
            return VendorInformation();
          } else if (role == "planner") {
            return PlannerPage();
          } else {
            return HomePage();
          }
        }
      }),
    );
  }
}

`

2

Answers


  1. You are trying to changing the role value without using setState the value of role never changed

    class _UserMangmentState extends State<UserMangment> {
      String role = "";
      @override
      void initState() {
        getRole();
        super.initState();
      }
    
      Future getRole() async {
        String id = FirebaseAuth.instance.currentUser!.uid.toString();
        FirebaseFirestore.instance
            .collection('users')
            .doc(id)
            .get()
            .then((DocumentSnapshot doc) {
             setState(){
             role = doc.get('role');
            };
    
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: FutureBuilder(
              builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              getRole();
              if (role == "vendor") {
                return VendorInformation();
              } else if (role == "planner") {
                return PlannerPage();
              } else {
                return HomePage();
              }
            }else{
    return Container();}
          }),
        );
      }
    }
    
    Login or Signup to reply.
  2. Your approach isn’t optimal. You can try this. Hope it helps

    class UserManager extends StatelessWidget {
      UserManager({Key? key}) : super(key: key);
    
      final firebaseAuthUser = FirebaseAuth.instance.currentUser;
      
      Future<DocumentSnapshot<Map<String, dynamic>>?> getRole() async {
        final id = firebaseAuthUser?.uid;
        if (id == null) {
          return null;
        }
        return FirebaseFirestore.instance.collection('users').doc(id).get();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: FutureBuilder<DocumentSnapshot<Map<String, dynamic>>?>(
              future: getRole(),
              builder: (BuildContext context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting && snapshot.data == null) {
                  return const Center(child: CircularProgressIndicator());
                }
    
                if (snapshot.connectionState == ConnectionState.done && snapshot.data == null) {
                  return const Center(child: Text('No data'));
                }
    
                final role = snapshot.data?.data()?['role'];
    
                if (role == null) {
                  return const Center(child: Text('No role found'));
                }
    
                switch (role) {
                  case 'vendor':
                    return VendorInformation();
                  case 'planner':
                    return PlannerPage();
                  default:
                    return HomePage();
                }
              }),
        );
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search