GithubHelp home page GithubHelp logo

flutter_listview_loadmore's Introduction

loadmore

pub package GitHub

A loadMore library

Support ListView and SliverList

中文构思思路和使用说明可以看简书

screenshot

img

whole example

show https://github.com/CaiJingLong/flutter_listview_loadmore

install

in pubspec.yaml

dependencies:
  loadmore: ^2.0.1

import in dartfile:

import 'package:loadmore/loadmore.dart';

use in build:

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Container(
        child: LoadMore(
          isFinish: count >= 60,
          onLoadMore: _loadMore,
          child: ListView.builder(
            itemBuilder: (BuildContext context, int index) {
              return Container(
                child: Text(list[index].toString()),
                height: 40.0,
                alignment: Alignment.center,
              );
            },
            itemCount: count,
          ),
        ),
      ),
    );
  }

  Future<bool> _loadMore() async {
    print("onLoadMore");
    await Future.delayed(Duration(seconds: 0, milliseconds: 100));
    load();
    return true;
  }

properties use:

child: Widget ,required , support ListView ListView.builder ListView.separated, other is not support.
onLoadMore:required A Function , `typedef Future<bool> FutureCallBack();` , reture true is success and status delay,return false or null ,then the status will change to fail.
isFinish: bool, optional, if true, then the status will change to finish ,default is false
delegate: LoadMoreDelegate,optional, see the LoadMoreDelegate class,default is DefaultLoadMoreDelegate
textBuilder: optional, the result will show in loading view ,if you use default delegate. default is DefaultLoadMoreText.chinese,
whenEmptyLoad: bool ,optional, default is true, when [whenEmptyLoad] is true, and when listView children length is 0,or the itemCount is 0,not build loadMoreWidget.
abstract class LoadMoreDelegate {
  const LoadMoreDelegate();

  double widgetHeight(LoadMoreStatus status) => _defaultLoadMoreHeight; // the loadMore height. default is 80.0

  Duration loadMoreDelay() => Duration(milliseconds: _loadMoreDelay);// When widget is created, the refresh delay time is triggered.

  Widget buildChild(LoadMoreStatus status); // build your widget in the loadmore widget.
}

other

homePage: https://github.com/CaiJingLong/flutter_listview_loadmore emailto me : [email protected]

LICENSE

APACHE 2.0

flutter_listview_loadmore's People

Contributors

caijinglong avatar

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  avatar

flutter_listview_loadmore's Issues

没滑动就触发了onLoadMore

触发onLoadMore的逻辑是什么,我这边Listview渲染了数据并且数据填满了布局,但还是直接加载了两次onLoadMore.
我运行了你的demo发现也是这样.
正常的逻辑不是滑动到底部时才会触发onLoadMore吗

Null check operator used on a null value

Non-fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: Null check operator used on a null value. Error thrown Instance of 'ErrorDescription'.
at State.context(State.java:916)
at DefaultLoadMoreViewState.notify(DefaultLoadMoreViewState.java:336)

Some users get this error. The reason for its occurrence is not clear to me.

Begin to loadMoreData at the half index of last page

Here is my implement:

Future<bool> loadMoreData() async {
    _offset += 1;
    print('loading offset: $_offset');
    final nextPageVendors =
        await VendorService.getVendors(null, offset: _offset, limit: 20);
    setState(() {
      _vendors.addAll(nextPageVendors);
    });
    print('vendor list length: ${_vendors.length}');
    return true;
  }

Container(
     height: 710.0,
     child: LoadMore(
          child: ListView.builder(
          itemCount: _vendors.length,
          itemBuilder: (context, index) {
               return _buildItem(context, index);
            },
         ),
         onLoadMore: loadMoreData,
         whenEmptyLoad: false,
         delegate: DefaultLoadMoreDelegate(),
         textBuilder: DefaultLoadMoreTextBuilder.chinese,
    ),
),

Widget _buildItem(BuildContext context, int index) {
    final vendor = _vendors[index];
    print('index: $index; ${vendor.id}: ${vendor.name}');
    vendor.lowestPrice = 10000.0;
     .
     .
     .
}

Here is the log:

