Giter Club home page Giter Club logo

time_chart's Introduction

time_chart

pub package

An amazing time chart in Flutter.

How the animation works?

The animation is created by determining the top hour and the bottom hour. The top hour denotes the most top hour displayed at the current scroll position, while the bottom hour represents its opposite. When scrolling occurs, the animation is triggered by comparing the previous top hour and bottom hour with the top hour and bottom hour after scrolling.

Chart Types

TimeChart AmountChart

Getting Started

1 - Depend on it

Add it to your package's pubspec.yaml file

dependencies:
  time_chart: ^0.5.4

2 - Install it

Install packages from the command line

flutter packages get

3 - Usage

Just input your DateTimeRange list to data: argument. The list must be sorted. First data is latest, last data is oldest.

Example

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

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

class MyApp extends StatelessWidget {

  // Data must be sorted.
  final data = [
    DateTimeRange(
      start: DateTime(2021,2,24,23,15),
      end: DateTime(2021,2,25,7,30),
    ),
    DateTimeRange(
      start: DateTime(2021,2,22,1,55),
      end: DateTime(2021,2,22,9,12),
    ),
    DateTimeRange(
      start: DateTime(2021,2,20,0,25),
      end: DateTime(2021,2,20,7,34),
    ),
    DateTimeRange(
      start: DateTime(2021,2,17,21,23),
      end: DateTime(2021,2,18,4,52),
    ),
    DateTimeRange(
      start: DateTime(2021,2,13,6,32),
      end: DateTime(2021,2,13,13,12),
    ),
    DateTimeRange(
      start: DateTime(2021,2,1,9,32),
      end: DateTime(2021,2,1,15,22),
    ),
    DateTimeRange(
      start: DateTime(2021,1,22,12,10),
      end: DateTime(2021,1,22,16,20),
    ),
  ];

