flutterdart

Future not waiting to resolve before next then Flutter Dart


I'm trying to return a list of values. Assessing by using Late

late List userLikes = userListLikes.getUsersLikes();

My Code:

class GetUserLikes {

  final FirebaseFirestore _firestore = FirebaseFirestore.instance;
  final user = FirebaseAuth.instance.currentUser!;

    List getUsersLikes()  {
    
    try {

      print('start');
      final docRef = _firestore.collection("user_details").doc(user.uid);
      docRef.get().then((DocumentSnapshot doc) async {
          final data = doc.data() as Map<String, dynamic>;
          print("data[user_likes]");
          print(data['user_likes']);
          print('end');
          return await data['user_likes']; // → not awaiting
        },
        onError: (e) => print("Error getting document: $e"),
      );
    } catch (err) {
      print('There was an error');
    }
    return ['Nothing Returned'];
  }

}

The function is not completing and returns before the await has finished which is not the array I need.

start
[Nothing Returned] (Returns without completing)
data[user_likes]
[967, 769, 887, 820, 860, 833, 857, 1017] → The Array I want returned
end

Solution

  • This gets an Array field from a Firestone database and then returns a list dynamic:

    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    
    class GetUserLikes {
      final FirebaseFirestore _firestore = FirebaseFirestore.instance;
      final user = FirebaseAuth.instance.currentUser!;
    
    
      Future<List> getUsersLikes() async {
        // Get the list of user likes from the Firestone Database and then
        // return the list so it will only show the users likes on the profile page.
        try {
          final docRef = _firestore.collection("user_details").doc(user.uid);
          DocumentSnapshot doc = await docRef.get(); // Await
          final data = doc.data() as Map<String, dynamic>;
          return data['user_likes'];
        } catch (err) {
          print('There was an error');
        }
        return ['Nothing Returned'];
      }
    
      Future<List> getLikes() async {
        // Takes the Future<List> and turns it into a List<dynamic>
        Future<List> userLikes = getUsersLikes();
        List list = await userLikes;
        return list; // Returns List<dynamic>
      }
    }
    

    Then on the receiving Future builder it will have to be awaited:

     GetUserLikes userLikesList = GetUserLikes();
     List userLikes = await userLikesList.getLikes();