Code Monkey home page Code Monkey logo

indexed_list_view's Introduction

pub package

indexed_list_view

Similar to a ListView, but:

  • Lets you programmatically jump to any item, by index.
  • The jump happens instantly, no matter if you have millions of items.
  • It can also animate the scroll, instead of jumping.

Limitations

The list is always infinite both to positive and negative indexes. In other words, it can be scrolled indefinitely both to the top and to the bottom.

In special, this is useful for implementing calendars, where you want to be able to jump to specific dates, as calendars can be scrolled indefinitely, both to the past and future dates.

You can define index bounds by giving it a minItemCount and maxItemCount, but this will not prevent the list from scrolling indefinitely. When showing items out of the index bounds, or when your itemBuilder returns null, it will ask the emptyItemBuilder to create an "empty" item to be displayed instead. As default, this will return empty containers.

Usage

Import the package

Add indexed_list_view as a dependency in your pubspec.yaml file, and then import it:

import 'package:indexed_list_view/indexed_list_view.dart';

Use the package

First, create an indexed scroll controller:

var controller = IndexedScrollController();

Optionally, you may setup an initial index and/or initial scroll offset:

var controller = IndexedScrollController(
    initialIndex: 75,
    initialScrollOffset : 30.0);    

Then, create the indexed list view, and pass it the controller:

IndexedListView.builder(
    controller: controller, 
    itemBuilder: itemBuilder);

There is also the separated constructor, same as ListView.separated:

IndexedListView.separated(
    controller: controller, 
    itemBuilder: itemBuilder,
    separatorBuilder: separatorBuilder);

To jump, use the controller methods like jumpToIndex :

controller.jumpToIndex(10000);

Details

The IndexedScrollController has not only an offset in pixels, but also an origin-index that indicates which item is considered to be at the offset position 0.0.

So there are two ways for you to move the list programmatically: You can change only the offset, or else change the originIndex and the offset at the same time.

To change the originIndex you make an "index jump". This jump is cheap, since it doesn't need to build all widgets between the old and new positions. It will just change the origin.

If you want to move the list programmatically you must create a scroll controller of type IndexedScrollController and pass it in the list constructor. However, if all you need is an infinite list without jumps, then there is no need to even create a controller.

You move the list programmatically by calling the controller methods.

Controller Methods

  1. jumpToIndex(index)

    The is the most common method for you to use. It jumps the origin-index to the given index, and the scroll-position to 0.0.

  2. jumpToIndexAndOffset(index, offset)

    Jumps the origin-index to the given index, and the scroll-position to offset, without animation.

  3. animateToIndex(index)

    If the current origin-index is already the same as the given index, animates the position from its current value to the offset position relative to the origin-index.

    However, if the current origin-index is different from the given index, this will jump to the new index, without any animation. In general, there are never animations when the index changes.

  4. animateToIndexAndOffset(index, offset)

    Same as animateToIndex() but also lets you specify the new offset.

  5. jumpTo(offset)

    Goes to origin-index "0", and then jumps the scroll position from its current value to the given offset, without animation.

  6. animateTo(offset)

    If the current origin-index is already "0", animates the position from its current value to the offset position.

    However, if the current origin-index is different from "0", this will jump to index "0" and the given offset, without any animation. In general, there are never animations when the index changes.

  7. jumpToWithSameOriginIndex(offset)

    Jumps the offset, relative to the current origin-index.

  8. animateToWithSameOriginIndex(offset)

    Animates the offset, relative to the current origin-index.

  9. jumpToRelative(offset)

    Jumps the offset, adding or subtracting from the current offset. It keeps the same origin-index.

  10. animateToRelative(offset)

    Animates the offset, adding or subtracting from the current offset. It keeps the same origin-index.

Don't forget to check the example tab. It shows an infinite list of items of different heights, and you may tap buttons to run some of the methods explained above.


This package got some ideas from Collin Jackson's code in StackOverflow , and uses lots of code from Simon Lightfoot's infinite_listview.

The Flutter packages I've authored:

My Medium Articles:

My article in the official Flutter documentation:


