getx icon indicating copy to clipboard operation
getx copied to clipboard

response.bodyBytes throw "Bad state: Stream has already been listened to."

Open MuhammadUmair786 opened this issue 1 year ago • 1 comments

Description response.bodyBytes throw "Bad state: Stream has already been listened to." Server is returning csv file. Response Header include content-type: text/csv

Reproduction code

import 'dart:async';
import 'dart:developer';
import 'dart:io';

import 'package:get/get.dart';
import 'package:get/get_connect/http/src/request/request.dart';
import 'package:path_provider/path_provider.dart';

import '../../../constants/extra.dart';
import '../../../constants/validators.dart';
import '../../../widgets/snack_bar.dart';

class ReportApi extends GetConnect implements GetxService {
  Future<dynamic> downloadReport(
    String fileName,
    String bucket,
    String folder,
  ) async {
    String url = 'url';
    Map<String, dynamic> body = {
      "fileName": fileName,
      "bucket": bucket,
      "folder": folder,
    }; 
    
    return post(
      url,
      body,
      headers: apiHeader,
    ).then(
      (Response response) async {
        log('status code: Report ::: ${response.statusCode}');

        if (response.isOk) {
          final directory = await getExternalStorageDirectory();
          final filePath = '${directory!.path}/$fileName';
          File file = File(filePath);
          file.writeAsBytes(await response.bodyBytes!.toBytes());

          showSnackBar('file save');
        } else {
          if (response.unauthorized) {
            showSnackBar('Unathorized', isError: true);
          }
           
          return null;
        }
      },
    ).onError((e, x) {
      log(e.toString());
      log(x.toString());
    });
  }
}

To Reproduce You can see from code sample that that I am using response.bodyBytes! only once, but this stream is already listened.

Console Logs

[log] status code: Report ::: 200
[log] Bad state: Stream has already been listened to.
[log] #0      _StreamController._subscribe (dart:async/stream_controller.dart:678:7)
#1      _ControllerStream._createSubscription (dart:async/stream_controller.dart:828:19)
#2      _StreamImpl.listen (dart:async/stream_impl.dart:471:9)
#3      new _ForwardingStreamSubscription (dart:async/stream_pipe.dart:114:10)
#4      _ForwardingStream._createSubscription (dart:async/stream_pipe.dart:86:16)
#5      _ForwardingStream.listen (dart:async/stream_pipe.dart:81:12)
#6      _HttpIncoming.listen (dart:_http/http_impl.dart:442:49)
#7      _HttpClientResponse.listen (dart:_http/http_impl.dart:713:19)
#8      BodyBytesStream.toBytes

Flutter Version: [√] Flutter (Channel stable, 3.10.0, on Microsoft Windows [Version 10.0.19045.2965], locale en-US) • Flutter version 3.10.0 on channel stable at C:\Users\PC\Downloads\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 84a1e904f4 (8 days ago), 2023-05-09 07:41:44 -0700 • Engine revision d44b5a94c9 • Dart version 3.0.0 • DevTools version 2.23.1

Getx Version: get: ^4.6.5

MuhammadUmair786 avatar May 17 '23 11:05 MuhammadUmair786

@MuhammadUmair786 have you managed to resolve this? I bumped into this same problem.

gyulavoros avatar May 13 '24 14:05 gyulavoros