  @override
  Widget build(BuildContext context) {
    final sizedBox = const SizedBox(height: 16);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Time chart example app')),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              children: [
                const Text('Weekly time chart'),
                TimeChart(
                  data: data,
                  viewMode: ViewMode.weekly,
                ),
                sizedBox,
                const Text('Monthly time chart'),
                TimeChart(
                  data: data,
                  viewMode: ViewMode.monthly,
                ),
                sizedBox,
                const Text('Weekly amount chart'),
                TimeChart(
                  data: data,
                  chartType: ChartType.amount,
                  viewMode: ViewMode.weekly,
                  barColor: Colors.deepPurple,
                ),
                sizedBox,
                const Text('Monthly amount chart'),
                TimeChart(
                  data: data,
                  chartType: ChartType.amount,
                  viewMode: ViewMode.monthly,
                  barColor: Colors.deepPurple,
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Supported languages

English Korean

You can also use korean language by Internationalizing Flutter apps.

time_chart's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

time_chart's Issues

Failed to Process Time Difference in second

image

The data list is reversed or not sorted. Check the data parameter. The first data must be newest data.
'package:time_chart/src/components/utils/time_data_processor.dart':
Failed assertion: line 133 pos 16: 'dataList[i - 1].end.isAfter(dataList[i].end)'

check the record 174 & 175(similar other records) , there is difference in seconds but i m getting the above error.

Package 0.5.4 crash with last flutter SDK

Hi, I'm getting this issue after flutter upgrade:
Error (Xcode): ../../../.pub-cache/hosted/pub.dev/time_chart-0.5.4/lib/src/components/scroll/my_single_child_scroll_view.dart:362:18: Error: The method '_RenderSingleChildViewport.getOffsetToReveal' has fewer named arguments than those of overridden method 'RenderAbstractViewport.getOffsetToReveal'.

Your help and support will be much appreciate.

Thanks,

Regards.

Intl & time_chart version not matched

Hi,
Can you please look into the attached error. I am unable to add this library due to version solving failed. I already tried with any but no result found. Can you please suggest some solution.

Screenshot 2023-09-28 at 5 13 11 PM

Chart doesn't display on IOS Emulator(physical phone didn't check)

Chart don't work on IOS emulator work on the example presented in README.

Error Log:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building CanvasTouchDetector(dirty, state:
_CanvasTouchDetectorState#ffa39):
Incorrect GestureDetector arguments.
Having both a pan gesture recognizer and a scale gesture recognizer is redundant; scale is a
superset of pan.
Just use the scale gesture recognizer.

The relevant error-causing widget was:
  CanvasTouchDetector
  CanvasTouchDetector:file:///Users/shaygettu/development/flutter_sdk/flutter/.pub-cache/hosted/pub.dartlang.org/time_chart-0.3.3/lib/src/chart.dart:470:28

When the exception was thrown, this was the stack:
#0      new GestureDetector.<anonymous closure> (package:flutter/src/widgets/gesture_detector.dart:245:14)
#1      new GestureDetector (package:flutter/src/widgets/gesture_detector.dart:263:9)
#2      _CanvasTouchDetectorState.build (package:touchable/src/canvas_touch_detector.dart:38:16)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4870:27)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4754:15)
#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735:5)
#8      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4919:11)
#9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729:5)
...     Normal element mounting (91 frames)
#100    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790:14)
#101    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6422:36)
#102    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6433:32)
...     Normal element mounting (7 frames)
#109    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790:14)
#110    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6422:36)
#111    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6433:32)
...     Normal element mounting (32 frames)
#143    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790:14)
#144    Element.updateChild (package:flutter/src/widgets/framework.dart:3540:18)
#145    _LayoutBuilderElement._layout.layoutCallback (package:flutter/src/widgets/layout_builder.dart:138:18)
#146    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2600:19)
#147    _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:156:12)
#148    RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1997:59)
#149    PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15)
#150    RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1997:14)
#151    RenderConstrainedLayoutBuilder.rebuildIfNecessary (package:flutter/src/widgets/layout_builder.dart:230:7)
#152    _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:319:5)
#153    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#154    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#155    RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:829:43)
#156    RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#157    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#158    _RenderSingleChildViewport.performLayout (package:flutter/src/widgets/single_child_scroll_view.dart:504:14)
#159    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#160    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#161    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#162    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#163    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#164    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#165    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#166    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#167    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#168    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#169    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#170    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#171    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#172    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#173    RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:896:45)
#174    RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#175    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#176    MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:12)
#177    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1005:7)
#178    MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
#179    RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#180    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#181    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#182    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#183    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#184    _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1376:11)
#185    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#186    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#187    RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:896:45)
#188    RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#189    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#190    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#191    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#192    RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:277:14)
#193    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#194    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#195    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#196    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#197    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#198    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#199    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#200    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#201    RenderStack._computeSize (package:flutter/src/rendering/stack.dart:570:43)
#202    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:597:12)
#203    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#204    _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:321:14)
#205    RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#206    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#207    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1731:7)
#208    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#209    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:497:19)
#210    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:883:13)
#211    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#212    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
#213    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)
#214    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:995:5)
#218    _invoke (dart:ui/hooks.dart:151:10)
#219    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#220    _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)

Screen Shot 2022-04-29 at 0 32 14

changing View Mode

When I try to change the ViewMode, errors occur in the design and the data is not displayed correctly, and I tried to add two widget and each of them with a different ViewMode, the same error occurs and the data is not displayed successfully ,

Couldn't find constructor TextScaler.linear

When I first try to use the component, I get this issue when building.

Error: Couldn't find constructor 'TextScaler.linear'.
tooltip_overlay.dart:124
        textScaler: const TextScaler.linear(1.0),
                          ^^^^^^
: Error: No named parameter with the name 'textScaler'.
tooltip_overlay.dart:124
        textScaler: const TextScaler.linear(1.0),
        ^^^^^^^^^^
: Context: Found this candidate, but the arguments don't match.
text.dart:428
  const Text(
        ^^^^
: Error: Couldn't find constructor 'TextScaler.linear'.
tooltip_overlay.dart:129
        textScaler: const TextScaler.linear(1.0),
                          ^^^^^^
: Error: No named parameter with the name 'textScaler'.
tooltip_overlay.dart:129
        textScaler: const TextScaler.linear(1.0),
        ^^^^^^^^^^
: Context: Found this candidate, but the arguments don't match.
text.dart:428
  const Text(
        ^^^^
: Error: Couldn't find constructor 'TextScaler.linear'.
tooltip_overlay.dart:149
          textScaler: const TextScaler.linear(1.0),
                            ^^^^^^

At the tooltip_overlay.dart:276

Resolve overflow and add disabling feature in tooltip

Hello Developers I am facing this problem (A RenderFlex overflowed by 8.0 pixels on the bottom.).

Bellow is my code:

TimeChart(
  data: controller.data,
  chartType: ChartType.amount,
  viewMode: ViewMode.weekly,
  barColor: Color(kPrimaryColor),
  height: Get.width,
  tooltipStart: "Opened",
  tooltipEnd: "Closed",
  tooltipDuration: Duration(seconds: 4),
),

snapshot is here:
image
Kindly handle this issue ASAP and add a param shawTooltip(true/false).

Add onBarSelected returning the TimeRangeClicked

Hi, it would be nice to have the possibility to get the time range when a bar is clicked/selected. Right now the widget shows a ToolTip but this will allow the widget to interact with others.

Thanks in advance for any support on this.

Limit the Y axis

When the maximum amount is high, the Y axis looks like this:
Bildschirmfoto 2022-05-26 um 16 05 34

It would be nice if the steps on the Y axis would be limited, just like in the Apple Health app:
IMG_3406

DateTimeRange OverFlow

Y-axis times slots are creating problem and hence while plotting graphs data is overflowing(Jumping to next day).

scroll chart get stuck with dynamic data ...

Hi,

I was having issues with the widget scroll when loading my data. It was strange because I was playing initially with sample data and everything was looking fine, but once I implemented my firebase method then I started experiencing the issue.

It appears that the widget scroll get freeze/stuck with dynamic data. Let's say you first load and empty List, then you load 10 days of data, in this scenario, the scroll do a bounce whenever you try to scroll and you can only see 1 page of data.

If you initially load 2 weeks of data (2 pages on your view) and you then load 3 or more weeks of data, the scroll bounce after the second page, and so on ...

This is the code I'm using just in case you want to reproduce.
computeDataForChart loads the data from Firestone, sampleData is part of the data I have in Firebase that I have copied just to doublecheck the scroll behaviour, so you can short the data to play around. finally my TimeChart widget.

// COMPUTE JOURNEY REGISTERS List<DateTimeRange> computeDataForChart( QuerySnapshot<Map<String, dynamic>>? d) { List<DateTimeRange> dates = []; if (d != null && d.docs.isNotEmpty) { for (var doc in d.docs) { if (doc['startTimes'] != null) { int i = 0; for (var s in doc['startTimes']) { dates.add(DateTimeRange( start: s.toDate(), end: (doc['timeFrames'] != null && doc['timeFrames'].length > i) ? s.toDate().add(Duration(seconds: doc['timeFrames'][i])) : today())); i++; } } } } return (dates.isEmpty) ? dates : dates.reversed.toList(); } }

List<DateTimeRange> sampleData = [ DateTimeRange( start: DateTime(2023, 07, 31, 08, 00), end: DateTime(2023, 07, 31, 13, 30), ), DateTimeRange( start: DateTime(2023, 07, 31, 14, 30), end: DateTime(2023, 07, 31, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 01, 08, 00), end: DateTime(2023, 08, 01, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 01, 14, 30), end: DateTime(2023, 08, 01, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 02, 08, 00), end: DateTime(2023, 08, 02, 16, 00), ), DateTimeRange( start: DateTime(2023, 08, 03, 08, 00), end: DateTime(2023, 08, 03, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 03, 14, 30), end: DateTime(2023, 08, 03, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 04, 08, 00), end: DateTime(2023, 08, 04, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 04, 14, 30), end: DateTime(2023, 08, 04, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 07, 08, 00), end: DateTime(2023, 08, 07, 17, 25), ), DateTimeRange( start: DateTime(2023, 08, 08, 08, 00), end: DateTime(2023, 08, 08, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 08, 14, 30), end: DateTime(2023, 08, 08, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 09, 08, 00), end: DateTime(2023, 08, 09, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 09, 14, 30), end: DateTime(2023, 08, 09, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 10, 08, 00), end: DateTime(2023, 08, 10, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 10, 14, 30), end: DateTime(2023, 08, 10, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 11, 08, 00), end: DateTime(2023, 08, 11, 17, 48), ), DateTimeRange( start: DateTime(2023, 08, 14, 08, 00), end: DateTime(2023, 08, 14, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 14, 14, 30), end: DateTime(2023, 08, 14, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 15, 08, 00), end: DateTime(2023, 08, 15, 13, 30), ), DateTimeRange( start: DateTime(2023, 08, 15, 14, 30), end: DateTime(2023, 08, 15, 17, 00), ), DateTimeRange( start: DateTime(2023, 08, 16, 08, 00), end: DateTime(2023, 08, 16, 15, 00), ), DateTimeRange( start: DateTime(2023, 08, 17, 08, 00), end: DateTime(2023, 08, 17, 15, 06), ), DateTimeRange( start: DateTime(2023, 08, 18, 08, 00), end: DateTime(2023, 08, 18, 12, 00), ), DateTimeRange( start: DateTime(2023, 08, 18, 13, 00), end: DateTime(2023, 08, 18, 15, 00), ), DateTimeRange( start: DateTime(2023, 08, 21, 08, 00), end: DateTime(2023, 08, 21, 15, 59), ), DateTimeRange( start: DateTime(2023, 08, 22, 08, 00), end: DateTime(2023, 08, 22, 16, 00), ), DateTimeRange( start: DateTime(2023, 08, 23, 08, 00), end: DateTime(2023, 08, 23, 21, 41), ), DateTimeRange( start: DateTime(2023, 08, 24, 08, 27), end: DateTime(2023, 08, 24, 19, 02), ), DateTimeRange( start: DateTime(2023, 08, 25, 08, 00), end: DateTime(2023, 08, 25, 14, 00), ), DateTimeRange( start: DateTime(2023, 08, 28, 09, 04), end: DateTime(2023, 08, 28, 18, 37), ), DateTimeRange( start: DateTime(2023, 08, 29, 08, 34), end: DateTime(2023, 08, 29, 18, 47), ), DateTimeRange( start: DateTime(2023, 08, 30, 07, 24), end: DateTime(2023, 08, 30, 16, 47), ), DateTimeRange( start: DateTime(2023, 08, 31, 08, 14), end: DateTime(2023, 08, 31, 21, 12), ), DateTimeRange( start: DateTime(2023, 09, 1, 08, 14), end: DateTime(2023, 09, 1, 21, 12), ) ].reversed.toList();

TimeChart( height: MediaQuery.of(context).size.height / 5, data: (r.computeDataForChart(data).isEmpty) ? r.sampleData : r.computeDataForChart(data),

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.