Marcelo Glasberg:
https://github.com/marcglasberg
https://linkedin.com/in/marcglasberg
https://twitter.com/glasbergmarcelo
https://stackoverflow.com/users/3411681/marcg
https://medium.com/@marcglasberg

indexed_list_view'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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

indexed_list_view's Issues

RangeError (index): does indexed_list_view can only be used if the list is indefinitely? Thank you!

Hi, I am learning how to use this widget. I replaced my ListView.builder to IndexedListView.builder and with a controller, my list only has a certain number of item, is this the reason I got this error?

my code looks like this:

IndexedListView.builder(
controller: controller,
itemBuilder: (context, index) {
return ListTile(
title: Text(_myList[index].title),
);

Does this work? how can i change it?

Also when we use controller.jumpTo(index), in the example, we only have something like controller.jumpTo(21), the index is a fixed number, but if I create a button and want to click to jump to a certain item, how do I know the index of that items?

Any help appreciated. Maybe it's not really an issue here, but how to apply, thank you!

Lu

[Feature Request] Quick Navigation (Scrollbar)

Thanks for your great work, been using it for a while. Working like a charm.
I think if someone needs a long list in flutter, they definitely need this.

However, I need a scrollbar for the users to navigate quickly in the list. I think it's a common feature for a list, I found some libs to achieve the same features, but none of them is correctly functioning.
Is that difficult to implement for the indexed list view?

List is not scrolling

Earlier I was using ListView.builder that time scrolling works perfectly,

when I replaced with IndexedListView.builder list is not scrolling at all.

Scroll to index does not work

I copied the example code as is and tried to run it. When I click on any of the 3 buttons to scroll, it throws this error and does nothing.

I/flutter (32287): ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
I/flutter (32287): The following assertion was thrown while dispatching notifications for IndexedScrollController:
I/flutter (32287): A IndexedScrollController was used after being disposed.
I/flutter (32287): Once you have called dispose() on a IndexedScrollController, it can no longer be used.
I/flutter (32287):
I/flutter (32287): When the exception was thrown, this was the stack:
I/flutter (32287): #0 ChangeNotifier._debugAssertNotDisposed. (package:flutter/src/foundation/change_notifier.dart:61:9)
I/flutter (32287): #1 ChangeNotifier._debugAssertNotDisposed (package:flutter/src/foundation/change_notifier.dart:67:6)
I/flutter (32287): #2 ChangeNotifier.dispose (package:flutter/src/foundation/change_notifier.dart:134:12)
I/flutter (32287): #3 ScrollController.dispose (package:flutter/src/widgets/scroll_controller.dart:198:11)
I/flutter (32287): #4 _IndexedListViewState._addPositiveControllerListener. (package:indexed_list_view/indexed_list_view.dart:154:30)
I/flutter (32287): #5 ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:161:21)
I/flutter (32287): #6 IndexedScrollController.jumpToIndex (package:indexed_list_view/indexed_list_view.dart:72:7)
I/flutter (32287): #7 _TestPageState.build. (file:///C:/Home/AndroidDevelopment/MoneyGuruFlutter/moneyguru/lib/ui/test_page.dart:212:47)
I/flutter (32287): #8 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:503:14)
I/flutter (32287): #9 _InkResponseState.build. (package:flutter/src/material/ink_well.dart:558:30)
I/flutter (32287): #10 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
I/flutter (32287): #11 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
I/flutter (32287): #12 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)
I/flutter (32287): #13 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
I/flutter (32287): #14 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
I/flutter (32287): #15 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
I/flutter (32287): #16 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:143:19)
I/flutter (32287): #17 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
I/flutter (32287): #18 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
I/flutter (32287): #19 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
I/flutter (32287): #20 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
I/flutter (32287): #21 _invoke1 (dart:ui/hooks.dart:142:13)
I/flutter (32287): #22 _dispatchPointerDataPacket (dart:ui/hooks.dart:99:5)
I/flutter (32287):
I/flutter (32287): The IndexedScrollController sending notification was:
I/flutter (32287): IndexedScrollController#f752d(one client, offset 0.0)

minScrollExtent = double.negativeinfinity causes perception of list hung

Sorry for filing one more issue :-(

Since you allow infinite scrolling on either side, when I scroll to the top of the list and pull it down, it gives a perception that the list view is hung since it's probably still processing the negativeinfinity scroll extent. I tried setting minScrollExtent = 0.0 and it seems to work fine.

Can you pl look into this as well?

How to get current index value?

Hi,
I have tried to use you library but now I am stucked here.

controller.addListener(() {
print("Now which index we are in "+controller.position.pixels.toString());
});
I have set listener I notice you cant get what is the current index which I have scroll too.

Another thing.
return (BuildContext context, int index) {
//
return Card(
child: Container(
//height: heights[index % 527],
color: (index == 0) ? Colors.red : Colors.green,
child: Center(child: Text('ITEM $index')),
),
);
};

How is this build I dont see any for loop or any list array here?

How to force the index to always start from zero?

I may be thinking about this in an incorrect way.
So I have a finite rather big list, and I need to have the possibility to jump to each record, so either a callback to get that index or know how to calculate it each time would be a good thing to know.
Sorry if this is super easy and this question is rather dump, I was checking the net for a correct list implementation for me to be suited with a big list and jump to index features and found your plugin, but could not get to understand how I could utilize it fully in my example.

Finite List Implementaion

Here is a workaround that memics the finite list, while at the same time preserves the jumpToIndex functionality. It's not perfect, and it requires some tweaks, but it works at least.

// main.dart
import 'package:flutter/material.dart';
import 'package:indexed_list_view/indexed_list_view.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      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 itemCount = 20; // <<< This is the only parameter that my solution requires

  int lastIndexRendered = 0;

  IndexedScrollController listController = IndexedScrollController();

  @override
  void initState() {
    void scrollListener() {
      if (lastIndexRendered < 0) {
        listController.jumpToIndex(0);
        setState(() {
          lastIndexRendered = 0;
        });
      } else if (lastIndexRendered > itemCount) {
        listController.jumpToIndexAndOffset(
          index: itemCount,
          offset: -listController.position.viewportDimension,
        );
        setState(() {
          lastIndexRendered = itemCount;
        });
      }
    }

    listController.addListener(scrollListener);

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: IndexedListView.builder(
        key: UniqueKey(),
        cacheExtent: 0.0,
        controller: listController,
        itemBuilder: (context, index) {
          lastIndexRendered = index;
          if (index < 0 || index > itemCount - 1) {
            return null;
          }
          return Padding(
            padding: const EdgeInsets.all(8.0),
            child: Card(
              elevation: 10.0,
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Text(
                    'Item ${index + 1}\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'),
              ),
            ),
          );
        },
      ),
    );
  }
}

