【问题标题】:How do I sort items in a list by DateTime in Flutter/Dart?如何在 Flutter/Dart 中按 DateTime 对列表中的项目进行排序?
【发布时间】:2019-10-20 10:37:18
【问题描述】:

我正在为我的叔叔制作一个应用程序,他让我制作这个应用程序来挑战我。我认为这是学习 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)),
            ],
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

    在大多数情况下,我认为最好从存储它们的数据库中对项目进行排序。同样的道理也适用于只显示今天的那些或收藏夹。这取决于您使用的数据库 - 但例如,如果您使用的是 SQFlite,它将是这样的:db.query(table, orderBy: "column_1 ASC, column_2 DESC"); 如果 column_1 是您的日期并且您希望从最早到最新。这样做还可以让您使用分页,这样您就不会一次查询表中的所有项目,如果您要处理很多项目,这是一个很好的做法。

    如果只有相当少的项目(大多数手机应该能够相当容易地处理

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多