Произошло исключение. Ошибка диапазона (ошибка диапазона (индекс): Недопустимое значение: Не входит в диапазон 0..4: 5)

#flutter #dart

Вопрос:

Мое приложение рандомизирует список, упорядочивает элементы и отображает их на экране, но когда список заканчивается, приложение выходит из строя и показывает это исключение.

     class _HomeState extends State<Home> {
    
      var pergunta = "randomquest";

      int _posicao1 = -1;
    
      var lista1 = ['1', '2', '3', '4', '5']..shuffle();
    
    void Teste1 (){
      _posicao1  ;
      setState(() {
      pergunta = lista1.elementAt(_posicao1);
    });
    }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            backgroundColor: Colors.white, 
            body: Center(
              child: Column(
                children: [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[ 
                      IconButton(   
                        icon: Image.asset('images/eye.png'),
                        iconSize: 150,
                        onPressed: () {Teste1();
                        },
}
 

Ответ №1:

_posicao1 достигает » 5 » в Teste1() и запрашивает элемент(5), которого не существует. Списки в Dart основаны на нуле, что означает, что они начинаются с 0. Ваш список состоит из 5 элементов: 0,1,2,3,4. Вы могли бы выполнить проверку границ в Тесте1():

Начните цикл сначала

 void Teste1 (){
  _posicao1  ;
  if(_posicao1 == lista1.length) _posicao1 = 0; //start the loop over
  setState(() {
      pergunta = lista1.elementAt(_posicao1);
  });
}
 

Остановитесь на последнем элементе

 void Teste1 (){
  _posicao1  ;
  if(_posicao1 == lista1.length) _posicao1 = lista1.length-1; //last index of lista1      
  setState(() {
      pergunta = lista1.elementAt(_posicao1);
  });
}