Copy the code above and run the app to see the solution in action. Then let's consider the drawbacks and how can this solution be integrated in your package. I should have created a pull request, but I'm not very experienced with dart itself.

The first drawback is that we have to use a UniqueKey() in the IndexedListView.builder constructor. I don't know for sure if this could cause a performance issue. According to my tests I was able to create huge lists that scroll very well.

The second is that we have to set cacheExtent to 0.0. I don't know too if there is some use-cases where it should be set to a specific value. The default value is 250.0 by the way. But for my solution to work it has to be 0.0.

The third one, which is solvable but needs some work: suppose that we want to scroll to the last item. We have two cases here:

If the height of the last item is bigger than the viewport height: we can safely jumpToIndex(lastItemIndex);, like this:
image

But if the height of the last item is less than the viewport height, we will end up with something like this image:
image

When it should look like this (because it's supposed that we cannot scroll past the bottom of the last item):
image

The solution for this is to use jumpToIndexAndOffset, and calculate the offset as follows: offset = the height of the last item - the height of the viewport.
This works in general. If we know the height we can just use it in the equation. If we don't, we can use a globalKey (for the last item alone) and calculate the offset like this:

ourController.jumpToIndexAndOffset(
  index: itemCount - 1,
  offset: (globalKey.currentContext.size.height - ourController.position.viewportDimension),
);

However, I found that if the scroll velocity is big: the globalKey.currentContext would be null sometimes.

The other solution is more "hacky" and I did not try it myself yet, but I think it should work. If we define an effectively invisible widget just before the last item. For instance: a SizeBox with height of 1.0 and child of null. And whenever we want to scroll to the last item, we scroll to that invisible item like this:

ourController.jumpToIndexAndOffset(
  index: itemCount - 1,
  offset: (1.0 - ourController.position.viewportDimension),
);

This would solve the problem, and we only have to deal with my solution as if itemCount is itemCount + 1, which is not that hard.

Let me know what you think.

ScrollController attached to multiple scroll views

Somehow, changing the controller, list gets rebuild but is not functional, as underlying scroll controller ends up being attached to multiple places.

When the exception was thrown, this was the stack: 
#2      ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:108:12)
#3      ScrollController.offset (package:flutter/src/widgets/scroll_controller.dart:115:24)
#4      my code reading controller.offset
#5      ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:308:24)
#6      ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:308:24)
#7      ScrollPosition.notifyListeners (package:flutter/src/widgets/scroll_position.dart:969:11)
#8      ScrollPosition.setPixels (package:flutter/src/widgets/scroll_position.dart:278:9)
#9      ScrollPositionWithSingleContext.setPixels (package:flutter/src/widgets/scroll_position_with_single_context.dart:82:18)

I will try to dig deeper into the code to find an issue and suggest a fix, but maybe it is a known issue already?

ETA On Non-Infinite Lists?

I really don't want to be that guy but I am trying to go to production and the one thing that is stopping me is that I don't have jump to index in normal list view. I found this but unfortunately my use case can not have infinite lists.

Issue in scrolling if the index remains the same

Hello,
This code works awesomely well except I hit another issue today. I am using scrollToIndex when I go from a list screen to edit a record's details and then return back. Now if I keep editing the same record, the second time I return to the list screen, it scrolls to the first row (your code senses that there's no change in the index and if so, scrolls to 0.0) this is annoying. What happens if this check is removed in your code?
Thanks

