【问题标题】:Sorting Columns in Flutters Data TableFlutters 数据表中的列排序
【发布时间】:2021-02-19 09:29:26
【问题描述】:

我正在尝试对 Flutter 数据表中的数据进行排序,但无论我尝试什么,要么什么都不做,要么返回此错误:The method 'sort' was called on null. Receiver: null Tried calling: sort(Closure: (VehicleData, VehicleData) => int)。我已经尝试了很多我在网上阅读的选项,但它们似乎都不起作用,所以它必须在我的代码中的某个地方。这里是:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'models/vehicle.dart';
import 'screens/vehicle_details_screen.dart';
import 'services/vehicle_api.dart';
import 'screens/edit_screen.dart';
import 'models/vehicle_data_provider.dart';
import 'package:http/http.dart' as http;

class VehicleList extends StatefulWidget {
  @override
  _VehicleList createState() => _VehicleList();
}

class _VehicleList extends State<VehicleList> {
  bool _sortNameAsc = true;
  bool _sortAsc = false;
  int _sortColumnIndex;
  List<VehicleData> _persons;

  _getPosts() async {
    HomePageProvider provider =
        Provider.of<HomePageProvider>(context, listen: false);

    var postsResponse = await fetchVehicles();
    if (postsResponse.isSuccessful) {
      provider.setPostsList(postsResponse.data, notify: false);
    } else {
      provider.mergePostsList(postsResponse.data, notify: false);
    }

    provider.setIsHomePageProcessing(false);
  }

  @override
  void initState() {
    _getPosts();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Consumer<HomePageProvider>(
          builder: (context, vehicleData, child) {
            return Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                SizedBox(
                  height: 12.0,
                ),
                Container(
                  decoration: BoxDecoration(
                    color: Colors.grey[300],
                    borderRadius: BorderRadius.all(
                      Radius.circular(12.0),
                    ),
                  ),
                  child: SingleChildScrollView(
                    child: DataTable(
                      sortColumnIndex: _sortColumnIndex,
                      sortAscending: _sortAsc,
                      columnSpacing: 30,
                      columns: <DataColumn>[
                        DataColumn(
                          numeric: false,
                          onSort: (columnIndex, sortAscending) {
                            setState(() {
                              if (columnIndex == _sortColumnIndex) {
                                _sortAsc = _sortNameAsc = sortAscending;
                              } else {
                                _sortColumnIndex = columnIndex;
                                _sortAsc = _sortNameAsc;
                              }
                              _persons.sort((a, b) =>
                                  a.friendlyName.compareTo(b.friendlyName));
                              if (!sortAscending) {
                                _persons = _persons.toList();
                              }
                            });
                          },
                          label: Text(
                            'Friendly Name',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                        DataColumn(
                          label: Text(
                            'Licence Plate',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                        DataColumn(
                          label: Text(
                            'Delete',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                      ],
                      rows: List.generate(
                        vehicleData.postsList.length,
                        (index) {
                          VehicleData post = vehicleData.getPostByIndex(index);
                          return DataRow(
                                  cells: <DataCell>[
                                    DataCell(
                                      Text('${post.friendlyName}'),
                                      onTap: () {
                                        Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                                builder: (context) =>
                                                    VehicleDetailsScreen(
                                                      color: post.color,
                                                      friendlyName:
                                                          post.friendlyName,
                                                      licencePlate:
                                                          post.licencePlate,
                                                    )));
                                      },
                                    ),
                                    DataCell(
                                      Text('${post.licencePlate}'),
                                    ),
                                    DataCell(
                                      IconButton(
                                        icon: Icon(Icons.delete),
                                        onPressed: () {
                                          vehicleData.deletePost(post);
                                        },
                                      ),
                                    ),
                                  ],
                                );
                        },
                      ),
                    ),
                  ),
                ),
              ],
            );
          },
        ),
      ],
    );
  }
}

我尝试将_sortASc 放入initState 并将其设置为false,但似乎没有奏效。任何帮助表示赞赏!

【问题讨论】:

    标签: flutter sorting mobile flutter-table


    【解决方案1】:

    您的_persons 列表为空。你可以初始化它。并在排序前检查是否为空。

      List<VehicleData> _persons = List<VehicleData>();
    
      // ...
    
      if(_persons != null) {
            _persons.sort((a, b) =>
                     a.friendlyName.compareTo(b.friendlyName));
            if (!sortAscending) {
                 _persons = _persons.toList();
            }
      }
    

    【讨论】:

    • 你说得对,我的_persons 列表为空,但我不知道为什么。我调用API,它填充了List&lt;VehicleData&gt;,然后我像你说的那样初始化它,但是为什么它仍然返回null?
    • 好的,所以我设法让它半工作,我用vehicleData.postList替换了_persons,因为那是我想要sort的数据,但现在它只排序一次从 A-Z 并在 if (!sortAscending) { vehicleData.postsList = vehicleData.postsList.toList(); } 中获取和错误 Error: The setter 'postsList' isn't defined for the class 'HomePageProvider'.。我不知道下一步该怎么做..
    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多