'Pass user data to profile screen from firebase

I am tring to pas data to user profile screen from firebase i have got error Unhandled Exception: 'package:cloud_firestore/src/collection_reference.dart': Failed assertion: line 116 pos 14: 'path.isNotEmpty': a document path must be a non-empty string what do i need fix?

user prfile controller

lass ProfileController extends GetxController {
  final Rx<Map<String, dynamic>> _user = Rx<Map<String, dynamic>>({});
  Map<String, dynamic> get user => _user.value;

  Rx<String> _uid = ''.obs;
  updateUserID(String uid) {
    _uid.value = uid;
    getUserData();
  }

  void getUserData() async {
    print("HELLO");
    List<String> thumbnails = [];
    // var myVideos = await firestore
    //     .collection('videos')
    //     .where('uid', isEqualTo: "9GFyxV41rkd0Iu0oy1tctobVNk92")
    //     .get();
    //
    // for (int i = 0; i < myVideos.docs.length; i++) {
    //   thumbnails.add((myVideos.docs[i].data() as dynamic)['thumbnail']);
    // }

    DocumentSnapshot userDoc =
        await firestore.collection('users').doc(_uid.value).get();
    final userData = userDoc.data()! as dynamic;
    print(userData);
    String name = userData['name'];
    String profilePhoto = userData['profilePhoto'];
    int likes = 0;
    int followers = 0;
    int following = 0;
    bool isFollowing = false;

    // for (var item in myVideos.docs) {
    //   likes += (item.data()['likes'] as List).length;
    // }
    // var followerDoc = await firestore
    //     .collection('users')
    //     .doc(_uid.value)
    //     .collection('followers')
    //     .get();
    // var followingDoc = await firestore
    //     .collection('users')
    //     .doc(_uid.value)
    //     .collection('following')
    //     .get();
    // followers = followerDoc.docs.length;
    // following = followingDoc.docs.length;
    // firestore
    //     .collection('users')
    //     .doc(_uid.value)
    //     .collection('followers')
    //     .doc(authController.user.uid)
    //     .get()
    //     .then(
    //   (value) {
    //     if (value.exists) {
    //       isFollowing = true;
    //     } else {
    //       isFollowing = false;
    //     }
    //   },
    // );
    _user.value = {
      'followers': followers.toString(),
      'following': following.toString(),
      'isFollowing': isFollowing,
      'likes': likes.toString(),
      'profilePhoto': profilePhoto,
      'name': name,
      'thumbnails': thumbnails,
    };
    update();
  }

  followUser() async {
    var doc = await firestore
        .collection('users')
        .doc(_uid.value)
        .collection('followers')
        .doc(authController.user.uid)
        .get();

    if (!doc.exists) {
      await firestore
          .collection('users')
          .doc(_uid.value)
          .collection('followers')
          .doc(authController.user.uid)
          .set({});

      await firestore
          .collection('users')
          .doc(authController.user.uid)
          .collection('following')
          .doc(_uid.value)
          .set({});
      _user.value
          .update('followers', (value) => (int.parse(value) + 1).toString());
    } else {
      await firestore
          .collection('users')
          .doc(_uid.value)
          .collection('followers')
          .doc(authController.user.uid)
          .delete();

      await firestore
          .collection('users')
          .doc(authController.user.uid)
          .collection('following')
          .doc(_uid.value)
          .delete();
      _user.value
          .update('followers', (value) => (int.parse(value) - 1).toString());
    }
    _user.value.update('isFollowing', (value) => !value);
    update();
  }
}

auth Controller

class AuthController extends GetxController {
  static AuthController instance = Get.find(); //TODO 2

  var displayName = '';
  var displayPhoto = '';
  String myId = '';
  late Rx<User?> _user; //TODO 1
  User get user => _user.value!; //TODO 3

  Rx<File?>? pickedImageVal;
  File? get profilePhoto => pickedImageVal!.value;

  FirebaseAuth auth = FirebaseAuth.instance;
  User? get userProfile => auth.currentUser;

  var isSignedIn = false.obs;
  var _googleSignIn = GoogleSignIn();
  var googleAccount = Rx<GoogleSignInAccount?>(null);
  var firebaseStorage = FirebaseStorage.instance;
  var firestore = FirebaseFirestore.instance;

