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