Home > database >  Firebase stream returns empty list
Firebase stream returns empty list

Time:10-05

In my firestore db I have a collection of users and within that a collection of arrays. I am able to successfully add a new array to the collection of arrays but the problem is in my ArrayController, the Firestore Stream returns an empty list even though there are docs within the collection. What I want is to display the Arrays in a listview.

ArrayController

class ArrayController extends GetxController {
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  late CollectionReference collectionReference;

  RxList<ArrayModel> arrays = RxList<ArrayModel>([]);

  @override
  void onInit() {
    super.onInit();
    String uid = Get.find<AuthController>().user!.uid;
    collectionReference =
        _firestore.collection("users").doc(uid).collection("arrays");
    arrays.bindStream(getAllArrays()); // empty list
  }

  Stream<List<ArrayModel>> getAllArrays() {
    return collectionReference.snapshots().map(
        (query) => query.docs.map((item) => ArrayModel.fromMap(item)).toList());
  }
}

ArrayModel

class ArrayModel {
  String? title;
  String? id;
  List<Todo>? todos;
  Timestamp? dateCreated;

  ArrayModel({this.title, this.id, this.todos, this.dateCreated});

  ArrayModel.fromMap(DocumentSnapshot doc) {
    title = doc["title"];
    id = doc.id;
    todos = doc["todos"];
    dateCreated = doc["dateCreated"];
  }
}

ListView

GetX<ArrayController>(
                            init: Get.put<ArrayController>(ArrayController()),
                            builder: (ArrayController arrayController) {
                              return ListView.separated(
                                  itemBuilder: (context, index) =>
                                      GestureDetector(
                                        onLongPress: () {
                                          Navigator.of(context).push(
                                              Routes.routeToArrayScreenIndex(
                                                  index));
                                        },
                                        onTap: () {
                                          Navigator.of(context).push(
                                              Routes.routeToHomeScreen(index));
                                        },
                                        child: Dismissible(
                                          key: UniqueKey(),
                                          onDismissed: (_) {
                                            HapticFeedback.heavyImpact();
                                            Database().deleteArray(
                                                uid,
                                                arrayController
                                                        .arrays[index].id ??
                                                    '');
                                          },
                                          child: Container(
                                            child: Padding(
                                              padding: const EdgeInsets.only(
                                                  right: 25.0),
                                              child: Row(
                                                mainAxisAlignment:
                                                    MainAxisAlignment
                                                        .spaceBetween,
                                                children: [
                                                  Padding(
                                                    padding:
                                                        const EdgeInsets.only(
                                                            left: 20.0),
                                                    child: Text(
                                                      arrayController
                                                              .arrays[index]
                                                              .title ??
                                                          '',
                                                      style:
                                                          GoogleFonts.notoSans(
                                                              color:
                                                                  Colors.white,
                                                              fontSize: 25.0),
                                                    ),
                                                  ),
                                                  Padding(
                                                    padding:
                                                        const EdgeInsets.only(
                                                            left: 20.0),
                                                    child: Text(
                                                      '0',
                                                      style:
                                                          GoogleFonts.notoSans(
                                                              color:
                                                                  primaryColor,
                                                              fontSize: 27.0),
                                                    ),
                                                  ),
                                                ],
                                              ),
                                            ),
                                          ),
                                        ),
                                      ),
                                  separatorBuilder: (_, __) => const SizedBox(
                                        height: 15.0,
                                      ),
                                  itemCount: arrayController.arrays.length);
                            })

CodePudding user response:

Remove init: Get.put<ArrayController>(ArrayController())

Also, if you are trying to access the current logged in user, do this:

Stream<List<ArrayModel>> getAllArrays() {
String uid =  FirebaseAuth.instance.currentUser.uid; // i think you can declare this outside the scope
    return  _firestore.collection("users").doc(uid).collection("arrays").snapshots().map(
        (query) => query.docs.map((item) => ArrayModel.fromMap(item)).toList());
  }

Could you check your fields for bad state element does not exist:

ArrayModel.fromMap(DocumentSnapshot doc) {
    title = doc["title"]; //check for bad state on your fields
    id = doc.id;
    todos = doc["todos"];
    dateCreated = doc["dateCreated"];
  }

Also try this:

class GlobalBindings implements Bindings {
  @override
  void dependencies() {
    Get.put<ArrayController>(ArrayController());
    //Include your other controllers here
 }
}
//Set it in your main
void main() async {
  WidgetsFlutterBinding.ensureInitialized(); 
  await Firebase.initializeApp();  
  GlobalBindings().dependencies();
  runApp(MyApp());
}
  • Related