【问题标题】:flutter using DataTable sorting built in function使用 DataTable 排序内置函数颤动
【发布时间】:2021-04-16 20:52:18
【问题描述】:

如何使用内置函数对DataTable 上的列进行排序。 是否可以对多个列进行操作,这样当我按下排序图标时,它实际上会对列表进行排序?

感谢您的支持:)

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    var myColumns = [
      new DataColumn(label: new Text('name')),
      new DataColumn(label: new Text('age')),
      new DataColumn(label: new Text('Hight')),
    ];

    var myRows = [
      new DataRow(cells: [
        new DataCell(new Text('George')),
        new DataCell(new Text('18')),
        new DataCell(new Text('173cm')),
      ]),
      new DataRow(cells: [
        new DataCell(new Text('Dave')),
        new DataCell(new Text('21')),
        new DataCell(new Text('183cm')),
      ]),
      new DataRow(cells: [
        new DataCell(new Text('Sam')),
        new DataCell(new Text('55')),
        new DataCell(new Text('170cm')),
      ])
    ];

    return new Scaffold(
      body: new Center(
        child: new Container(
            child: new DataTable(
          columns: myColumns,
          rows: myRows,
          sortColumnIndex: 0,
          sortAscending: true,
        )),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我制作了一些小版本,以帮助那些可能面临一些问题的人。

    class Person {
      String name;
      int age;
      num hight;
      Person({this.name, this.age, this hight});
    }
    
    class HomePageState extends State<HomePage> {
      bool _sortNameAsc = true;
      bool _sortAgeAsc = true;
      bool _sortHightAsc = true;
      bool _sortAsc = true;
      int _sortColumnIndex;
      List<Person> _persons;
    
      @override
      initState() {
        super.initState();
        _persons = [
          Person(
            name: 'George',
            age: 18,
            height: 173,
          ),
          Person(
            name: 'Dave',
            age: 21,
            height: 183,
          ),
          Person(
            name: 'Sam',
            age: 55,
            height: 170,
          ),
        ];
      }
    
      @override
      Widget build(BuildContext context) {
        var myColumns = [
          DataColumn(
            label:  Text('name'),
            onSort: (columnIndex, sortAscending) {
              setState(() {
                if (columnIndex == _sortColumnIndex) {
                  _sortAsc = _sortNameAsc = sortAscending;
                } else {
                  _sortColumnIndex = columnIndex;
                  _sortAsc = _sortNameAsc;
                }
                _persons.sort((a, b) => a.name.compareTo(b.name));
                if (!_sortAscending) {
                  _persons = _persons.reversed.toList();
                }
              });
            },
           ),
          DataColumn(
            label:  Text('age'),
            onSort: (columnIndex, sortAscending) {
              setState(() {
                if (columnIndex == _sortColumnIndex) {
                  _sortAsc = _sortAgeAsc = sortAscending;
                } else {
                  _sortColumnIndex = columnIndex;
                  _sortAsc = _sortAgeAsc;
                }
                _persons.sort((a, b) => a.age.compareTo(b.age));
                if (!_sortAscending) {
                  _persons = _persons.reversed.toList();
                }
              });
            },
          ),
          DataColumn(
            label:  Text('Hight'),
            onSort: (columnIndex, sortAscending) {
              setState(() {
                if (columnIndex == _sortColumnIndex) {
                  _sortAsc = _sortHeightAsc = sortAscending;
                } else {
                  _sortColumnIndex = columnIndex;
                  _sortAsc = _sortHeightAsc;
                }
                _persons.sort((a, b) => a.height.compareTo(b.height));
                if (!_sortAscending) {
                  _persons = _persons.reversed.toList();
                }
              });
            },
          ),
        ];
    
        var myRows = _persons.map((person) {
          return DataRow(cells: [
             DataCell( Text(person.name)),
             DataCell( Text('${person.age}')),
             DataCell( Text('${person.height}cm')),
          ]);
        });
    
        return  Scaffold(
          body:  Center(
            child:  Container(
                child:  DataTable(
              columns: myColumns,
              rows: myRows.toList(),
              sortColumnIndex: _sortColumnIndex,
              sortAscending: _sortAsc,
            )),
          ),
        );
      }
    }
    

    【讨论】:

    • 什么是 !_sortAscending?
    • !是一个布尔运算符。所以 !_sortAscending 基本上检查 _sortAscending 是否为真(又名 FALSE)。
    【解决方案2】:

    我建议你以一种简单的方式来做。 假设有一个有名字的类 StudentDetails 和属性 姓名、年龄、身高。 . 制作具有不同值的该类的对象列表。

    StudentDetails s1, s2, s3;
    s1.name = George;
    s1.age = 18;
    s1.height = 173;
    //ans same for the rest of two students .
    List<dynamic> sd = [s1,s2,s3];
    

    现在将它传递给 DataCell 列表 像这样。

    var myRows= [ ];
    for(int i = 0 ; i<sd.length;i++)
    {
    myRows.add(DataCell(child:Text(sd[i].name);
    myRows.add(DataCell(child:Text(sd[i].age);
    myRows.add(DataCell(child:Text(sd[i].height);
    }
    

    现在当你必须对表格进行排序时,请在 sort Icon Press 上执行此操作

    setState((){
    sd.sort((a,b)=>a.name.compareTo(b.name));
    });
    

    【讨论】:

    • 嗨@Aman Malhotra,我听从了你的建议,但它没有用,DataTable 的行需要一个小部件,我是新来的,但还没有弄清楚如何将字符串变成小部件,或者我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多