Laurensius Nusa
Laurensius Nusa

Reputation: 3

Iterable first Bad State: no element

I am trying to get driverfleet data for reviewing purpose, but instead i get the following error

E/flutter (21563): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Bad state: No element
E/flutter (21563): #0      Iterable.first (dart:core/iterable.dart:524:7)
E/flutter (21563): #1      _ReviewTransportsalesState.driverFleet (package:project_inovation/ui/screen/ReviewTransportsales.dart:504:10)
E/flutter (21563): <asynchronous suspension>
E/flutter (21563): #2      _ReviewTransportsalesState.initState (package:project_inovation/ui/screen/ReviewTransportsales.dart:171:5)
E/flutter (21563): #3      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4684:58)
E/flutter (21563): #4      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4520:5)
E/flutter (21563): #5      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490:14)
E/flutter (21563): #6      Element.updateChild (package:flutter/src/widgets/framework.dart:3258:18)

this is the error code that flutter showed

driverFleet(String value) async {
FleetModel fleetModel = FleetModel(value);
API _api = API();

Response response = await _api.fleetAPI(fleetModel);
xml.XmlDocument parsedFleet = xml.parse(response.data);
String fleetName = parsedFleet
    .findAllElements('DataRow')
    .first
    .findAllElements('field')
    .elementAt(0)
    .getAttribute('lval');
String fleetID = parsedFleet
    .findAllElements('DataRow')
    .first
    .findAllElements('field')
    .elementAt(1)
    .getAttribute('lval');
String productID = parsedFleet
    .findAllElements('DataRow')
    .first
    .findAllElements('field')
    .elementAt(3)
    .getAttribute('lval');

DriverModel driverModel = DriverModel(fleetID);

try {
  var driverResponse = await _api.driverAPI(driverModel);
  xml.XmlDocument parsedDriver = xml.parse(driverResponse.data);

  String driverID = parsedDriver
      .findAllElements('DataRow')
      .first
      .findAllElements('field')
      .elementAt(0)
      .getAttribute('lval');
  String driverName = parsedDriver
      .findAllElements('DataRow')
      .first
      .findAllElements('field')
      .elementAt(1)
      .getAttribute('lval');

  _fleetController.text = fleetName ?? 'B 9778 PYU';
  _driverController.text = driverName;
  _mySelectionDriver = driverID + driverName;
  _mySelectionProduct = productID;
  _fleetID = fleetID ?? '1000773';
  _driverID = driverID;
} catch (_) {
  _fleetController.text = fleetName ?? 'B 9778 PYU';
  _driverController.text = 'Aang T6';
  _mySelectionDriver = '1001465Aang T6';
  _mySelectionProduct = productID;
  _fleetID = fleetID ?? '1000773';
  _driverID = '1001427';
}

await readTransportSales(widget.recordID);
await readTransRoute(widget.recordID);
setState(() {});
}

i am asumming that this reads an empty list, based on the similar problem that i've read here, and i've tried to use their solution but still no good.

Upvotes: 0

Views: 946

Answers (1)

Nisanth Reddy
Nisanth Reddy

Reputation: 6430

getters like first, last on Iterables are not safe to use and throw a state error when called on empty Iterables.

In your code, you have the second part in a try catch,

But your parsedFleet.findAllElements('DataRow') has the possibility to return an empty Iterable.

Move this code into a try catch as well, or perform a check before accessing .findAllElements('field').

Upvotes: 1

Related Questions