flutter: message: Loading vendors page
flutter: index: 0; 6c1a77c5-34de-4fe2-8120-427028315cc1: quia earum officiis
flutter: index: 1; 0a816116-cd5b-4f5e-ae6f-5d0f33d97350: vero rerum quia
flutter: index: 2; 47655d0f-d8d4-4d4e-b877-9c1cfe1e4fba: officiis architecto error
flutter: index: 3; 44c5e2fb-fb76-4d45-976a-a522f4b59ad8: deserunt nulla nesciunt
flutter: index: 4; b4f3a245-488a-4ff1-95a0-720397ce6dc4: et asperiores modi
flutter: index: 5; 6217e370-6a82-4163-b98b-c14d8f2fee89: consectetur molestias qui
flutter: index: 6; 4986bbdb-d0fb-4f04-8c5b-857f0b50746a: rerum qui a
flutter: index: 7; 42087545-78bf-425f-9478-20f7182d5787: molestiae dolorum corporis
flutter: index: 8; 487e2cc6-889e-4219-9ea2-b5491e8d5c02: repudiandae vero eos
flutter: index: 9; e46dc760-ea55-4558-8d6d-281acdf09fa7: id et et
flutter: index: 10; 89d9c9d7-d098-4075-b64c-606eac23dc31: praesentium nisi excepturi
flutter: index: 11; 7a3e3733-bb0d-4a0e-8c98-858273a4ec70: explicabo optio et
flutter: index: 12; 27417b84-86e9-4410-b7d1-1d4df023960f: sit et explicabo
flutter: index: 13; bcdcbf0e-48ed-4292-b74b-477961d43a44: laudantium qui consequatur
flutter: index: 14; c5c22b16-4d74-4708-bdcf-d46f5b6f82de: amet ex quia
flutter: index: 15; dcda0448-9de7-4aa7-bde1-0f5f51fc80cc: consectetur rem quisquam
flutter: index: 16; 8fa42f72-1580-4ff7-b9c5-9118a24ab339: eos dolor est
flutter: index: 17; 98aaf0fd-a8cd-4b71-ab08-13d4cb877523: eius quaerat animi
flutter: index: 18; 7d8b18b0-99c0-4a92-b1d4-d9a6fb2b8240: temporibus quia eum
flutter: index: 19; 857041a2-4a62-48b0-b39f-6661aa0d8d78: totam doloribus ea
flutter: loading offset: 1
flutter: vendor list length: 40
flutter: index: 9; e46dc760-ea55-4558-8d6d-281acdf09fa7: id et et
flutter: index: 10; 89d9c9d7-d098-4075-b64c-606eac23dc31: praesentium nisi excepturi
flutter: index: 11; 7a3e3733-bb0d-4a0e-8c98-858273a4ec70: explicabo optio et
flutter: index: 12; 27417b84-86e9-4410-b7d1-1d4df023960f: sit et explicabo
flutter: index: 13; bcdcbf0e-48ed-4292-b74b-477961d43a44: laudantium qui consequatur
flutter: index: 14; c5c22b16-4d74-4708-bdcf-d46f5b6f82de: amet ex quia
flutter: index: 15; dcda0448-9de7-4aa7-bde1-0f5f51fc80cc: consectetur rem quisquam
flutter: index: 16; 8fa42f72-1580-4ff7-b9c5-9118a24ab339: eos dolor est
flutter: index: 17; 98aaf0fd-a8cd-4b71-ab08-13d4cb877523: eius quaerat animi
flutter: index: 18; 7d8b18b0-99c0-4a92-b1d4-d9a6fb2b8240: temporibus quia eum
flutter: index: 19; 857041a2-4a62-48b0-b39f-6661aa0d8d78: totam doloribus ea
flutter: index: 20; 329d86ce-5c68-4017-8eae-42cc1d9ab9f4: et sed et
flutter: index: 21; d5cbb21f-f634-4e6c-8673-ae42e55c7e44: a ut omnis
flutter: index: 22; 383d669a-b5d0-4bf6-9004-115ae38d31dc: possimus voluptas et
flutter: index: 23; 14840686-4e01-4ad9-ae1e-b6a54a197c57: et quaerat neque
flutter: index: 24; d40e8abd-66aa-49e1-bdca-eddf4d4b8a9e: eum libero ut
flutter: index: 25; 7b388a60-3c5e-4ed1-98a8-853386a94ec4: adipisci ad omnis
flutter: index: 26; 472ba950-088d-4a6c-ae9a-2a5967381745: enim voluptatem voluptates
flutter: index: 27; 2589add9-0bd9-406b-96c5-68b80af6c50b: sint ratione qui
flutter: index: 28; b0d60699-bb63-42bf-9390-cc855a45389b: amet repellendus dolorum
flutter: index: 29; dea58853-1f9b-40fd-b685-e17dc5beaed9: libero nihil repudiandae
flutter: index: 30; d9777fca-4603-4bb0-9139-783666b2eea9: laboriosam ea hic
flutter: index: 31; f83225ac-95f4-4172-a295-fc2a6c8f8d5c: dolorum id beatae
flutter: index: 32; 7a358d81-3ac3-4029-a365-08e08a47aa87: sint ullam voluptate
flutter: index: 33; a7a2e7be-f609-444c-a0d1-da3840215014: eum omnis velit
flutter: index: 34; 7010ff48-1dfc-4c5d-8be0-eaec1890b279: tempore voluptates ea
flutter: index: 35; be6633f8-3248-4977-ad21-aef8f8b34d5c: sed tempora in
flutter: index: 36; dbe1a887-9380-4d62-8ec6-6240224b8e78: quasi occaecati at
flutter: index: 37; a0f1f418-7c33-4032-8ea4-2f12b4e052bc: dolores in voluptatem
flutter: index: 38; 8d99f6a1-efd4-4cf6-b6b4-22f6e5e6a604: sed eveniet est
flutter: index: 39; aba591ff-57b1-4e1b-8436-7a5881776196: et nemo exercitationem
flutter: loading offset: 2
flutter: vendor list length: 60
flutter: index: 29; dea58853-1f9b-40fd-b685-e17dc5beaed9: libero nihil repudiandae
flutter: index: 30; d9777fca-4603-4bb0-9139-783666b2eea9: laboriosam ea hic
flutter: index: 31; f83225ac-95f4-4172-a295-fc2a6c8f8d5c: dolorum id beatae
flutter: index: 32; 7a358d81-3ac3-4029-a365-08e08a47aa87: sint ullam voluptate
flutter: index: 33; a7a2e7be-f609-444c-a0d1-da3840215014: eum omnis velit
flutter: index: 34; 7010ff48-1dfc-4c5d-8be0-eaec1890b279: tempore voluptates ea
flutter: index: 35; be6633f8-3248-4977-ad21-aef8f8b34d5c: sed tempora in
flutter: index: 36; dbe1a887-9380-4d62-8ec6-6240224b8e78: quasi occaecati at
flutter: index: 37; a0f1f418-7c33-4032-8ea4-2f12b4e052bc: dolores in voluptatem
flutter: index: 38; 8d99f6a1-efd4-4cf6-b6b4-22f6e5e6a604: sed eveniet est
flutter: index: 39; aba591ff-57b1-4e1b-8436-7a5881776196: et nemo exercitationem
flutter: index: 40; 48aeaa6b-79f0-43b2-b5cf-0a594f834846: temporibus quos eos
flutter: index: 41; 1ab7cef0-56fa-4d3c-80eb-026b5cb5fbd8: fugiat perferendis aut
flutter: index: 42; 82be954f-8ed4-4f4b-bf78-dd69262bcd26: voluptas velit id
flutter: index: 43; a999d0b5-3ffc-49cc-9458-7b34c3760048: dicta repellat dolor
flutter: index: 44; 8c0e370e-f221-4340-ad87-11e80bd6a753: molestiae ab necessitatibus
flutter: index: 45; fd3bde7b-2042-4784-b2d4-667833ee7057: excepturi inventore totam
flutter: index: 46; 1d7d9814-2ccd-418e-911a-9382f12f33be: reiciendis expedita ipsam
flutter: index: 47; cd884acd-2879-40dd-887f-8f3b05ad3479: rem in et
flutter: index: 48; f217c084-9aa7-4207-bdcd-819dde512fa5: et dolor dolorem
flutter: index: 49; 13fc90ac-54a6-4ed1-9a58-4a3c102e2a14: veritatis vitae qui

