flutter:: noSuchMethod Ошибка: Получатель «длина» был вызван при нуле

#flutter #dart

Вопрос:

Я создал функцию, в которой записанный голос отображается на экране при записи. Однако, если в виджете нет записи(null), вышеописанная ошибка возникает из-за невозможности использования длины. Как я могу это решить?

 class Record extends StatefulWidget {  const Record({  Key? key,  }) : super(key: key);   get records =gt; null;    @override  _RecordState createState() =gt; _RecordState(); }  class _RecordState extends Statelt;Recordgt; {  late int _totalTime;  late int _currentTime;  double _percent = 0.0;  int _selected = -1;  bool isPlay=false;  AudioPlayer advancedPlayer = AudioPlayer();   @override  Widget build(BuildContext context) {  return ListView.builder(  itemCount: widget.records.length,  shrinkWrap: true,  reverse: true,  itemBuilder: (BuildContext context, int i) {  return Card(  elevation: 5,  child: ExpansionTile(  title: Text(  'Record ${widget.records.length - i}',  style: TextStyle(color: Colors.black),  ),  

Ответ №1:

Не возвращайте ListView.builder значение, если records оно равно нулю.

 return widget.records == null ? SizedBox() : ListView.builder...  

Ответ №2:

Объявите свой класс следующим образом,

 class Record extends StatefulWidget {  const Record({  Key? key,  required this.records,  }) : super(key: key);   final List records;   @override  _RecordState createState() =gt; _RecordState(); }  

В приведенном выше коде records приведен список типов Listlt;dynamicgt; . Если у вас есть определенный тип данных,

 final Listlt;YOUR_DATA_TYPEgt; records;  

Таким образом, записи никогда не будут пустыми. Если records может быть равно нулю,

 final Listlt;YOUR_DATA_TYPEgt;? records;  

и использовать,

 return ListView.builder(  itemCount: widget.records?.length ?? 0,  shrinkWrap: true,  reverse: true,  itemBuilder: (BuildContext context, int i) {  return Card(  elevation: 5,  child: ExpansionTile(  title: Text(  'Record ${widget.records.length - i}',  style: TextStyle(color: Colors.black),  ),  

Ответ №3:

jiji.!

Он возвращает значение null, потому что в некоторых случаях Listview выполняется перед назначением значения widget.records в сборке. В этом случае вы можете получить нулевой список, даже если в нем есть записи widget.records .

Итак, вам просто нужно обработать это нулевое исключение. Нравится,

 ListView.builder( shrinkWrap: true, reverse: true, physics: BouncingScrollPhysics(), itemCount: widget.records.length, itemBuilder: (BuildContext context, int index) =gt;  widget.customer == null  ? Card(  elevation: 5,  child: ListTile(  title: Text(  'No Records Found',  style: TextStyle(  color: Colors.black,  fontSize: 14,  ),  ),  ),  )  : widget.records.isEmpty  ? Card(  elevation: 5,  child: ListTile(  title: Text(  'No Records Available',  style: TextStyle(  color: Colors.black,  fontSize: 14,  ),  ),  ),  )  : Card(  elevation: 5,  child: ExpansionTile(  title: Text(  'Record ${widget.records.length - index}',  style:  TextStyle(color: Colors.black),  ),  ),  ), ),  

Он будет проверять наличие пустого, пустого списка и списка записей.