✨A clean and lightweight loading/toast widget for Flutter, easy to use without context, support iOS、Android and Web

Overview

Flutter EasyLoading

pub package pub points popularity likes license stars

English | 简体中文

Live Preview

👉 https://nslog11.github.io/flutter_easyloading

Installing

Add this to your package's pubspec.yaml file:

dependencies:
  flutter_easyloading: ^3.0.3

Import

import 'package:flutter_easyloading/flutter_easyloading.dart';

How to use

First, initialize EasyLoading in your MaterialApp/CupertinoApp:

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

Then, enjoy yourself:

EasyLoading.show(status: 'loading...');

EasyLoading.showProgress(0.3, status: 'downloading...');

EasyLoading.showSuccess('Great Success!');

EasyLoading.showError('Failed with Error');

EasyLoading.showInfo('Useful Information.');

EasyLoading.showToast('Toast');

EasyLoading.dismiss();

Add loading status callback

EasyLoading.addStatusCallback((status) {
  print('EasyLoading Status $status');
});

Remove loading status callback(s)

EasyLoading.removeCallback(statusCallback);

EasyLoading.removeAllCallbacks();

Customize

❗️ Note:

  • textColorindicatorColorprogressColorbackgroundColor only used for EasyLoadingStyle.custom.

  • maskColor only used for EasyLoadingMaskType.custom.

/// loading style, default [EasyLoadingStyle.dark].
EasyLoadingStyle loadingStyle;

/// loading indicator type, default [EasyLoadingIndicatorType.fadingCircle].
EasyLoadingIndicatorType indicatorType;

/// loading mask type, default [EasyLoadingMaskType.none].
EasyLoadingMaskType maskType;

/// toast position, default [EasyLoadingToastPosition.center].
EasyLoadingToastPosition toastPosition;

/// loading animationStyle, default [EasyLoadingAnimationStyle.opacity].
EasyLoadingAnimationStyle animationStyle;

/// loading custom animation, default null.
EasyLoadingAnimation customAnimation;

/// textAlign of status, default [TextAlign.center].
TextAlign textAlign;

/// textStyle of status, default null.
TextStyle textStyle;

/// content padding of loading.
EdgeInsets contentPadding;

/// padding of [status].
EdgeInsets textPadding;

/// size of indicator, default 40.0.
double indicatorSize;

/// radius of loading, default 5.0.
double radius;

/// fontSize of loading, default 15.0.
double fontSize;

/// width of progress indicator, default 2.0.
double progressWidth;

/// width of indicator, default 4.0, only used for [EasyLoadingIndicatorType.ring, EasyLoadingIndicatorType.dualRing].
double lineWidth;

/// display duration of [showSuccess] [showError] [showInfo], default 2000ms.
Duration displayDuration;

/// animation duration of indicator, default 200ms.
Duration animationDuration;

/// color of loading status, only used for [EasyLoadingStyle.custom].
Color textColor;

/// color of loading indicator, only used for [EasyLoadingStyle.custom].
Color indicatorColor;

/// progress color of loading, only used for [EasyLoadingStyle.custom].
Color progressColor;

/// background color of loading, only used for [EasyLoadingStyle.custom].
Color backgroundColor;

/// mask color of loading, only used for [EasyLoadingMaskType.custom].
Color maskColor;

/// should allow user interactions while loading is displayed.
bool userInteractions;

/// should dismiss on user tap.
bool dismissOnTap;

/// indicator widget of loading
Widget indicatorWidget;

/// success widget of loading
Widget successWidget;

/// error widget of loading
Widget errorWidget;

/// info widget of loading
Widget infoWidget;

Because of EasyLoading is a singleton, so you can custom loading style any where like this:

EasyLoading.instance
  ..displayDuration = const Duration(milliseconds: 2000)
  ..indicatorType = EasyLoadingIndicatorType.fadingCircle
  ..loadingStyle = EasyLoadingStyle.dark
  ..indicatorSize = 45.0
  ..radius = 10.0
  ..progressColor = Colors.yellow
  ..backgroundColor = Colors.green
  ..indicatorColor = Colors.yellow
  ..textColor = Colors.yellow
  ..maskColor = Colors.blue.withOpacity(0.5)
  ..userInteractions = true
  ..dismissOnTap = false
  ..customAnimation = CustomAnimation();

