当前位置: 首页 > 知识库问答 >
问题:

如何在Flutter/Dart中按日期时间对列表中的项目进行排序?

柯升
2023-03-14

我正在为我叔叔做一个应用程序,他让我做来挑战我。我认为这是学习颤振/飞镖的绝佳机会。我有这段代码(下面),但我需要它按日期时间组织一个列表(第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个答案

丁淇
2023-03-14

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

在大多数情况下,我认为最好从存储这些项的数据库中对它们进行排序。同样的,只展示今天的或最受欢迎的。这取决于您使用的数据库--但是,例如,如果您使用SQFlite,它应该是这样的:db.query(table,orderby:“column_1 ASC,column_2 desc”);如果column_1是您的日期,并且您想要最旧的到最新的。这样做还允许您使用分页,这样您就不会同时查询表中的所有项,如果要处理大量项,这是一个很好的做法。

如果只有相当少的项目数量(大多数手机应该能够相当容易地处理<1000个项目,而不会导致任何UI口吃),这是一个有点不同的情况,在dart中直接处理项目是一个更可行的选择。

为此,您可以调用条目..sort((item1,item2)=>item1.date.compareto(item2.date))假定.date是您试图按其排序的日期。请注意,这将对同一个列表进行内联排序--如果您不想更改原始列表,那么首先创建一个副本,即list.from(entrients)....

 类似资料:
  • 我有产品列表,其中包含产品名称和日期。我想根据日期和时间对项目列表进行排序。这是我要排序的项目列表, 这是我想要的预期输出,

  • 如何按照一个属性的字母顺序(不是名称,而是属性所包含的实际值)对一个对象列表进行排序?

  • 问题内容: 获取目录中所有文件的列表的最佳方法是什么,按日期排序[创建| 修改],在Windows机器上使用python? 问题答案: 这@Greg Hewgill是答案的更详细的版本。这是最符合问题要求的。它区分了创建日期和修改日期(至少在Windows上如此)。 例:

  • 问题内容: 如何对日期和/或日期时间对象列表进行排序?接受的答案在这里是不是为我工作: 问题答案: 你得到,因为它运行 在原地 ,这意味着它不返回任何东西,但修改列表本身。您只需要呼叫而无需再次分配。 有一个内置函数,该函数返回列表的排序版本-也会执行您想要的操作。

  • 我有这样一个情况: 我必须对进行排序,该列表还包含的ID,排序必须为: null

  • 我正在获取一个订单列表,并将对象存储在列表中。该对象有一个名为的属性,时间为格式。我想按对象的deliveryTime升序对列表进行排序。我创建了一个只有deliveryTime的字符串列表,并使用气泡排序按升序对它们进行排序。但是我很难按照这个顺序对整个对象列表进行排序。 注意:对象列表有一些&作为它们的值。 以下是不完整的代码: