coming with a bit of a tricky one. :slight_smile: We opted out using the http library, instead using the HttpClient class directly, because it gives us more control over the client, and headers etc. The http package wraps that class anyway. The class returns streams.
Using
Flutter 1.20.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 216dee60c0 (6 days ago) • 2020-09-01 12:24:47 -0700
Engine • revision d1bc06f032
Tools • Dart 2.9.2
Function that is called in our services to fetch data from backend api (names a bit alternated):
static Future<String> APIRequest(
{@required String relativeURL,
@required String method,
@required EnvironmentConfig config,
dynamic data,
HttpClient httpClient,
Map<String, String> queryParameters}) async {
final stream = await _APIRequest(
method: method,
relativeURL: relativeURL,
httpClient: httpClient,
data: data,
queryParameters: queryParameters,
config: config);
return stream.singleWhere((obj) => obj != null, orElse: () => '');
}
Underlying private API request function:
static Future<Stream<String>> _APIRequest(
{@required String method,
@required EnvironmentConfig config,
@required String relativeURL,
Map<String, String> queryParameters,
HttpClient httpClient,
dynamic data,
String token}) async {
final client = httpClient == null ? HttpClient() : httpClient;
final url =
UriService.getUri(config, relativeURL, queryParameters);
final request = await client.openUrl(method, url);
// Add headers
request.headers.add(
"X-MOBILE-APP", 'test'); // The value is ignore by the backend
if (token != null) {
request.headers.add(HttpHeaders.authorizationHeader, 'Token $token');
}
if (data != null) {
final encodedData = json.encode(data, toEncodable: _toEncodable);
request.headers.contentType = ContentType.json;
request.headers.contentLength = utf8.encode(encodedData).length;
request.write(encodedData);
}
final response = await request.close();
await _rejectIfBadStatusCode(response);
return utf8.decoder.bind(response);
}
Using this approach works well for most of the time, but now we have recently encountered a lot of E/flutter (13551): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Bad state: Too many elements Any idea if this has to do with the streams or similar?
Here is the stacktrace:
E/flutter (13551): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Bad state: Too many elements
E/flutter (13551): #0 Stream.singleWhere.<anonymous closure>.<anonymous closure> (dart:async/stream.dart:1508:15)
E/flutter (13551): #1 _runUserCode (dart:async/stream_pipe.dart:11:14)
E/flutter (13551): #2 Stream.singleWhere.<anonymous closure> (dart:async/stream.dart:1504:7)
E/flutter (13551): #3 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #4 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #5 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #6 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (13551): #7 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (13551): #8 _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:69:11)
E/flutter (13551): #9 _EventSinkWrapper.add (dart:async/stream_transformers.dart:15:11)
E/flutter (13551): #10 _StringAdapterSink.add (dart:convert/string_conversion.dart:238:11)
E/flutter (13551): #11 _StringAdapterSink.addSlice (dart:convert/string_conversion.dart:243:7)
E/flutter (13551): #12 _Utf8ConversionSink.addSlice (dart:convert/string_conversion.dart:317:20)
E/flutter (13551): #13 _Utf8ConversionSink.add (dart:convert/string_conversion.dart:310:5)
E/flutter (13551): #14 _ConverterStreamEventSink.add (dart:convert/chunked_conversion.dart:72:18)
E/flutter (13551): #15 _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:121:24)
E/flutter (13551): #16 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #17 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #19 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (13551): #20 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (13551): #21 _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:69:11)
E/flutter (13551): #22 _EventSinkWrapper.add (dart:async/stream_transformers.dart:15:11)
E/flutter (13551): #23 _Uint8ListConversionSink.add (dart:_http/http_impl.dart:572:13)
E/flutter (13551): #24 _ConverterStreamEventSink.add (dart:convert/chunked_conversion.dart:72:18)
E/flutter (13551): #25 _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:121:24)
E/flutter (13551): #26 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #27 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #28 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #29 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (13551): #30 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (13551): #31 _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:69:11)
E/flutter (13551): #32 _EventSinkWrapper.add (dart:async/stream_transformers.dart:15:11)
E/flutter (13551): #33 _ByteAdapterSink.add (dart:convert/byte_conversion.dart:58:11)
E/flutter (13551): #34 _FilterSink.addSlice (dart:io/data_transformer.dart:615:15)
E/flutter (13551): #35 _FilterSink.add (dart:io/data_transformer.dart:597:5)
E/flutter (13551): #36 _ConverterStreamEventSink.add (dart:convert/chunked_conversion.dart:72:18)
E/flutter (13551): #37 _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:121:24)
E/flutter (13551): #38 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #39 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #40 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #41 CastStreamSubscription._onData (dart:_internal/async_cast.dart:85:11)
E/flutter (13551): #42 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #43 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #44 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #45 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (13551): #46 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (13551): #47 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/flutter (13551): #48 _HandleErrorStream._handleData (dart:async/stream_pipe.dart:266:10)
E/flutter (13551): #49 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter (13551): #50 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (13551): #51 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (13551): #52 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (13551): #53 _BufferingStreamSubscription._sendData (da