More indicatorType can see in 👉 flutter_spinkit showcase

Custom Animation

example: 👉 Custom Animation

Todo

  • add progress indicator

  • add custom animation

Changelog

CHANGELOG

License

MIT License

❤️ ❤️ ❤️

Thanks to flutter_spinkit ❤️

Supported by JetBrains Open Source

Comments
  • Exception when selecting text inside a FormField

    Exception when selecting text inside a FormField

    Steps to reproduce:

    1. Add TextField widget to the app (like this).
    2. Open the app and type some text in the field
    3. Try and select the text (to copy it for example)

    Log

    I/flutter (30736): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (30736): The following assertion was thrown building I/flutter (30736): _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#0c596](dirty, state: _OverlayEntryState#026a0): I/flutter (30736): No MediaQuery widget found. I/flutter (30736): _OverlayEntry widgets require a MediaQuery widget ancestor. I/flutter (30736): The specific widget that could not find a MediaQuery ancestor was: I/flutter (30736): _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#0c596] I/flutter (30736): The ownership chain for the affected widget is: I/flutter (30736): "_OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#0c596] ← Stack ← _Theatre ← Overlay ← I/flutter (30736): Directionality ← FlutterEasyLoading ← MyApp ← [root]" I/flutter (30736): Typically, the MediaQuery widget is introduced by the MaterialApp or WidgetsApp widget at the top of I/flutter (30736): your application widget tree. I/flutter (30736): I/flutter (30736): The relevant error-causing widget was: I/flutter (30736): Overlay file:///D:/Projects/flutter_easyloading/lib/src/widgets/loading.dart:35:14 I/flutter (30736): I/flutter (30736): When the exception was thrown, this was the stack: I/flutter (30736): #0 debugCheckHasMediaQuery. (package:flutter/src/widgets/debug.dart:219:7) I/flutter (30736): #1 debugCheckHasMediaQuery (package:flutter/src/widgets/debug.dart:231:4) I/flutter (30736): #2 _MaterialTextSelectionControls.buildToolbar (package:flutter/src/material/text_selection.dart:148:12) I/flutter (30736): #3 TextSelectionOverlay._buildToolbar (package:flutter/src/widgets/text_selection.dart:556:34) I/flutter (30736): #4 _OverlayEntryState.build (package:flutter/src/widgets/overlay.dart:169:25) I/flutter (30736): #5 StatefulElement.build (package:flutter/src/widgets/framework.dart:4440:27) I/flutter (30736): #6 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4329:15) I/flutter (30736): #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4053:5) I/flutter (30736): #8 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4312:5) I/flutter (30736): #9 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4487:11) I/flutter (30736): #10 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4307:5) I/flutter (30736): #11 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3297:14) I/flutter (30736): #12 Element.updateChild (package:flutter/src/widgets/framework.dart:3091:12) I/flutter (30736): #13 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5326:32) I/flutter (30736): #14 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5694:17) I/flutter (30736): #15 Element.updateChild (package:flutter/src/widgets/framework.dart:3080:15) I/flutter (30736): #16 _TheatreElement.update (package:flutter/src/widgets/overlay.dart:615:16) I/flutter (30736): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3080:15) I/flutter (30736): #18 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4349:16) I/flutter (30736): #19 Element.rebuild (package:flutter/src/widgets/framework.dart:4053:5) I/flutter (30736): #20 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2532:33) I/flutter (30736): #21 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:796:20) I/flutter (30736): #22 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:283:5) I/flutter (30736): #23 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1108:15) I/flutter (30736): #24 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1047:9) I/flutter (30736): #25 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:963:5) I/flutter (30736): #29 _invoke (dart:ui/hooks.dart:260:10) I/flutter (30736): #30 _drawFrame (dart:ui/hooks.dart:218:3) I/flutter (30736): (elided 3 frames from package dart:async) I/flutter (30736): I/flutter (30736): ════════════════════════════════════════════════════════════════════════════════════════════════════ I/flutter (30736): Another exception was thrown: No MediaQuery widget found.

    bug 
    opened by ice-j 19
  • '_overlay != null' error

    '_overlay != null' error

    use EasyLoading.show(status: "loading..."); Error!

    error stack: [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 132 pos 12: '_overlay != null': is not true. #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39) #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5) #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:132:12) #3 EasyLoading._remove (package:flutter_easyloading/src/easy_loading.dart:353:34) #4 EasyLoading._show (package:flutter_easyloading/src/easy_loading.dart:323:5) #5 EasyLoading.show (package:flutter_easyloading/src/easy_loading.dart:165:20) #6 OrderAction.getOrderDetail (package:novo/action/order_action.dart:156:17) #7 _OrderDetailState.initState (package:novo/page/order/order_detail.dart:66:19) #8 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4640:58) #9 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) #10 Element.inflat<…>

    this place: void _remove() { _getInstance().overlayEntry?.remove(); _getInstance()._overlayEntry = null; _getInstance()._key = null; _getInstance()._progress = null; _getInstance()._progressKey = null; }

    opened by genius1212 13
  • SpinKitPouringHourglass name changed

    SpinKitPouringHourglass name changed

    Describe the bug Try correcting the name to the name of an existing method, or defining a method named 'SpinKitPouringHourglass'. _indicator = SpinKitPouringHourglass( ^^^^^^^^^^^^^^^^^^^^^^^

    FAILURE: Build failed with an exception.

    The dependent flutter_spinkit package upgraded and the Class name SpinKitPouringHourglass changed to SpinKitPouringHourGlass , thus build error occures

    The related link is here

    opened by idemirel 11
  • dismissOnTap: true , has no effect

    dismissOnTap: true , has no effect

    Describe the bug flutter_easyloading: ^3.0.0

    EasyLoading.showToast(mesaj, toastPosition: EasyLoadingToastPosition.center, dismissOnTap: true, duration: Duration(seconds: 5));

    but toast is disappearing without requesting any tap.

    Flutter/Dart info please run flutter doctor then put it here. Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel beta, 2.0.1, on Microsoft Windows [Version 10.0.19041.867], locale en-US) [√] Android toolchain - develop for Android devices (Android SDK version 30.0.0) [√] Chrome - develop for the web [√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.9.1)
    [√] Android Studio (version 4.1.0) [√] VS Code (version 1.54.3) [√] Connected device (3 available)

    • No issues found!

    Screenshots If applicable, add screenshots to help explain your problem.

    opened by guyulmaz 10
  • Unsupported operation: Platform._operatingSystem

    Unsupported operation: Platform._operatingSystem

    Describe the bug when I use this plugin on flutter web, it crashes, the bug description is "Unsupported operation: Platform._operatingSystem The relevant error-causing widget was: ", it says "flutter_easyloading-2.2.2/lib/src/widgets/loading.dart:62:14", the code as follow

    @override
      Widget build(BuildContext context) {
        return Material(
          child: Overlay(
            initialEntries: [
              EasyLoadingOverlayEntry(
                builder: (BuildContext context) => widget.child,
              ),
              _overlayEntry,
            ],
          ),
        );
      }
    

    Screenshots

    opened by YueYongDev 10
  • 执行了几次dismiss后再执行dissmiss无效了

    执行了几次dismiss后再执行dissmiss无效了

    上传图片时需要显示loading, 使用了EasyLoading.show(status: '上传头像中…', dismissOnTap: false);,使用try{}catch(){}来捕捉,最终都会EasyLoadin.dismiss()掉,但是在无网状态下上传了两次消失之后再点击上传,这个loading框就再也不消失了,但是通过输出确认代码是走到了EasyLoading.dismiss()这一行的,想知道是啥原因

    opened by cherrybiu 9
  • Dialog中使用show不出来,没有报错

    Dialog中使用show不出来,没有报错

    之前在Dialog中可以正常使用,因为我是点击按钮直接弹窗,没有异步操作,但是现在我需要使用Dio框架请求数据回来后再弹窗,这时无论我怎么改,穷尽我能想象到的原因都无法解决,然后改用1.3.0版后可以show出来了,但是弹窗的遮罩层却变成不透明的了,像是给Dialog嵌了一层Material,并且之前的一些可以正常使用的非Dialog场景又出了问题,show不出来! 刚转flutter没多久,求大佬解救

    help wanted 
    opened by liangtian123 9
  • Looking up a deactivated widget's ancestor is unsafe.

    Looking up a deactivated widget's ancestor is unsafe.

    您好,异常信息如下:

    ════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
    The following assertion was thrown while handling a gesture:
    Looking up a deactivated widget's ancestor is unsafe.
    
    At this point the state of the widget's element tree is no longer stable.
    
    To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
    
    When the exception was thrown, this was the stack: 
    #0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3781:9)
    #1      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3795:6)
    #2      Element.findAncestorStateOfType (package:flutter/src/widgets/framework.dart:3914:12)
    #3      Overlay.of (package:flutter/src/widgets/overlay.dart:256:19)
    #4      EasyLoading._show (package:flutter_easyloading/src/easy_loading.dart:338:13)
    ...
    Handler: "onTap"
    Recognizer: TapGestureRecognizer#4bbd8
      debugOwner: GestureDetector
      state: ready
      won arena
      finalPosition: Offset(265.3, 280.0)
      finalLocalPosition: Offset(235.3, 7.0)
      button: 1
      sent tap down
    ════════════════════════════════════════════════════════════════════════════════════════════════════
    W/IInputConnectionWrapper( 8770): getTextBeforeCursor on inactive InputConnection
    W/IInputConnectionWrapper( 8770): getTextBeforeCursor on inactive InputConnection
    W/IInputConnectionWrapper( 8770): getTextBeforeCursor on inactive InputConnection
    W/IInputConnectionWrapper( 8770): getTextBeforeCursor on inactive InputConnection
    W/HiTouch_PressGestureDetector( 8770): Touch pointer move a lot. The moving distance of X is:20.0, limit is:60The moving distance of Y is:63.0, limit is:60
    

    以下是我部分代码:

    import 'package:flutter/material.dart';
    import 'package:flutter_easyloading/flutter_easyloading.dart'; 
    
    class UploadArticlePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          debugShowCheckedModeBanner: false,
          home: _UploadArticlePage(),
        );
      }
    }
    
    class _UploadArticlePage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => _UploadArticleState();
    }
    
    class _UploadArticleState extends State<_UploadArticlePage> {
    
      FocusNode _focusNode = FocusNode();
      TextEditingController _controller;
    
      @override
      void initState() {
        super.initState();
        _controller = new TextEditingController();
      }
    
      @override
      void dispose() { 
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        Widget uploadButtonSection = new Padding(
          padding: EdgeInsets.only(top: 20),
          child: new RawMaterialButton(
              elevation: 2,
              shape: new RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(6.0)),
              ),
              padding: EdgeInsets.all(8),
              splashColor: Colors.white70,
              fillColor: Colors.orange,
              child: new Text(
                '上传',
                textAlign: TextAlign.center,
                style: new TextStyle(
                  color: Colors.white,
                  fontSize: 18,
                ),
              ),
              onPressed: () {
                String uploadUrl = _controller.text.toString();
                if (uploadUrl.length == 0) {
                  hintToast('上传地址不能为空,快去复制吧');
                  return;
                }
                if (!uploadUrl.contains('mp.weixin.qq.com')) {
                  hintToast('仅支持上传微信公众号链接!');
                  return;
                }
                _postUploadArticle(uploadUrl);
              }),
        );
    
        return Scaffold(
            body: new GestureDetector(
          behavior: HitTestBehavior.translucent,
          onTap: () async {
            FocusScope.of(context).requestFocus(_focusNode);
          },
          child: new Container(
            alignment: Alignment.center,
            margin: EdgeInsets.all(30),
            child: new ListView(
              children: <Widget>[
                uploadButtonSection, 
              ],
            ),
          ),
        ));
      }
    
      void _postUploadArticle(String uploadUrl) {
        EasyLoading.show();
        HttpManager().post(
            url: uploadArticle,
            params: {
              'timestamp': currentTimeMillis(),
              'token': _userToken,
              'url': uploadUrl
            },
            successCallback: (date) {
              EasyLoading.dismiss();
              hintToast('上传成功~');
              _controller.clear();
            },
            errorCallback: (HttpError err) {
              EasyLoading.dismiss();
              hintToast(err.message);
              _controller.clear();
            },
            tag: requestTag);
      }
    }
    
    
    opened by HLQ-Struggle 8
  • 覆盖了背景图

    覆盖了背景图

    @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage("images/ic_new_vod_bg.png"), fit: BoxFit.cover, ) ), child: MaterialApp( home: Scaffold( backgroundColor: Colors.transparent, appBar: AppBar( backgroundColor: Colors.transparent, title: const Text('', style: TextStyle(fontSize: 24, fontWeight: FontWeight.w400),), ), body: Builder( builder: (context) { return Container( color: Colors.transparent, child: TreePage(), ); } ), ), builder: EasyLoading.init(), ), ); } DecorationImage出现异常

    opened by 673697831 6
  • overlayEntry should not be null

    overlayEntry should not be null

    Describe the bug I receive an error from flutter [VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: 'package:flutter_easyloading/src/easy_loading.dart': Failed assertion: line 428 pos 7: 'overlayEntry != null': overlayEntry should not be null

    Flutter/Dart info please run flutter doctor then put it here.

    Screenshots If applicable, add screenshots to help explain your problem.

    opened by stoppiNeobiz 6
  • dismiss异步

    dismiss异步

    dismiss这个方法异步操作真的让我很费解,弄成异步的问题,我描述下:

    • 某种场景,一个页面提交表单后(提交完后调用dismiss),立马跳转到下个页面,下个页面初始化时需要调用一堆接口,此时开启加载动画,同样是异步操作,此时上个页面异步dismiss此时就会调用,会关闭当前页面的加载动画。

    我看了下dismiss里面异步代码,也没啥异步取消操作,就算你搞成异步也没关系,至少要把返回类型搞成Future啊,至少能让我await dismiss结束,而不是让他在某个不确定的时间,跑出来执行不符合预期的效果。

    opened by xdd666t 6
  • 同时请求多个接口,使用loading的话,就会有闪屏的效果,不知道有没有只切换里面文本的使用方式

    同时请求多个接口,使用loading的话,就会有闪屏的效果,不知道有没有只切换里面文本的使用方式

    Describe the Feature request If request multiple interfaces at the same time and use loading, you will have a splash screen effect, I don't know if there is a way to use just switching the text inside 同时请求多个接口,使用loading的话,就会有闪屏的效果,不知道有没有只切换里面文本的使用方式

    opened by AKA-LinCoder 1
  • Fix description on the pubspec.yaml

    Fix description on the pubspec.yaml

    When using flutter_easyloading from git in the dependencies, it throws an exception on flutter pub get due to a strange character that exists in the description of the pubspec.yaml

    [my_app] flutter pub get
    Running "flutter pub get" in my_app...             
    Error on line 2, column 114: Unexpected character.
      ╷
    2 │ description: A clean and lightweight loading/toast widget for Flutter, Easy to use without context, Support iOS、Android and Web
      │                                                                                                                  ^
      ╵
    pub get failed (65;   ╵)
    exit code 65
    

    Includes the changes from PR #146 to fix #111 thanks to @berkanaslan, but updated with the new changes in the repository.

    opened by yeikel16 0
  • 请教一下,如何在设备切换到暗黑模式的时候,easyloading能跟着切换?

    请教一下,如何在设备切换到暗黑模式的时候,easyloading能跟着切换?

    请教一下,如何在设备切换到暗黑模式的时候,easyloading能跟着切换? 我尝试了,发现easyloading无法实时切换,必须杀掉应用,再次启动才行。

    要不要扩展一下相关api,或者把easyaloading的单例给个destroy的机会,这样再手动调用init应该也可以的吧? 期待您的答复。

    opened by joeyzhao1005 1
Releases(v3.0.0)
Shimmer loading - A Flutter project to show how to add shimmer loading animation

shimmer_loading A Flutter project to show how to add shimmer loading animation.

null 0 Feb 6, 2022
A flutter package which contains a collection of some cool and beautiful effects; support android and ios

flutter effects A flutter package which contains a collection of some cool and beautiful effects; support android and ios . Screenshot type support ch

大海豚 462 Jan 3, 2023
Android loading animations

Android-SpinKit Android loading animations(I wrote a android edition according SpinKit) Demo Apk Preview Gradle Dependency dependencies { implement

ybq 8.4k Dec 30, 2022
This repository demonstrates use of various widgets in flutter and tricks to create beautiful UI elements in flutter for Android and IOS

AwesomeFlutterUI The purpose of this repository is to demonstrate the use of different widgets and tricks in flutter and how to use them in your proje

Subir Chakraborty 132 Nov 13, 2022
Flutter ListView and GridView that shows Loading Widgets before the real data is loaded.

loadinglistview This package provide an easy way to show loading indicator(Widget) in a listview or a gridview while the app is still fetching the rea

null 3 Dec 8, 2021
Help you to build pull-down refresh and pull-up loading in the simplest way.

frefresh Help you to build pull-down refresh and pull-up loading in the simplest way. Although unprecedented simplicity, but the effect is amazing. It

Fliggy Mobile 427 Nov 26, 2022
✨ A collection of loading indicators animated with flutter. Heavily Inspired by http://tobiasahlin.com/spinkit.

✨ Flutter Spinkit A collection of loading indicators animated with flutter. Heavily inspired by @tobiasahlin's SpinKit. ?? Installing dependencies:

Jeremiah Ogbomo 2.7k Dec 30, 2022
Loading Animation With Flutter

Flutter Loading Animation loading.ista.mp4 A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few re

Join Flutter 17 Oct 13, 2022
Lazy Loading Flutter Plugin

flutter_placeholder_textlines A simple plugin to generate placeholder lines that emulates text in a UI, useful for displaying placeholder content whil

Victor HG 21 Apr 12, 2022
A Flutter package with a selection of simple yet very customizable set of loading animations.

Flutter Loading Animations A simple yet very customizable set of loading animations for Flutter projects. Installation Add the following to your pubsp

Andre Cytryn 171 Sep 23, 2022
A Flutter library for loading skeletons

TODO: Put a short description of the package here that helps potential users know whether this package might be useful for them. Features TODO: List w

Daniel 0 Jan 6, 2022
A collection of awesome flutter loading animation

loading_indicator_view A collection of awesome flutter loading animation Demo Usage loading_indicator_view: ^1.1.0 Animation types Type Type Type Typ

Vans Z 84 Dec 6, 2022
A collection of loading indicators animated with CSS

SpinKit Simple loading spinners animated with CSS. See demo. SpinKit only uses (transform and opacity) CSS animations to create smooth and easily cust

Tobias Ahlin 19k Dec 26, 2022
A collection of awesome loading animations

NVActivityIndicatorView ⚠️ Check out LoaderUI (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. ?? Introduction

Vinh Nguyen 10.3k Jan 3, 2023
Delightful, performance-focused pure css loading animations.

Loaders.css Delightful and performance-focused pure css loading animations. What is this? See the demo A collection of loading animations written enti

Connor Atherton 10.2k Jan 2, 2023
A simple custom loading indicator package.

custom_loading_indicator A Flutter package to customise the loading indicators with your organisation's logo. Let's say you're a dentist and your app

Harshad Manglani 3 Aug 10, 2020
Loading times are unavoidable in application development. From a user experience (UX) perspective

loading A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this

azzouz abdelhakim 2 Feb 12, 2022
An animation Framework for Flutter. It is state-based, declarative, extensible, composable and easy to use.

⚠️ This package is in an early state of development. If you find any bugs or have any suggestions, please open an issue. Fleet is an animation framewo

Gabriel Terwesten 3 Sep 29, 2022
Flexible and easy to use page transitions.

flutter_villains What are heroes without villains? (Profile image from: https://unsplash.com/photos/pAs4IM6OGWI) Check out the article. What are villa

Norbert Kozsir 356 Dec 12, 2022