loading more data

This is a great plugin.
However, when I use it, I cannot load more data.
I try to load it when judging the index range in itemBuilder,
Or judge index<-10 or index>length+10 in emptyItemBuilder,
But the effect is not ideal.

这是一个很棒的插件。
但是,我在使用时,无法实现加载更多数据。
我尝试在 itemBuilder 中 判断 index范围时 进行加载、
或是在 emptyItemBuilder 中 判断 index<-10 or index>length+10,
但是效果都不理想。

FixedExtentScrollPhysics behavior with IndexedListView

I'm finding this package absolutely essential for my current project, but I feel it misses one feature that would really round it off, physics behavior akin to that of FixedExtentScrollPhysics, where the scrolling focuses on specific items that it smoothly snaps to.

Example:
Example image of FixedExtentScrollPhysics behavior

Is there any possibility that this or something similar could/would be implemented? I believe FixedExtentScrollPhysics itself requires a certain controller to be used, which is incompatible with the IndexedListView, so possibly a new controller would have to be made for this too, or the current IndexedScrollController would need to be modified.

does it work with SliverList?

I have a list of items (paragraphs in a book) that have different sizes because of the text. I need to do a JumpToIndex, but I need to do this with SliverList because of the Impremented Header. I tried to implement, but JumpToIndex (37) always goes to the beginning of the scroll. Sorry for my lack of knowledge.

Support for Shinkwrap property, like with ListView?

Would it be possible to implement the shrinkwrap property, like ListView has, so that the IndexedListView doesn't expand to take up all of the available space given by the parent element when shrinkwrap=true?

Infinite limitation

Is there a way to get rid of infinite scrolling limitation?

I can limit negative side by setting minScrollExtent to 0. However I'm unable (perhaps simply too underexperianced) to calculate maxScrollExtent as I have a list of items with variable heights.

Stopping infinite scroll

Is there a way to stop the infinite scroll. Right now I have 5 Items in my list and I want the scroll to stop when it reaches item 0 or item 4 in the list.