  // var authController = AuthController.instance;

  @override
  void onReady() {
    super.onReady();
    _user = Rx<User?>(firebaseAuth.currentUser);
    _user.bindStream(firebaseAuth.authStateChanges());
    ever(_user, _setInitialScreen);
  }

  _setInitialScreen(User? user) {
    if (user == null) {
      Get.offAll(OnboardingPage());
    } else {
      Get.offAll(const Home());
    }
  }

  @override
  void onInit() {
    displayName = userProfile != null ? userProfile!.displayName! : '';
    super.onInit();
  }

  void pickImage() async {
    final pickedImage =
        await ImagePicker().pickImage(source: ImageSource.gallery);
    if (pickedImage != null) {
      Get.snackbar(
          'プロファイル写真', 'You have successfully selected your profile picture!');
    }
    pickedImageVal = Rx<File?>(File(pickedImage!.path));
  }

  Future<String> _uploadToStorage(File image) async {
    Reference ref =
        firebaseStorage.ref().child('profilePics').child(auth.currentUser!.uid);

    UploadTask uploadTask = ref.putFile(image);
    TaskSnapshot snap = await uploadTask;
    String downloadUrl = await snap.ref.getDownloadURL();
    return downloadUrl;
  }

  void signUp(String name, String email, String password, File? image) async {
    try {
      await auth
          .createUserWithEmailAndPassword(email: email, password: password)
          .then((value) {
        displayName = name;
        auth.currentUser!.updateDisplayName(name);
      });

      isSignedIn = true.obs;
      String downloadUrl = await _uploadToStorage(profilePhoto!);
      model.UserM user = model.UserM(
        name: name,
        email: email,
        uid: auth.currentUser!.uid,
        profilePhoto: downloadUrl,
      );
      await firestore
          .collection('users')
          .doc(auth.currentUser!.uid)
          .set(user.toJson());

      update();
      Get.offAll(() => Root());
    } on FirebaseAuthException catch (e) {
      String title = e.code.replaceAll(RegExp('-'), ' ').capitalize!;
      String message = '';

      if (e.code == 'weak-password') {
        message = 'The password provided is too weak.';
      } else if (e.code == 'email-already-in-use') {
        message = ('The account already exists for that email.');
      } else {
        message = e.message.toString();
      }

      Get.snackbar(title, message,
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    } catch (e) {
      Get.snackbar('Error occured!', e.toString(),
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    }
  }

  void signIn(String email, String password) async {
    try {
      await auth
          .signInWithEmailAndPassword(email: email, password: password)
          .then((value) => displayName = userProfile!.displayName!);

      isSignedIn = true.obs;
      myId = userProfile!.uid; //TODO 4
      update();
      Get.offAll(() => Root());
    } on FirebaseAuthException catch (e) {
      String title = e.code.replaceAll(RegExp('-'), ' ').capitalize!;
      String message = '';

      if (e.code == 'wrong-password') {
        message = 'Invalid Password. Please try again!';
      } else if (e.code == 'user-not-found') {
        message =
            ('The account does not exists for $email. Create your account by signing up.');
      } else {
        message = e.message.toString();
      }

      Get.snackbar('ユーザー名が存在しません。', 'アカウントを作成してください。',
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    } catch (e) {
      //TODO; what is Get.snackbar.e.tostring(), means?
      Get.snackbar(
        'Error occured!',
        e.toString(),
        snackPosition: SnackPosition.BOTTOM,
        backgroundColor: kPrimaryColor,
        colorText: Colors.white,
      );
    }
  }

  void resetPassword(String email) async {
    try {
      await auth.sendPasswordResetEmail(email: email);
      Get.back();
    } on FirebaseAuthException catch (e) {
      String title = e.code.replaceAll(RegExp('-'), ' ').capitalize!;

      String message = '';

      if (e.code == 'user-not-found') {
        message =
            ('The account does not exists for $email. Create your account by signing up.');
      } else {
        message = e.message.toString();
      }

      Get.snackbar(title, message,
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    } catch (e) {
      Get.snackbar('Error occured!', e.toString(),
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    }
  }

  void signInWithGoogle() async {
    try {
      googleAccount.value = await _googleSignIn.signIn();
      print(googleAccount.value);
      displayName = googleAccount.value!.displayName!;
      displayPhoto = googleAccount.value!.photoUrl!;
      isSignedIn.value = true;
      update(); // <-- without this the isSignedin value is not updated.
    } catch (e) {
      Get.snackbar('Error occured!', e.toString(),
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    }
  }

  void signout() async {
    try {
      await auth.signOut();
      await _googleSignIn.signOut();
      displayName = '';
      isSignedIn.value = false;
      update();
      Get.offAll(() => Root());
    } catch (e) {
      Get.snackbar('Error occured!', e.toString(),
          snackPosition: SnackPosition.BOTTOM,
          backgroundColor: kPrimaryColor,
          colorText: Colors.white);
    }
  }
}

//
// extension StringExtention on String{
//   String capitalizedString(){
//     return'${this[0].toUpperCase()}${this.substring(1)}';
//   }
// }

user profile screen

class ProfileScreen extends StatefulWidget {
  final String uid;

  ProfileScreen({Key? key, required this.uid}) : super(key: key);

  @override
  State<ProfileScreen> createState() => _ProfileScreenState();
}

class _ProfileScreenState extends State<ProfileScreen> {
  final ProfileController profileController = Get.put(ProfileController());

  @override
  void initState() {
    super.initState();
    profileController.updateUserID(widget.uid);
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<ProfileController>(
        init: ProfileController(),
        builder: (controller) {
          // if (controller.user.isEmpty) {
          //   return Center(
          //     child: CircularProgressIndicator(),
          //   );
          // }
          print(controller.user);
          return Scaffold(
            appBar: AppBar(
              backgroundColor: Colors.black12,
              leading: Icon(Icons.person_add_alt_1_outlined),
              actions: [
                Icon(Icons.more_horiz),
              ],
              title: Text(controller.user['name'].toString()),
            ),
            body: SafeArea(
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    Column(
                      children: [
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            ClipOval(
                              child: CachedNetworkImage(
                                  fit: BoxFit.cover,
                                  imageUrl: controller.user['profilePhoto']
                                      .toString(),
                                  height: 100,
                                  width: 100,
                                  placeholder: (context, url) =>
                                      CircularProgressIndicator(),
                                  errorWidget: (context, url, error) =>
                                      Icon(Icons.error)),
                            )
                          ],
                        ),
                        SizedBox(
                          height: 15,
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Column(
                              children: [
                                Text(controller.user['following'].toString()),
                                SizedBox(
                                  height: 5,
                                ),
                                Text('following'),
                              ],
                            ),
                            Container(
                              color: Colors.black54,
                              width: 1,
                              height: 15,
                              margin: EdgeInsets.symmetric(horizontal: 15),
                            ),
                            Column(
                              children: [
                                Text(controller.user['followers'].toString()),
                                SizedBox(
                                  height: 5,
                                ),
                                Text('follower'),
                              ],
                            ),
                            Container(
                              color: Colors.black54,
                              width: 1,
                              height: 15,
                              margin: EdgeInsets.symmetric(horizontal: 15),
                            ),
                            Column(
                              children: [
                                Text(controller.user['likes'].toString()),
                                SizedBox(
                                  height: 5,
                                ),
                                Text('likes'),
                              ],
                            )
                          ],
                        ),
                        SizedBox(
                          height: 15,
                        ),
                        Container(
                          width: 140,
                          height: 47,
                          decoration: BoxDecoration(
                            border: Border.all(
                              color: Colors.black12,
                            ),
                          ),
                          child: Center(
                            child: InkWell(
                              onTap: () {
                                // if (widget.uid == authController.user.uid) {
                                //   authController.signOut();
                                // } else {
                                //  controller.followUser();
                              },
                              // },
                              child: const Text(
                                "",
                                // widget.uid == authController.user.uid
                                //     ? 'sign out'

                                // controller.user['isFollowing']
                                //     ? 'unfollow'
                                //     : 'follow',
                              ),
                            ),
                          ),
                        ),


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source