簡體   English   中英

如何在Flutter / Dart中按DateTime對列表中的項目進行排序?

[英]How do I sort items in a list by DateTime in 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)),
            ],
          ),
        ),
      ),
    );
  }
}

實際上,這可以通過兩種方式完成。 一種是通過編程方式對條目列表進行排序,而另一種則是從存儲位置將它們排序。

在大多數情況下,我認為最好從存儲它們的數據庫中獲取排序的項目。 同樣,只顯示今天或最喜歡的商品也是如此。 這取決於您使用的數據庫-但是例如,如果您使用的是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)....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM