首页 > 解决方案 > 颤振 - RangeError(索引)

问题描述

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

══╡ 手势捕捉到的异常

I/flutter (28729):处理手势时引发以下 RangeError:I/flutter (28729):RangeError (index):无效值:有效值范围为空: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++;
      });
    }
  }
}

标签: androidiosdartflutter

解决方案


当您单击按钮时,您正在调用此行的问题

punkteanzahl_teamEins[team1_hinzugezaehlt]

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

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

并为第二个功能做同样的事情


推荐阅读