Асинхронный метод Flutter продолжает работать даже после удаления соответствующего виджета

У меня есть список путей к изображениям, и я использую метод List.generate для отображения изображений и крестик для удаления изображения из списка. Метод загрузки вызывается для каждого изображения, и когда я удаляю изображение из списка, метод продолжает работать до тех пор, пока изображение не будет загружено. Я ожидаю, что когда я удаляю изображение из списка, метод также должен перестать работать. Я использую будущий конструктор для отображения круглого индикатора выполнения и значков ошибок при загрузке изображения.

Что мне делать, чтобы убедиться, что будущий метод, связанный с текущим виджетом, также останавливается, когда я удаляю виджет из списка?

Это код, в котором я создаю список

           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),
                            ),
                          ),
                      ],
                    ),
                  ],
                ),
              );
            },
          )

Это метод обработчика загрузки.

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

person Ajinkya Rawankar    schedule 27.10.2020    source источник


Ответы (1)


Жизненный цикл виджета не привязан к асинхронным функциям, вызываемым виджетом.

Чтобы проверить, смонтирован ли виджет из ваша асинхронная функция.

person Ammar Hussein    schedule 27.10.2020