2

I have a list of image paths and I am using the List.generate method to display images and a cross icon to remove image from list. Upload method is called on each image and when I remove the image from the list the method still keeps running until the image is uploaded. The behavior I am expecting is when I remove the image from the list the method should also stop running. I am using a future builder to display the circular progress bar and error icons while uploading an image.

What should I be doing to make sure the future method associated to the current widget also stops when I remove the widget from the list?

This is the code where I am creating a list

           List.generate(
            files.length,
            (index) {
              var image = files[index];             
              return Container(
                height: itemSize,
                width: itemSize,
                child: Stack(
                  children: <Widget>[
                    Container(
                       getImagePreview(image, itemSize)                          
                    ),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.end,
                      children: [
                        uploadHandler(image, field),
                          InkWell(
                            onTap: () => removeFileAtIndex(index, field),
                            child: Container(
                              margin: EdgeInsets.all(3),
                              decoration: BoxDecoration(
                                color: Colors.grey.withOpacity(.7),
                                shape: BoxShape.circle,
                              ),
                              alignment: Alignment.center,
                              height: 22,
                              width: 22,
                              child: Icon(Icons.close, size: 18, color: Colors.white),
                            ),
                          ),
                      ],
                    ),
                  ],
                ),
              );
            },
          )

This is Upload Handler method.

Widget uploadHandler(file, field) {
    return FutureBuilder(
      future: upload(file),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.data.statusCode == 201) {            
            return doneUpload();
          } else {
            logger.d(snapshot.error);
            return error();
          }
        } else {
          return uploading();
        }
      },
    );
  }
Ammar Hussein
  • 5,534
  • 5
  • 18
  • 37

1 Answers1

0

The lifecycle of the widget isn't attached to the async functions invoked by the widget.

You can check the mounted variable to check if the widget still mounted from your async function.

Ammar Hussein
  • 5,534
  • 5
  • 18
  • 37