【问题标题】:How to Group by date in Firebase Realtime Database in Flutter?如何在 Flutter 的 Firebase 实时数据库中按日期分组?
【发布时间】:2020-03-27 22:10:33
【问题描述】:

我想用 Flutter 对 Firebase 实时数据库中的数据列表进行分组。这是我的代码:

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'dart:async';
import 'package:intl/intl.dart'; // for formatting timestamp to datetime
import 'package:collection/collection.dart'; // for collection

class PlugModel {
  var key;
  var data;
  String hour;
  String minute;
  String day;
  String month;
  String year;

  PlugModel(this.key, this.hour, this.data);

  PlugModel.fromSnapshot(DataSnapshot snapshot)
      : key = snapshot.key,
        data = snapshot.value['data'],
        hour = DateFormat.H().format(
            DateTime.fromMillisecondsSinceEpoch(snapshot.value['time'])),
        minute = DateFormat.m().format(
            DateTime.fromMillisecondsSinceEpoch(snapshot.value['time'])),
        day = DateFormat.yMd().format(
            DateTime.fromMillisecondsSinceEpoch(snapshot.value['time'])),
        month = DateFormat.yM().format(
            DateTime.fromMillisecondsSinceEpoch(snapshot.value['time'])),
        year = DateFormat.y().format(
            DateTime.fromMillisecondsSinceEpoch(snapshot.value['time']));
}

class Plug extends StatefulWidget {
  final String data;
  final String userId;
  final String id;

  Plug({this.userId, this.data, this.id});

  @override
  _PlugState createState() => _PlugState();
}

class _PlugState extends State<Plug> {
  List _plugList;

  final FirebaseDatabase _database = FirebaseDatabase.instance;
  StreamSubscription<Event> _onDeviceAddedSubscription;

  @override
  void initState() {
    super.initState();

    _plugList = [];

    var _deviceQuery = _database
        .reference()
        .child(widget.userId)
        .child(widget.data)
        .child(widget.id);
    _onDeviceAddedSubscription =
        _deviceQuery.onChildAdded.listen(_onEntryAdded);
  }

  @override
  void dispose() {
    _onDeviceAddedSubscription.cancel();
    super.dispose();
  }

  _onEntryAdded(Event event) {
    setState(() {
      _plugList.add(PlugModel.fromSnapshot(event.snapshot));
    });
  }

  @override
  Widget build(BuildContext context) {
  ...
  }
}

所以,我想我的List (_plugList) 会是这样的:

_plugList = [
    PlugModel('1', 2.3, '1', '11', '2019-11-11', '2019-11', '2019'),
    PlugModel('2', 2.5, '2', '33', '2019-11-11', '2019-11', '2019'),
    PlugModel('3', 2.4, '4', '18', '2019-11-12', '2019-11', '2019'),
    PlugModel('4', 1.4, '5', '26', '2019-12-22', '2019-12', '2019'),
]

然后,如何根据日期对我的列表进行分组:

  1. 每日分组
{
    '2019-11-11' : 
       { 
           ('1', 2.3, '1', '11'),
           ('2', 2.5, '2', '33')
       }
    '2019-11-12' :
       {
          ('3', 2.4, '4', '18')
       }

}
  1. 每月分组(只需要当月所有数据的Sum
{
    '2019-11' : 
       { 
           (7.2),
       }
    '2019-12' :
       {
          (2.4)
       }

}

谢谢

【问题讨论】:

    标签: list flutter firebase-realtime-database group-by


    【解决方案1】:

    你需要两件事:

    1. 列表中的项目必须按照您希望对其进行分组的顺序排列。
    2. 您需要跟踪上次看到的“按值分组”。

    除了这两个之外,您可以遍历列表中的值并将它们分组为:

    
    var _plugList = [
        PlugModel('1', 2.3, '1', '11', '2019-11-11', '2019-11', '2019'),
        PlugModel('2', 2.5, '2', '33', '2019-11-11', '2019-11', '2019'),
        PlugModel('3', 2.4, '4', '18', '2019-11-12', '2019-11', '2019'),
        PlugModel('4', 1.4, '5', '26', '2019-12-22', '2019-12', '2019'),
    ];
    PlugModel lastPlug;
    for (var i=0; i < _plugList.length; i++) {
      var plug = _plugList[i];
      if (lastPlug?.day != plug.day) {
        print("It's a new day, yes it is: "+plug.day);
        lastPlug = plug;
      }
      print("  "+plug.key);
    }
    
    

    输出:

    flutter:这是新的一天,是的,它是:2019-11-11

    颤动:   1

    颤动:   2

    flutter:这是新的一天,是的,它是:2019-11-12

    颤动:   3

    flutter:新的一天,是的,是:2019-12-22

    颤动:   4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 2018-04-20
      • 2022-08-05
      • 2021-04-08
      • 1970-01-01
      • 2021-07-18
      • 2019-06-25
      • 1970-01-01
      相关资源
      最近更新 更多