When I am loading the next page data, the list view builder is building the widget from the half index of the last page.

Please help, thanks.

Memory leak error while implementing the example

E/flutter (17074): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter (17074): setState() called after dispose(): _LoadMoreState#d9784(lifecycle state: defunct, not mounted)
E/flutter (17074): This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback. The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
E/flutter (17074): This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().
E/flutter (17074): #0      State.setState.<anonymous closure> 
package:flutter/…/widgets/framework.dart:1103
E/flutter (17074): #1      State.setState 
package:flutter/…/widgets/framework.dart:1129
E/flutter (17074): #2      _LoadMoreState._updateStatus 
package:loadmore/src/loadmore_widget.dart:176
E/flutter (17074): #3      _LoadMoreState.loadMore.<anonymous closure> 
package:loadmore/src/loadmore_widget.dart:189
E/flutter (17074): #4      _RootZone.runUnary (dart:async/zone.dart:1379:54)
E/flutter (17074): #5      _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
E/flutter (17074): #6      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
E/flutter (17074): #7      Future._propagateToListeners (dart:async/future_impl.dart:671:32)
E/flutter (17074): #8      Future._complete (dart:async/future_impl.dart:476:7)
E/flutter (17074): #9      _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter (17074): #10     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
E/flutter (17074): #11     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
E/flutter (17074): #12     _NewsViewState._onLoadMore (package:newsapp/ui/news/news_view.dart)
E/flutter (17074): <asynchronous suspension>
E/flutter (17074): #13     _LoadMoreState.loadMore 
package:loadmore/src/loadmore_widget.dart:186
E/flutter (17074): #14     _LoadMoreState._onLoadMoreBuild 
package:loadmore/src/loadmore_widget.dart:170
E/flutter (17074): #15     NotificationListener._dispatch 
package:flutter/…/widgets/notification_listener.dart:125
E/flutter (17074): #16     Notification.visitAncestor 
package:flutter/…/widgets/notification_listener.dart:45
E/flutter (17074): #17     Element.visitAncestorElements 
package:flutter/…/widgets/framework.dart:3344
E/flutter (17074): #18     Notification.dispatch 
package:flutter/…/widgets/notification_listener.dart:59
E/flutter (17074): #19     DefaultLoadMoreViewState.notify 
package:loadmore/src/loadmore_widget.dart:267
E/flutter (17074): <asynchronous suspension>
E/flutter (17074): #20     DefaultLoadMoreViewState.build 
package:loadmore/src/loadmore_widget.dart:244
E/flutter (17074): #21     StatefulElement.build 
package:flutter/…/widgets/framework.dart:3809
E/flutter (17074): #22     ComponentElement.performRebuild 
package:flutter/…/widgets/framework.dart:3721
E/flutter (17074): #23     Element.rebuild 
package:flutter/…/widgets/framework.dart:3547
E/flutter (17074): #24     StatefulElement.update 
package:flutter/…/widgets/framework.dart:3878
E/flutter (17074): #25     Element.updateChild 
package:flutter/…/widgets/framework.dart:2742

