Getting Error on implementing Dismissible on flutter list

271 views Asked by At

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?

2

There are 2 answers

0
Naslausky On BEST ANSWER

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.

0
miguelik On

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

means that it crashed because it was expecting a String and flutter did not find one.

This means that:

key: Key(item)

Key(item)-> Is not a String. I donĀ“t know how are you creating Key/where is it.

My best guess is to try to find some method like...:

`key: Key(item).aMethodthatgivesaString()`
`key: Key(item).toString()`

Let me know if this was useful.