I tried the maxItemCount=5 but it seems ignored, the scroll keeps on going either way. I am using Flutter Web at the moment.

[✓] Flutter (Channel beta, 1.19.0-4.1.pre, on Mac OS X 10.15.5 19F101, locale en-MX)
• Flutter version 1.19.0-4.1.pre at /Users/patrickbertsch/dev/flutter
• Framework revision f994b76974 (2 weeks ago), 2020-06-09 15:53:13 -0700
• Engine revision 9a28c3bcf4
• Dart version 2.9.0 (build 2.9.0-14.1.beta)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
• Android SDK at /Users/patrickbertsch/Library/Android/sdk
• Platform android-30, build-tools 30.0.0
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
• All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 11.5, Build version 11E608c
• CocoaPods version 1.9.0

[✓] Chrome - develop for the web
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.0)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 46.0.2
• Dart plugin version 193.7361
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

[✓] VS Code (version 1.46.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.11.0

IndexedListView scrolls up by itself without stopping

ParentWidget(
    child: IndexedListView.builder(
        // ...
    )
)

While scrolling up, I have a logic that as loads more data from my backend. When new data arrives ParentWidget is rebuild and this makes the IndexedListView scroll up by itself without stopping.
If I disable my logic to fetch new data then ParentWidget no longer gets rebuilt and the bug does not occur, so I think the issue happens when some parent of IndexedListView is rebuilt.

how to create a limited items ListView

such as I want to create a ListView contains 10 card .

"IndexedListView.builder()" have not such keyword like "itemCount" .
I don't know how to create it ?

Jump and animate confusion

First of all, great package. After some research yours is the only package that supports positive and negative ListView, which should really be a default behaviour in flutter but I digress.

I noticed the following issues:

  1. The animateTo() method is not forwarding the duration and curve parameter to the animateToIndexAndOffset() method. I've had to override this controller to be able to use it effectively with duration and curve.
  2. It took me a lot of hours to try and get a snapping behaviour to work, mainly because of the confusion around the animateToIndex() method. Finally, after hours of frustration, and testing, the animatetToIndex does not really do what the name suggest. It only animates back to an anchor point known as the _originIndex, and jumps each time a new index is called. So I abandoned its usage and tried other methods. May I suggest that it is renamed to animateToAnchor(). This would make it more clear. If developer wants to jump to a specific index, they could just use jumpTo() instead. Baking in a use case for jumping to an index in an "animate" method is confusing.
  3. I ended up using the animateToWithSameOriginIndex() method to achieve what I thought animateToIndex would achieve. I feel like this should have been named animateTo() though because it actually does the animation since the origin does not change. The animateTo() should really be renamed to jumpOrAnimateToAnchor() because it really only animates if the anchor hasn't changed from a previous programatic jump.
  4. Overall, I just think the explicit use of the word jump and animate to do what they are suppose to do will make it less confusing.
  5. May I suggest the change in the name of _originIndex to _anchorIndex as anchor seems to be more meaningful to understand the purpose of the index.
  6. Wrapping the IndexedListView with a NotificationListener to listen for scroll events seem to clash with the animation/jump method. To overcome this issue I had to delay the call to the animation code. See below:
    if (scrollInfo is ScrollEndNotification) {
      if (widget.controller.offset != itemStartLocation) {
        // Controller will only register the animation after a short delay
        Future.delayed(
          const Duration(milliseconds: 1),
          () => widget.controller.animateToWithSameOriginIndex(itemStartLocation, duration: widget.snappingSpeed, curve: widget.animationCurve),
        );
      }
    }

Sorry for the long post, but I do think that this is a really great package and I want it to gain more popularity and should really be adopted as part of the flutter SDK.

index_list_view flutter web support required

Hi , this plugin is great for my device application but i also want this plugin to support flutter web. When i include the plugin dependency in my project i see the following error.

Because every version of indexed_list_view depends on flutter any from sdk which is forbidden, indexed_list_view is forbidden.
So, because web_demo depends on indexed_list_view ^1.0.7, version solving failed.

Flutter version v1.9.1+hotfix.2 stable
Dart version 2.5.0

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.