Flutter Hive:GroupBy 列表按日期

Posted

技术标签:

【中文标题】Flutter Hive:GroupBy 列表按日期【英文标题】:Flutter Hive: GroupBy the list By Date 【发布时间】:2020-04-01 22:47:43 【问题描述】:

我正在使用 Hive Flutter。我有一个这样的结果列表,但我想要 GroupBy 按日期列出的列表。

结果是我想要的,像这样:

2019 年 12 月 9 日,星期一

ggh ggh ggh ggh

我已经研究并找到了一些包:Collection Package。我尝试使用此脚本对列表进行分组,但打印不是我想要的:

var groupData = groupBy(historyList, (obj) => historyList);
                  print(historyList);

结果

I/flutter (23894): 2019-12-09 01:08:56.328: [Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive']
I/flutter (23894): 2019-12-09 00:57:22.455: [Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive']
I/flutter (23894): 2019-12-09 00:57:01.274: [Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive']
I/flutter (23894): 2019-12-09 00:56:56.992: [Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive']
I/flutter (23894): 2019-12-09 00:56:47.549: [Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive', Instance of 'HistoryModelHive']

这是我的模特:

WatchBoxBuilder(
          box: Hive.box("history_box"),
          builder: (ctx, boxx) 
            final historyList = boxx.values.toList().cast<HistoryModelHive>();
            historyList.sort((first, end) =>
                end.dateHistoryCreate.compareTo(first.dateHistoryCreate));
            if (historyList.isEmpty) 
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Image.asset(
                    "assets/images/empty2.png",
                    fit: BoxFit.cover,
                    height: 250,
                  ),
                  Text(
                    'Your History Empty',
                    textAlign: TextAlign.center,
                    style: textTheme.display1,
                  )
                ],
              );
             else 
              return ListView.builder(
                itemCount: boxx.length,
                itemBuilder: (BuildContext context, int i) 
                  final historyData = historyList[i];
                  var groupData = groupBy(
                      historyList, (obj) => historyData.dateHistoryCreate);
                  print(groupData);
                  return ListViewHistory(
                    id: historyData.id,
                    receiverName: historyData.receiverName,
                    amountDebt: historyData.amountDebt,
                    amountLack: historyData.amountLack,
                    amountSubstract: historyData.amountSubstract,
                    dateHistoryCreate: historyData.dateHistoryCreate,
                    imageReceiver: historyData.imageReceiver,
                    imageSignature: historyData.imageSignature,
                    nameAction: historyData.nameAction,
                  );
                ,
              );
            
          ,
        )),

【问题讨论】:

【参考方案1】:

你可以使用包https://pub.dev/packages/grouped_listview 您可以在下面复制粘贴运行完整代码

代码sn-p

List<History> historyList = [History("Monday, December 9,2019", "gghh"), History("Monday, December 11,2019", "1"), History("Monday, December 10,2019", "2"), History("Monday, December 9,2019", "gghh"),History("Monday, December 9,2019", "gghh"),History("Monday, December 10,2019", "5") ];

  @override
  Widget build(BuildContext context) 
    return GroupedListView<History, String>(
      collection: historyList,
      groupBy: (History g) => g.dateHistoryCreate,
      listBuilder: (BuildContext context, History g) => ListTile(title: Text(g.amountDebt.toString())),
      groupBuilder: (BuildContext context, String name) => Text(name),
    );
  

演示

完整代码

import 'package:flutter/material.dart';
import 'package:grouped_listview/grouped_listview.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(        
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  


class MyHomePage extends StatefulWidget 
  MyHomePage(Key key, this.title) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();


class _MyHomePageState extends State<MyHomePage> 
  int _counter = 0;

  void _incrementCounter() 
    setState(()       
      _counter++;
    );
  

  @override
  Widget build(BuildContext context)    
    return Scaffold(
      appBar: AppBar(        
        title: Text(widget.title),
      ),
      body: Center(        
        child: Column(          
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(flex: 1, child: ExampleWidget()),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  


class History 
  String dateHistoryCreate;
  String amountDebt;

  History(this.dateHistoryCreate, this.amountDebt);


class ExampleWidget extends StatelessWidget 
  List<History> historyList = [History("Monday, December 9,2019", "gghh"), History("Monday, December 11,2019", "1"), History("Monday, December 10,2019", "2"), History("Monday, December 9,2019", "gghh"),History("Monday, December 9,2019", "gghh"),History("Monday, December 10,2019", "5") ];
  @override
  Widget build(BuildContext context) 
    return GroupedListView<History, String>(
      collection: historyList,
      groupBy: (History g) => g.dateHistoryCreate,
      listBuilder: (BuildContext context, History g) => ListTile(title: Text(g.amountDebt.toString())),
      groupBuilder: (BuildContext context, String name) => Text(name),
    );
  

【讨论】:

这个包中有什么功能groupBuilder 更新和更好管理的包是:pub.dev/packages/grouped_list

以上是关于Flutter Hive:GroupBy 列表按日期的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中如何使用 Hive 存储数据

如何解决 Box not Found 错误 Hive Flutter

hive Groupby 输出未包含在groupby的字段

hive.groupby.skewindata为

使用 groupby 对不同的多列进行 Hive 优化

获取不同年份中按日/月的最早日期