【问题标题】:Iterable first Bad State: no element可迭代的第一个坏状态:没有元素
【发布时间】:2021-08-11 09:31:17
【问题描述】:

我正在尝试获取 driverfleet 数据以进行审查,但我收到以下错误

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)

这是flutter显示的错误码

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

我假设这会读取一个空列表,基于我在这里阅读的类似问题,我尝试使用他们的解决方案但仍然没有好处。

【问题讨论】:

  • 您的假设是正确的...但是您的代码有点难以理解。我认为您应该检查该页面上的任何数据是否为空
  • 每当我运行应用程序时,即使我的数据库中有数据,它也会读取 0 行

标签: api flutter dart


【解决方案1】:

getters like first, last on Iterables 不安全使用并在空 Iterables 上调用时抛出 state 错误。

在您的代码中,您在 try catch 中有第二部分,

但是您的parsedFleet.findAllElements('DataRow') 有可能返回一个空的Iterable

将此代码也移动到 try catch 中,或在访问 .findAllElements('field') 之前执行检查。

【讨论】:

  • 但是为什么它返回空的可迭代?我的数据库中有数据
  • 我们无法修改 dart 的内部功能。所以使用 try catch 或 if else 子句是唯一的方法。答案不能解决您的问题吗?您应该只需要处理 catch 块内的默认功能。
  • 我没试过,我正在通过手机接听但是谢谢你的回答..
  • 我对颤振和飞镖还是个新手
  • 没问题。试一试,如果它不起作用,请告诉我。如果可行,请考虑接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多