如何在Flutter / Dart中按DateTime对列表中的项目进行排序?

时间:2019-06-04 21:34:09

标签: flutter dart

我正在为我的叔叔制作一个应用程序,他要求我制作此应用程序来挑战我。我认为这是学习Flutter / Dart的绝佳机会。我有下面的代码,但是我需要它通过DateTime来组织列表(第77行)。每个条目都至少具有一个字符串ID,一个DateTime变量,一个字符串名称和一些正文。

import 'package:flutter/material.dart';

import 'package:gym_tracker/model/diary_entry.dart';
import 'package:gym_tracker/utils/store.dart';

class HomeScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new HomeScreenState();
}

class HomeScreenState extends State<HomeScreen> {
  List<Entry> entries = getEntries();
  List<String> userFavorites = getFavoritesIDs();

  // Inactive widgets are going to call this method to
  // signalize the parent widget HomeScreen to refresh the list view.
  void _handleFavoritesListChanged(String entryID) {
    // Set new state and refresh the widget:
    setState(() {
      if (userFavorites.contains(entryID)) {
        userFavorites.remove(entryID);
      } else {
        userFavorites.add(entryID);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    Column _buildEntries(List<Entry> entriesList) {
      return Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
              itemCount: entriesList.length,
              itemBuilder: (BuildContext context, int index) {
                return ListTile(
                  title: Text(entriesList[index].name),
                );
              },
            ),
          ),
        ],
      );
    }

    const double _iconSize = 20.0;

    return DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: PreferredSize(
          // We set Size equal to passed height (50.0) and infinite width:
          preferredSize: Size.fromHeight(50.0),
          child: AppBar(
            backgroundColor: Colors.white,
            elevation: 2.0,
            bottom: TabBar(
              labelColor: Theme.of(context).indicatorColor,
              tabs: [
                Tab(icon: Icon(Icons.wb_sunny, size: _iconSize)),
                Tab(icon: Icon(Icons.date_range, size: _iconSize)),
                Tab(icon: Icon(Icons.bookmark, size: _iconSize)),
                Tab(icon: Icon(Icons.settings, size: _iconSize)),
              ],
            ),
          ),
        ),
        body: Padding(
          padding: EdgeInsets.all(5.0),
          child: TabBarView(
            // Replace placeholders:
            children: [
              // Display entries today:
              _buildEntries(entries.where((entry) => entry.dateTime.day == DateTime.now().day && entry.dateTime.month == DateTime.now().month && entry.dateTime.year == DateTime.now().year).toList()),
              // Display all entries:
              _buildEntries(entries.where((entry) => ).toList()), //Help Here Please!
              // Display favorite entries:
              _buildEntries(entries.where((entry) => userFavorites.contains(entry.id)).toList()),
              Center(child: Icon(Icons.settings)),
            ],
          ),
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:1)

实际上,这可以通过两种方式完成。一种是通过编程方式对条目列表进行排序,而另一种是从存储位置将它们排序。

在大多数情况下,我认为最好从存储它们的数据库中对这些项目进行排序。同样,只显示今天或最喜欢的商品也是如此。这取决于您使用的是哪个数据库-但是例如,如果您使用的是SQFlite,则可能是这样的:db.query(table, orderBy: "column_1 ASC, column_2 DESC");如果column_1是您的日期,并且您想从最早到最新。这样一来,您也可以使用分页,这样就不必立即查询表中的所有项目,如果您要处理很多项目,这是一个好习惯。

如果项目数量很少(大多数电话应该能够轻松处理<1000个项目而不会导致UI停顿),则情况略有不同,并且直接在飞镖上进行项目是一种更可行的选择。

在这种情况下,您要做的就是根据日期对列表进行排序。

为此,您可以致电entries..sort((item1, item2) => item1.date.compareTo(item2.date))并假设.date是您要订购的日期。请注意,这将对同一列表进行内联排序-如果您不想更改原始列表,请先进行复制,即List.from(entries)....