Load more loads all data at once.

My load more is loading all the data at once even if I have three different request bringing data at different time.


import 'package:flutter/material.dart';
import 'package:page_transition/page_transition.dart';
import 'package:smcmemberapp/Pages/SikhPhulwari/create.dart';
import 'package:loadmore/loadmore.dart';
import 'package:smcmemberapp/Router/ApiRouter.dart';
import 'package:smcmemberapp/utils.dart';

class SikhPhulwariPage extends StatefulWidget {
  const SikhPhulwariPage({Key? key}) : super(key: key);

  @override
  State<SikhPhulwariPage> createState() => _SikhPhulwariPageState();
}

class _SikhPhulwariPageState extends State<SikhPhulwariPage> {
  int get count => list.length;
  int totalCount = 10;
  List<dynamic> list = [];
  bool isLoading = true;
  ApiRoute router = ApiRoute();
  int page = 1;
  int totalPages = 1;
  Utils utils = Utils();

  Future<bool> _loadMore() async {
    await Future.delayed(Duration(seconds: 0, milliseconds: 100));
    if (page > totalPages) {
      return false;
    }
    load();
    return true;
  }

  void load() async {
    var req = await router
        .postResponseFromRoute("mobile_member_listMagazines_api", body: {
      "page": page.toString(),
      "limit": "10",
    });
    var res = await jsonDecode(req.body);
    if (res["status"] == "success") {
      print(res);
      if (mounted) {
        setState(() {
          list.addAll(res["data"]["rowData"]);
          totalCount = res["data"]["stats"]["rowCount"];
          totalPages = utils.countTotalPages(totalCount, 10);
        });
        page++;
      }
    }
    // print(list);
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // this.load();
    isLoading = false;
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return Scaffold(
        appBar: AppBar(
          title: Text("ਸਿੱਖ ਫੁੱਲਵਾੜੀ / Sikh Philwari"),
        ),
        body: Center(
          child: CircularProgressIndicator(),
        ),
      );
    }
    return Scaffold(
      bottomNavigationBar: BottomAppBar(
        // clipBehaviour: Clip.antiAlias,
        clipBehavior: Clip.antiAliasWithSaveLayer,
        shape: CircularNotchedRectangle(),
        notchMargin: 6,
        child: Container(
          height: 50.0,
          color: Colors.indigo,
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          Navigator.push(
            context,
            PageTransition(
                type: PageTransitionType.bottomToTop,
                child: SikhPhulwariCreate()),
          );
        },
      ),
      appBar: AppBar(
        title: Text("ਸਿੱਖ ਫੁੱਲਵਾੜੀ / Sikh Philwari"),
        actions: [],
      ),
      body: Container(
        child: RefreshIndicator(
          onRefresh: () async {
            await Future.delayed(Duration(seconds: 0, milliseconds: 100));
            setState(() {
              list = [];
              page = 1;
              load();
            });
          },
          child: LoadMore(
            isFinish: count >= totalCount,
            whenEmptyLoad: true,
            onLoadMore: _loadMore,
            textBuilder: DefaultLoadMoreTextBuilder.english,
            delegate: MyLoadMoreDelegate(),
            child: ListView.builder(
              itemBuilder: (BuildContext context, int index) {
                return Container(
                  child: ListTile(
                    title: Text(list[index]["name"]),
                    subtitle: Text(list[index]["id"].toString()),
                  ),
                );
              },
              itemCount: count,
            ),
          ),
        ),
      ),
    );
  }
}

