Search code examples
flutterdartflutter-listview

Getting Error on implementing Dismissible on flutter list


I am trying to implement Dismissible to swipe and remove the item from the list in flutter, but I am getting the below error on implementation of the same

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

at this line of the code key: Key(item)

How should I resolve it ?

            ListView.separated(
              separatorBuilder: (context, index){
                return Divider();
              },
              controller: _scrollController,
              itemCount: noteItems,
              shrinkWrap: true,
              itemBuilder: (context, index) {

                final item = firstdata[index];
                return 
                  Dismissible(
                  direction: DismissDirection.endToStart,
                  key: Key(item),
                  onDismissed: (direction) {
                    setState(() {
                      firstdata.removeAt(index);
                    });
                    Scaffold.of(context)
                        .showSnackBar(SnackBar(content: Text("$item dismissed")));
                  },
                  background: Container(color: Colors.red)
                  ,

                  child: Padding(

                    padding: const EdgeInsets.fromLTRB(8.0, 7.0, 8.0, 0.0),
                    child: Column(
                      children: <Widget>[

                        ListTile(
                          
                          leading:ClipRRect(
                              borderRadius: BorderRadius.circular(10),
                              child: Image.asset('images/appstore.png', width: 50, height: 50)
                          ) ,

                          title:
                          Row(children: [
                            Flexible(
                              child: firstdata[index]['id']!= null?AutoSizeText(
                                firstdata[index]['id'],
                                maxLines: 2,


                                style: TextStyle(fontWeight: FontWeight.bold),) :Text(''),
                            ),

                          ],),



                        ),







                      ],
                    ),
                  ),
                );

              },

            ),

The JSON data structure for the list view is here below

  {
    "error": "false",
    "notification": [
        {
            "rn": "1",
            "id": "224",
            "company_details": {
                "code": "2",
            }
        },
        {
            "rn": "2",
            "id": "219",
            "company_details": {
                "code": "3",
            }
        },
        {
            "rn": "3",
            "id": "213",
            "company_details": {
                "code": "3",
            }
        },
        {
            "rn": "4",
            "id": "209",
            "company_details": {
                "code": "4",
            }
        },
        {
            "rn": "5",
            "id": "204",
            "company_details": {
                "code": "3",
            }
        },
        {
            "rn": "6",
            "id": "199",
            "company_details": {
                "code": "3",
            }
        },
        {
            "rn": "7",
            "id": "193",
            "company_details": {
                "code": "3",
            }
        }
    ],
}

How should I implement the same and get it resolved?


Solution

  • As stated in the other answer, the Key function expects a string to create a key based on that. If you can identify an item based on one of its parameters (for example id), then you could use item.id and it would be fine.

    However, to make sure it will be truly unique key for any combination of parameters (in your case id, rn and company_details) you can use ObjectKey:

    Replace the following line:

    key: Key(item)
    

    With the following:

    key:ObjectKey(item)
    

    This way Flutter can identify your item's parameters and create a key based on the combination of them.

    Other options include ValueKey and UniqueKey.