Flutter:如何使用双重列表对表格的数据进行排序

时间:2018-10-18 15:20:40

标签: dart flutter

我已经创建了一个,我要在其中显示两个不同列表中的数据。

  • 第一列表称为播放器,所有播放器都在其中。
  • 第二列表称为 PlayersStats ,其中是每个玩家的所有统计信息。

如果玩家列表中有 3 ,则 playersStats 列表中有 3


问题:
我的问题是该对数据进行排序了。它们必须相关,但我无法实现。


屏幕截图中,您可以查看3位玩家。 在订购数据之前,一切正确。

  • RaiiLKilleR-101个进球
  • RaiiKonN-30个进球
  • Miriam-100个进球

但是订购后,玩家会陷入困境。

  • RaiiLKilleR-101个进球
  • RaiiKonN-100个进球
  • Miriam-30个进球

我希望有人能帮助我,感谢您的帮助。

enter image description here

getRowsPlayers() {
    final rows2 = new List.generate(widget.players.length, (int index) => new DataRow(
        cells: [
          new DataCell(new Text(widget.players[index].gameID, style: new TextStyle(color: Colors.black))),
          new DataCell(new Text(widget.playersStats[index].goals.toString(), style: new TextStyle(color: Colors.black))),
        ]));
    return rows2;
  }

  bool isSort = true;

  Widget bodyData() => DataTable(
      onSelectAll: (b) {},
      sortColumnIndex: 1,
      sortAscending: isSort,
      columns: <DataColumn>[
        DataColumn(
          label: Text("PLAYERS"),
          numeric: false,
          onSort: (i, b) {
            print("$i $b");
            setState(() {

            });
          },
          tooltip: "To display players",
        ),
        DataColumn(
          label: Text("GOALS"),
          numeric: true,
          onSort: (i, b) {
            print("$i $b");
            setState(() {
              if(isSort){
                widget.playersStats.sort((a, b) => b.goals.compareTo(a.goals));
                widget.players.sort((a, b) => b.gameID.compareTo(a.gameID));
                isSort = false;
              } else {
                widget.playersStats.sort((a, b) => a.goals.compareTo(b.goals));
                widget.players.sort((a, b) => a.gameID.compareTo(b.gameID));
                isSort = true;
              }
            });
          },
          tooltip: "To display goals",
        ),
      ],
      rows: getRowsPlayers());


  Widget players() {
    return Container(
      child: bodyData(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title.toUpperCase()),
        centerTitle: true,
        backgroundColor: widget.themeBackground,
      ),
      body: new Container(
        child: new Column(
          children: <Widget>[
            widget.type == 'GLOBAL'? global()
            :
            widget.type == 'COMPETITION' ? competition()
            :
            widget.type == 'FRIENDLY' ? friendly() : players()
          ],
        ),
      ),
    );
  }

2 个答案:

答案 0 :(得分:1)

原因是因为PlayersStatsPlayers是不同的列表。

widget.playersStats.sort((a, b) => b.goals.compareTo(a.goals));
widget.players.sort((a, b) => b.gameID.compareTo(a.gameID));

PlayersStats按goals排序,因此结果为[101 Goals, 100 Goals, 30 Goals]

玩家按照gameID进行排序,因此结果为[RaiiLKilleR, RaiiKonN, Miriam]

这两个列表按其自身排序。因此结果不是您所期望的。 您需要将两个列表合并为一个列表,例如

class Player {
    final String gameID;
    final int goals;
    Player({this.gameID, this.goals});
}

并致电 widget.playersStats.sort((a, b) => b.goals.compareTo(a.goals));

您的getRowsPlayers

  getRowsPlayers() {
    final rows2 = new List.generate(widget.players.length, (int index) => new DataRow(
    cells: [
      new DataCell(new Text(widget.players[index].gameID, style: new TextStyle(color: Colors.black))),
      new DataCell(new Text(widget.players[index].goals.toString(), style: new TextStyle(color: Colors.black))),
    ]));
    return rows2;
  }

那么结果就是您的预期。

答案 1 :(得分:0)

首先创建对象:

class Data{
    final String DataName;
    Data({this.DataName});
} 

然后使用Widget调用构建器中的列表

 List<Data> myData= snapshot.data;
 myData.sort((a, b) => a.DataName.compareTo(b.DataName));