Home > Software design >  Flutter & Firebase Error displaying an document (Array) from firebase on a view
Flutter & Firebase Error displaying an document (Array) from firebase on a view

Time:07-07

I am using FireBase to store some data. So far, I was creating several collections. But, I have understood that more collections I have more Firebase will cost when the application will be in production. Someone told me that I should create a 'General' collection, where I can store several documents in array. I just want to display on several cards, all the contexts of the array "context_Name"

So I have modify my collections and document, but I do not know how to get the same results as before I modify my code.

The error I am getting is type 'List' is not a subtype of type 'String'.

When the exception was thrown, this was the stack:

#0 _Context_List_Sate.build.. (package:lt/Views/Lists/14_contexts_lists_page.dart:217:45)

#1 MappedListIterable.elementAt (dart:_internal/iterable.dart:412:31) #2 ListIterator.moveNext (dart:_internal/iterable.dart:341:26)

#3 new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:188:27)

#4 new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)

If i understand the error, I do not find how to fix that while displaying all the records, but one by one on a card. Many thanks for your help.

screenshot firebase

class Context_List_View extends StatefulWidget {
  Context_List_View({Key key}) : super(key: key);
  @override
  _Context_List_Sate createState() => _Context_List_Sate();
}

class _Context_List_Sate extends State<Context_List_View> {
  @override
  Widget build(BuildContext context) {
    void showAddNote() {
      TextEditingController _noteField = new TextEditingController();
      showDialog(
          context: context,
          builder: (BuildContext context) {
            return CustomAlertDialog(
              content: Container(
                width: MediaQuery.of(context).size.width / 1.3,
                height: MediaQuery.of(context).size.height / 4,
                child: Column(
                  children: [
                    TextField(
                      controller: _noteField,
                      maxLines: 4,
                      decoration: InputDecoration(
                        border: const OutlineInputBorder(
                          borderSide:
                          const BorderSide(color: Colors.black, width: 1.0),
                        ),
                      ),
                    ),
                    SizedBox(height: 10),
                    Material(
                      elevation: 5.0,
                      borderRadius: BorderRadius.circular(25.0),
                      color: Colors.white,
                      child: MaterialButton(
                        minWidth: MediaQuery.of(context).size.width / 1.5,
                        onPressed: () {
                          Navigator.of(context).pop();
                          CollectionReference users = FirebaseFirestore.instance
                              .collection('Users')
                              .doc(FirebaseAuth.instance.currentUser.uid)
                              .collection('general');


                          users
                              .add({'context_Name': _noteField.text,})
                              .then((value) => print("User Document Added"))
                              .catchError((error) =>
                              print("Failed to add user: $error"));
                        },
                        padding: EdgeInsets.fromLTRB(10.0, 15.0, 10.0, 15.0),
                        child: Text(
                          'Add Context',
                          textAlign: TextAlign.center,
                          style: TextStyle(
                            fontSize: 20.0,
                            color: Colors.black,
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                      ),
                    )
                  ],
                ),
              ),
            );
          });
    }

    return Scaffold(
      appBar: new AppBar(
        title: new Text('Contexts'),
        actions: <Widget>[
          IconButton(
            icon: Icon(
              Icons.add_circle_outline,
              color: Colors.white,
            ),
            onPressed: () {
              showAddNote();
            },
          ),
        ],
      ),
      drawer: MyMenu(),
      backgroundColor: Colors.white,
      body: Column(
        children: [
          Container(
            height: MediaQuery.of(context).size.height /1.4,
            width: MediaQuery.of(context).size.width,
            child: StreamBuilder(
                stream: FirebaseFirestore.instance
                    .collection('Users')
                    .doc(FirebaseAuth.instance.currentUser.uid)
                    .collection('general')
                    .snapshots(),
                builder: (BuildContext context,
                    AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }
                  return ListView(
                    children: snapshot.data.docs.map((document) {
                      return Wrap(
                          children: [Card(
                            child: SwipeActionCell(
                              key: ObjectKey(document['context_Name']),
                              trailingActions: <SwipeAction>[
                                SwipeAction(
                                    title: "delete",
                                    onTap: (CompletionHandler handler) {
                                      CollectionReference users = FirebaseFirestore
                                          .instance
                                          .collection('Users')
                                          .doc(
                                          FirebaseAuth.instance.currentUser.uid)
                                          .collection('contexts');
                                      users
                                          .doc(document.id)
                                          .delete()
                                          .then((value) => print("Context Deleted"))
                                          .catchError((error) => print(
                                          "Failed to delete Next Action: $error"));
                                    },
                                    color: Colors.red),
                              ],

                              child: Padding(
                                padding: const EdgeInsets.all(0.0),
                                child: ListTile(
                                  leading: ConstrainedBox(
                                    constraints: BoxConstraints(
                                      minWidth: leadingIconMinSize,
                                      minHeight: leadingIconMinSize,
                                      maxWidth: leadingIconMaxSize,
                                      maxHeight: leadingIconMaxSize,
                                    ),
                                    child: Image.asset('assets/icons/tag.png'),
                                  ),
                                  trailing: IconButton(icon: Icon(Icons.edit), onPressed: ()
                                  {

                                //EDIT CONTEXT

                                showDialog(
                                context: context,
                                barrierDismissible: true,
                                builder: (BuildContext context){
                                return AlertDialog(
                                title: Text("Edit Context"),
                                content:

                                TextFormField(
                                  initialValue: document['context_Name'],

                                  onChanged: (value) {
                                    setState(() {
                                      _newContextName = value;
                                    });
                                  },
                                ),

                                actions: <Widget>[
                                FlatButton(
                                child: Text("OK"),
                                onPressed: (){
                                setState(() {
                                var  contextRecordID = (document.id);

                                FirebaseFirestore.instance
                                    .collection('Users')
                                    .doc(
                                    FirebaseAuth.instance.currentUser.uid)
                                    .collection('general')
                                    .doc(contextRecordID)
                                    .update({
                                  'context_Name':_newContextName,

                                });
                                });
                                Navigator.of(context).pop(true);
                                },
                                ),//OK Button
                                FlatButton(
                                child: Text("Cancel"),
                                onPressed: (){
                                Navigator.of(context).pop(false);
                                },
                                ),//Cancel Button
                                ],
                                );
                                    
                                  });}),

                                  title: Text(
                                    
                                    document['context_Name'],
                                    maxLines: 2,
                                    overflow: TextOverflow.ellipsis,
                                  ),
                                  ),
                                ),
                              ),
                            ),
                          ]
                      );
                    }).toList(),
                  );
                }),
          ),
        ],
      ),
      // bottomNavigationBar:   ,
    );
  }
}

CodePudding user response:

You need to iterate over the members of the context_Name field instead of iterating over the entire general collection. Change the beginning of the StreamBuilder to the following:

        // ... other code
            StreamBuilder(
                stream: FirebaseFirestore.instance
                    .collection('Users')
                    .doc(FirebaseAuth.instance.currentUser.uid)
                    .collection('general')
                    .doc('baceZyyYUciEGGADfgOv')
                    .snapshots(),
                builder: (BuildContext context,
                    AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }
                  return ListView(
                    children:
                        (snapshot.data.get('context_Name') as List<String>)
                            .map((contextName) {
                      return Wrap(children: [
                        Card(
                          child: SwipeActionCell(
                            key: ObjectKey(contextName),
                 // ... other code

You will also have to update the callbacks to the SwipeActions and AlertDialog as the document variable will no longer exists. Also, change

title: Text(
  document['context_Name'],
  maxLines: 2,
  overflow: TextOverflow.ellipsis,
),

to

title: Text(
  contextName,
  maxLines: 2,
  overflow: TextOverflow.ellipsis,
),

(towards the end of the code).

  • Related