I have not tried this myself, but the code could possibly be simplified here (and in the two following methods), by using `Stream.fold()`. So something like:

    return response.fold([], (list, newItems) => list.addAll(newItems)).then(List<int> data) {
       String str = new String.fromCharCodes(data);
       ...
    }

I think this would let you remove the use of the completer, batching up the response, and the separate onError and onDone clauses.