Flutter-RangeError(索引)

时间:2018-07-04 20:44:49

标签: android ios dart flutter

在构建ListView时出现错误。在此flutter应用程序中,当单击按钮时,我尝试为每列计数一些点。但是我总是遇到同样的错误。

  

══╡手势引起的异常

     

I / flutter(28729):处理时引发了以下RangeError   手势:I / flutter(28729):RangeError(索引):无效值:有效   值范围为空:0

这是我的代码,希望有人能够帮助我修复错误:

import 'package:flutter/material.dart';


class Punktezaehler extends StatefulWidget{

  final List<String> spieler_namen;
  Punktezaehler(this.spieler_namen);

  @override
  State<StatefulWidget> createState() => new _Punktezaehler(this.spieler_namen);
}


class _Punktezaehler extends State<Punktezaehler>{

  final List<String> spieler_namen;
  _Punktezaehler(this.spieler_namen);

  List<int> punkteanzahl_teamEins = [];
  List<int> punkteanzahl_teamZwei = [];

  int team1_hinzugezaehlt = 0;
  int team2_hinzugezaehlt = 0;

  @override
  Widget build(BuildContext context) {


    var spieler1 = spieler_namen[0].substring(0,3);
    var spieler2 = spieler_namen[1].substring(0,3);
    var spieler3 = spieler_namen[2].substring(0,3);
    var spieler4 = spieler_namen[3].substring(0,3);

    return new Scaffold(
      appBar: new AppBar(
        automaticallyImplyLeading: false,
        title: new Text("$spieler1 & $spieler2 vs" +" $spieler3 & $spieler4"),
        actions: <Widget>[

        ],
      ),
      body: Container(
          child: new Row(
            children: <Widget>[
              new Column(
                children: <Widget>[
                  new IconButton(
                      icon: Icon(Icons.exposure_plus_2),
                      onPressed: () => punkte_hinzuzaehlen(1, 2)
                  )
                ],
              ),
              new Padding(padding: EdgeInsets.only(left: 100.0)),
              new Expanded(
                  child: ListView.builder(
                      itemCount: punkteanzahl_teamEins.length, //--> Error is thrown here
                      itemBuilder: (context, index){
                        return Text(punkteanzahl_teamEins[index].toString());
                      }
                  ),
              ),
              new Expanded(
                  child: ListView.builder(
                      itemCount: punkteanzahl_teamZwei.length, //--> Error is thrown here
                      itemBuilder: (context, index){
                        return Text(punkteanzahl_teamZwei[index].toString());
                      }
                  ),
              ),
              new Column(
                children: <Widget>[
                  new IconButton(
                      icon: Icon(Icons.exposure_plus_2),
                      onPressed: () => punkte_hinzuzaehlen(2, 2)
                  )],
              )
            ],
          )
      ),
    );
  }

  void punkte_hinzuzaehlen(int team, int nummer){
    if (team == 1){
      setState(() {
        punkteanzahl_teamEins[team1_hinzugezaehlt] = nummer;
        team1_hinzugezaehlt++;
      });
    }
    else if(team == 2){
      setState(() {
        punkteanzahl_teamZwei[team2_hinzugezaehlt] = nummer;
        team2_hinzugezaehlt++;
      });
    }
  }
}

1 个答案:

答案 0 :(得分:0)

当您单击按钮时,您正在呼叫此行的问题

punkteanzahl_teamEins[team1_hinzugezaehlt]

team1_hinzugezaehlt的初始值为0,但是每次用户单击按钮时,该值都会增加1 因此,假设您的punkteanzahl_teamEins列表在第四次单击中包含2个项目,值team1_hinzugezaehlt将为4 witch会导致此错误。因此解决方案是检查该值是否在范围内

  if (team1_hinzugezaehlt<punkteanzahl_teamEins.length){
    setState(() {
      punkteanzahl_teamEins[team1_hinzugezaehlt] = nummer;
      team1_hinzugezaehlt++;
    });
  }

对第二个功能做同样的操作