class MyLoadMoreDelegate extends LoadMoreDelegate {
  const MyLoadMoreDelegate();
  @override
  Widget buildChild(LoadMoreStatus status,
      {LoadMoreTextBuilder builder = DefaultLoadMoreTextBuilder.english}) {
    double _defaultLoadMoreHeight = 100.0;
    double _loadmoreIndicatorSize = 50.0;
    String text = builder(status);
    if (status == LoadMoreStatus.fail) {
      return Container(
        child: Text(text),
      );
    }
    if (status == LoadMoreStatus.idle) {
      return Text(text);
    }
    if (status == LoadMoreStatus.loading) {
      return Container(
        alignment: Alignment.center,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            SizedBox(
              width: _loadmoreIndicatorSize,
              height: _loadmoreIndicatorSize,
              child: CircularProgressIndicator(
                backgroundColor: Colors.blue,
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(text),
            ),
          ],
        ),
      );
    }
    if (status == LoadMoreStatus.nomore) {
      return Text(text);
    }

    return Text(text);
  }
}

Please add isRetry parameter on load more

typedef Future<bool> FutureCallBack({bool isRetry});

   bool _onRetry(_RetryNotify notification) {
-    loadMore();
+    loadMore(isRetry: true);
     return false;
   }
-  void loadMore() {
+  void loadMore({bool isRetry = false}) {
     _updateStatus(LoadMoreStatus.loading);
-    widget.onLoadMore().then((v) {
+    widget.onLoadMore(isRetry: isRetry).then((v) {
       if (v == true) {
         // 成功,切换状态为空闲
         _updateStatus(LoadMoreStatus.idle);

to let us know if it is call by retry or first take

NoSuchMethodError: The method 'then' was called on null.

Code is working, but I have an exception

NoSuchMethodError: The method 'then' was called on null.
E/flutter ( 8335): Receiver: null
E/flutter ( 8335): Tried calling: then<dynamic>(Closure: (bool) => Null)

exception directs to method ->

void loadMore() {
    _updateStatus(LoadMoreStatus.loading);
    widget.onLoadMore().then((v) {
      if (v == true) {
        // 成功,切换状态为空闲
        _updateStatus(LoadMoreStatus.idle);
      } else {
        // 失败,切换状态为失败
        _updateStatus(LoadMoreStatus.fail);
      }
    });
  }

Exception during loading more items

Console output:

E/flutter ( 7904): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
E/flutter ( 7904): Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.
E/flutter ( 7904): #0      State.context.<anonymous closure> (package:flutter/src/widgets/framework.dart:910:9)
E/flutter ( 7904): #1      State.context (package:flutter/src/widgets/framework.dart:916:6)
E/flutter ( 7904): #2      DefaultLoadMoreViewState.notify (package:loadmore/src/loadmore_widget.dart:336:31)
E/flutter ( 7904): <asynchronous suspension>

loadMore + SilverList

Hey there,
thanks for these so-needed plugin! Would be possible to get this working with SilverLists? It would be great!

Thanks in advance

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.