#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), ), ), ), ),
Он будет проверять наличие пустого, пустого списка и списка записей.