GithubHelp home page GithubHelp logo

nslogx / flutter_easyloading Goto Github PK

View Code? Open in Web Editor NEW
1.2K 10.0 199.0 5.11 MB

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

Home Page: https://pub.dev/packages/flutter_easyloading

License: MIT License

Dart 60.58% Kotlin 0.11% Objective-C 0.03% Swift 1.06% HTML 1.03% CMake 16.66% C++ 19.21% C 1.31%
flutter-easyloading flutter loading indicator ios android dart toast widget spinkit custom-animation flutter-package flutter-widget flutter-plugin dartlang flutter-toast

flutter_easyloading's Introduction

Flutter EasyLoading

pub package pub points popularity likes license stars

English | 简体中文

Live Preview

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

Installing

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

dependencies:
  flutter_easyloading: ^latest

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

flutter_easyloading's People

Contributors

joaovvrodrigues avatar lilinxiang avatar nslogx 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  avatar  avatar

flutter_easyloading's Issues

toast的位置

Describe the Feature request
Please tell us the problem you are running into that led to you wanting
a new feature.

希望可以设置toast的位置,这个功能

真机打包 release版本无法关闭loading ?

//   lib/main.dart
void main() {
  runApp(new MyApp());
  if (Platform.isAndroid) {
    SystemUiOverlayStyle style = SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,

      ///这是设置状态栏的图标和字体的颜色
      ///Brightness.light  一般都是显示为白色
      ///Brightness.dark 一般都是显示为黑色
      statusBarIconBrightness: Brightness.light,
    );
    SystemChrome.setSystemUIOverlayStyle(style);
  }
  configLoading();
}

void configLoading() {
  EasyLoading.instance
    ..displayDuration = const Duration(milliseconds: 2500)
    ..indicatorType = EasyLoadingIndicatorType.ring
    ..loadingStyle = EasyLoadingStyle.custom
    ..indicatorSize = 45.0
    ..radius = 10.0
    ..progressColor = Colors.white
    ..backgroundColor = Colors.black.withOpacity(0.6)
    ..indicatorColor = Colors.white
    ..textColor = Colors.white
    ..maskColor = Colors.blue.withOpacity(0.5)
    ..userInteractions = false;
}


//   封装的请求 http.dart  关键代码

    _dio.interceptors
        .add(InterceptorsWrapper(onRequest: (RequestOptions options) {
      print("在请求之前的拦截信息>>>>");
      print(options.data);
      EasyLoading.show(status: '加载中...');
      return options;
    }, onResponse: (response) {
      print("在响应之前的拦截信息>>>>");
      print(response);
      if (DateTime.now().millisecondsSinceEpoch - time < 1000) {
        sleep(Duration(seconds: 1));
      }
      EasyLoading.dismiss();
      if (response.data['code'] != 0) {
        EasyLoading.showError(response.data['msg']);
      }
      return response;
    }, onError: (DioError e) {
      print("在错误之前的拦截信息>>>>");
      return e;
    }));

FlutterEasyLoading覆盖app组件是每个页面都需要吗?

class MyApp extends StatelessWidget {
@OverRide
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter EasyLoading',
theme: ThemeData(
primarySwatch: Colors.blue,
),
builder: (BuildContext context, Widget child) {
/// 确保 loading 组件能覆盖在其他组件之上.
return FlutterEasyLoading(
child: MyHomePage(title: 'Flutter EasyLoading'),
);
},
);
}
}

Colors not changes Android 9

EasyLoading.instance
    ..indicatorType = EasyLoadingIndicatorType.rotatingCircle
    ..maskColor = Color(0x7767E7A9)
    ..indicatorColor = Color(0x7767E7A9)
    ..progressColor = Color(0x7767E7A9)
    ..backgroundColor = Color(0x7767E7A9);

Indicator changes but colors not.

Touch to dismiss

Can I get a feature to dismiss with a touch inside or outside the loading dialog

`EasyLoading.show` `style` for user

aceyjA.png
Describe the Feature request
hope EasyLoading.show add textDirection parameter,like this

      code for:
      ```dart
      ...
      children: <Widget>[
        widget.indicator != null
            ? Container(
                margin: _status?.isNotEmpty == true
                    ? EasyLoadingTheme.textPadding
                    : EdgeInsets.zero,
                child: widget.indicator,
              )
            : null,
        _status?.isNotEmpty == true
            ? Text(
                _status,
               // for this
                style: textStyle,
                textAlign: EasyLoadingTheme.textAlign,
              )
            : null,
      ].where((w) => w != null).toList(),
      ...
      ```

异步调用出问题

这里调用
FutureBuilder(
future: Api.post_preview_study_home(params),

这是网络请求(代码执行到这EasyLoading.show(status: '加载中') 就不往下走了,什么原因 )
static Future post_preview_study_home(Map params) async {
print('params = $params');
EasyLoading.show(status: '加载中');
print(00000);
Response response = await http.post('/preview_study/home', params);
print(111111);
if (response.statusCode == 200) {
print(222222);
EasyLoading.dismiss();
Map dataMap = response.data;
return dataMap['data'];
} else {
EasyLoading.dismiss();
return null;
}
}

添加全局配置的showWidget

目前indicator全局配置只能使用固定的type

EasyLoading.instance
  ..indicatorType = EasyLoadingIndicatorType.fadingCircle
  ..indicatorSize = 45.0

能不能增加全局配置的自定义Widget方式

测滑页面后,无法关闭loading。

我尝试在deactive里边加入,dismiss,但是无法生效。(调用顺序)
手势侧滑后,无法自动关闭loading...弹窗(widget的顺序问题)
想了好久,好想目前手势返回,也没有合理的事件通知,应该就是这个解决方案的硬伤?
emememem...没有办法了...

While showing easyloading from actionsheet it throws exception sometime

While showing easyloading from actionsheet it throws exception sometime

ERROR MESSAGE
═══════ Exception caught by widgets library ═══════════════════
Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter ( 2346): At this point the state of the widget's element tree is no longer stable.
E/flutter ( 2346): 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.

Flutter/Dart info
[✓] Flutter (Channel dev, v1.16.4-pre.33, on Mac OS X 10.15.4 19E287, locale en-GB)
[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
✗ Android license status unknown.
Try re-installing or updating your Android SDK Manager.
See https://developer.android.com/studio/#downloads or visit visit
https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions.
[✓] Xcode - develop for iOS and macOS (Xcode 11.4.1)
[✓] Android Studio (version 3.6)
[✓] VS Code (version 1.45.0)
[✓] Connected device (1 available)

This is my code structure:

_signingOutUser(BuildContext context) async {
PlatformActionSheet().displaySheet(
context: context,
actions: [
ActionSheetAction(
text: "Logout",
hasArrow: false,
onPressed: () async {
(isIos) ? pop() : Navigator.pop(context);
EasyLoading.show(status: "Logging out...");
await SessionService.shared.clearSession(
callback: () {
EasyLoading.dismiss();
Future.delayed(Utils.keyboardDismissalDuration, () {
pushAndRemoveUntil(
LoginScreen(),
);
});
},
);
},
),
],
);
}

and I wrapped the root widget with FlutterEasyLoading().

Thanks in advance

希望可以增加自定义toast位置的api

Describe the Feature request
Please tell us the problem you are running into that led to you wanting
a new feature.

这个插件都挺好用的
可惜就是缺少了oktost那种可以自定义toast位置的api
希望作者可以加入谢谢!

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

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

从页面到另一个页面,页面无法显示easyloading

page1 被FlutterEasyLoading包裹 跳到 同样被FlutterEasyLoading包裹的page2 , page1可以显示easyloading,page2无法显示.
`import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@OverRide
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.light(),
home: PageOne(),
);
}
}

class PageOne extends StatelessWidget {
@OverRide
Widget build(BuildContext context) {
return FlutterEasyLoading(
child: Scaffold(
appBar: AppBar(),
body: Container(
child: Column(
children: [
FlatButton(
child: Text('show loading'),
onPressed: (){
EasyLoading.show();
Future.delayed(Duration(seconds: 2), (){
EasyLoading.dismiss();
});
},
),
FlatButton(
child: Text('page2'),
onPressed: (){
Navigator.push( context,
MaterialPageRoute(builder: (context) {
return PageTwo();
}));
},
)
],
),
),
),
);
}
}

class PageTwo extends StatelessWidget {
@OverRide
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: FlatButton(
child: Text('show loading'),
onPressed: (){
EasyLoading.show();
Future.delayed(Duration(seconds: 2), (){
EasyLoading.dismiss();
});
},
),
)
);
}
}
`

Yellow underline text

Texts have yellow underline. After many hours of debugging it in my app, i decided to check sample app. Sample app also has the same yellow underline. Here is a screenshot from sample app:
Snapshot

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.

'_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;
}

some error in 1.3.0

flutter: ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
flutter: The following assertion was thrown during performLayout():
flutter: 'package:flutter/src/painting/alignment.dart': Failed assertion: line 530 pos 12: 'direction !=
flutter: null': is not true.
flutter:
flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
flutter: more information in this error message to help you determine and fix the underlying cause.
flutter: In either case, please report this assertion by filing a bug on GitHub:
flutter: https://github.com/flutter/flutter/issues/new?template=BUG.md
flutter:
flutter: The relevant error-causing widget was:
flutter: Overlay
flutter: file:///Users/temp/Documents/flutter/.pub-cache/hosted/pub.flutter-io.cn/flutter_easyloading-1.3.0/lib/src/widgets/loading.dart:38:14
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #2 AlignmentDirectional.resolve (package:flutter/src/painting/alignment.dart:530:12)
flutter: #3 RenderStack._resolve (package:flutter/src/rendering/stack.dart:355:36)
flutter: #4 RenderStack.performLayout (package:flutter/src/rendering/stack.dart:470:5)
flutter: #5 RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #6 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #7 RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #8 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #9 RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #10 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #11 _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1232:11)
flutter: #12 RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
flutter: #13 RenderView.performLayout (package:flutter/src/rendering/view.dart:167:13)
flutter: #14 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1584:7)
flutter: #15 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:844:18)
flutter: #16 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:344:19)
flutter: #17 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:774:13)
flutter: #18 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:283:5)
flutter: #19 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1102:15)
flutter: #20 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1041:9)
flutter: #21 SchedulerBinding.scheduleWarmUpFrame. (package:flutter/src/scheduler/binding.dart:850:7)
flutter: #30 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:384:19)
flutter: #31 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:418:5)
flutter: #32 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)
flutter: (elided 10 frames from class _AssertionError, package dart:async, and package dart:async-patch)
flutter:
flutter: The following RenderObject was being processed when the exception was fired: RenderStack#e0869 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
flutter: creator: Stack ← _Theatre ← Overlay ← DefaultTextStyle ← AnimatedDefaultTextStyle ←
flutter: _InkFeatures-[GlobalKey#1dbf2 ink renderer] ← NotificationListener ←
flutter: PhysicalModel ← AnimatedPhysicalModel ← Material ← FlutterEasyLoading ← MyApp ← ⋯
flutter: parentData: not positioned; offset=Offset(0.0, 0.0) (can use size)
flutter: constraints: BoxConstraints(w=375.0, h=667.0)
flutter: size: MISSING
flutter: alignment: AlignmentDirectional.topStart
flutter: textDirection: null
flutter: fit: expand
flutter: overflow: clip
flutter: This RenderObject had the following descendants (showing up to depth 5):
flutter: child 1: RenderSemanticsAnnotations#c98e3 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: child: RenderSemanticsAnnotations#dca6e NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: child: _RenderTheatre#d5891 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: onstage: RenderStack#fa05d NEEDS-LAYOUT NEEDS-PAINT
flutter: no offstage children
flutter: child 2: RenderLimitedBox#a8688 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: child: RenderConstrainedBox#30926 NEEDS-LAYOUT NEEDS-PAINT
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: Another exception was thrown: RenderBox was not laid out: RenderStack#e0869 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: Another exception was thrown: RenderBox was not laid out: _RenderTheatre#daba9 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: Another exception was thrown: RenderBox was not laid out: _RenderInkFeatures#78397 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
flutter: Another exception was thrown: 'package:flutter/src/rendering/proxy_box.dart': Failed assertion: line 1702 pos 12: 'hasSize': is not true.
flutter: flutter main page name is default
flutter: ---initState
flutter: ---didChangeDependencies
flutter: FlutterBoost#onShownContainerChanged old:null now:default
flutter: Another exception was thrown: MissingPluginException(No implementation found for method listen on channel samples.flutter.dev/getLoginData)
flutter: Another exception was thrown: Updated layout information required for RenderSemanticsAnnotations#c98e3 NEEDS-LAYOUT NEEDS-PAINT to calculate semantics.
flutter: Another exception was thrown: RenderBox was not laid out: RenderPhysicalModel#cde1d
flutter: Another exception was thrown: 'package:flutter/src/rendering/proxy_box.dart': Failed assertion: line 1702 pos 12: 'hasSize': is not true.
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Cannot hit test a render box with no size.
The hitTest() method was called on this RenderBox: RenderPhysicalModel#cde1d:
needs compositing
creator: PhysicalModel ← AnimatedPhysicalModel ← Material ← FlutterEasyLoading ← MyApp ← [root]
parentData:
constraints: BoxConstraints(w=375.0, h=667.0)
size: MISSING
elevation: 0.0
color: Color(0xfffafafa)
shadowColor: Color(0xfffafafa)
shape: BoxShape.rectangle
borderRadius: BorderRadius.zero
Although this node is not marked as needing layout, its size is not set.
A RenderBox object must have an explicit size before it can be hit-tested. Make sure that the RenderBox in question sets its size during layout.
#0 RenderBox.hitTest. (package:flutter/src/rendering/box.dart:2118:9)
#1 RenderBox.hitTest (package:flutter/src/rendering/box.dart:2133:6)
#2 RenderPhysicalModel.hitTest (package:flutter/src/rendering/proxy_box.dart:1722:18)
#3 Re<…>
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Cannot hit test a render box with no size.
The hitTest() method was called on this RenderBox: RenderPhysicalModel#cde1d:
needs compositing
creator: PhysicalModel ← AnimatedPhysicalModel ← Material ← FlutterEasyLoading ← MyApp ← [root]
parentData:
constraints: BoxConstraints(w=375.0, h=667.0)
size: MISSING
elevation: 0.0
color: Color(0xfffafafa)
shadowColor: Color(0xfffafafa)
shape: BoxShape.rectangle
borderRadius: BorderRadius.zero
Although this node is not marked as needing layout, its size is not set.
A RenderBox object must have an explicit size before it can be hit-tested. Make sure that the RenderBox in question sets its size during layout.
#0 RenderBox.hitTest. (package:flutter/src/rendering/box.dart:2118:9)
#1 RenderBox.hitTest (package:flutter/src/rendering/box.dart:2133:6)
#2 RenderPhysicalModel.hitTest (package:flutter/src/rendering/proxy_box.dart:1722:18)
#3 Re<…>

Flutter 1.17 Error No Media Query Widget found when long pressed text field

Error No Media Query Widget found when long pressed text field that supposed to pop a copy-paste.
Cannot move Flutter easy loading below MaterialApp as we using onGenerateRoute and if we move below MaterialApp then in another route the loader is not showing.

Flutter/Dart Info

[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.19624.1000], locale en-GB)

[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[!] Android Studio (not installed)
[√] VS Code (version 1.43.1)
[!] Connected device
! No devices available

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#2a1a4](dirty, state: _OverlayEntryWidgetState#cdcca):
No MediaQuery widget found.

_OverlayEntryWidget widgets require a MediaQuery widget ancestor.
The specific widget that could not find a MediaQuery ancestor was: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#2a1a4]
  dirty
  state: _OverlayEntryWidgetState#cdcca
The ownership chain for the affected widget is: "_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#2a1a4] ← _Theatre ← Overlay ← Directionality ← FlutterEasyLoading ← HomeIndustryApp ← _InheritedProviderScope<DependenciesRepositories> ← RepositoryProvider<DependenciesRepositories> ← _InheritedProviderScope<AuthenticationBloc> ← InheritedProvider<AuthenticationBloc> ← ⋯"

Typically, the MediaQuery widget is introduced by the MaterialApp or WidgetsApp widget at the top of your application widget tree.

The relevant error-causing widget was: 
  FlutterEasyLoading file:///C:/ACTIVE%20DEV/ppl/post-rpl-mobile/lib/home_industry_app.dart:32:12
When the exception was thrown, this was the stack: 
#0      debugCheckHasMediaQuery.<anonymous closure> (package:flutter/src/widgets/debug.dart:215:7)
#1      debugCheckHasMediaQuery (package:flutter/src/widgets/debug.dart:227:4)
#2      _MaterialTextSelectionControls.buildToolbar (package:flutter/src/material/text_selection.dart:645:12)
#3      TextSelectionOverlay._buildToolbar (package:flutter/src/widgets/text_selection.dart:556:34)
#4      _OverlayEntryWidgetState.build (package:flutter/src/widgets/overlay.dart:177:34)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

TextField Error when you double tap or longpress while using flutter_easyloading

Describe the bug
With the new flutter update 1.17.0, anytime I double-tap or long-press the TextField, I get an error

ERROR MESSAGE
═══════ Exception caught by widgets library ═══════════════════

The following assertion was thrown building _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#8973d](dirty, state: _OverlayEntryWidgetState#3a398):
No MediaQuery widget found.

_OverlayEntryWidget widgets require a MediaQuery widget ancestor.
The specific widget that could not find a MediaQuery ancestor was: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#8973d]
dirty
state: _OverlayEntryWidgetState#3a398
The ownership chain for the affected widget is: "_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#8973d] ← _Theatre ← Overlay ← Directionality ← FlutterEasyLoading ← MyApp ← [root]"

Typically, the MediaQuery widget is introduced by the MaterialApp or WidgetsApp widget at the top of your application widget tree.

The relevant error-causing widget was
FlutterEasyLoading
lib\main.dart:34
When the exception was thrown, this was the stack
#0 debugCheckHasMediaQuery.
package:flutter/…/widgets/debug.dart:215
#1 debugCheckHasMediaQuery
package:flutter/…/widgets/debug.dart:227
#2 _MaterialTextSelectionControls.buildToolbar
package:flutter/…/material/text_selection.dart:645
#3 TextSelectionOverlay._buildToolbar
package:flutter/…/widgets/text_selection.dart:556
#4 _OverlayEntryWidgetState.build
package:flutter/…/widgets/overlay.dart:177
...
══════════════════════════════════════════════════════════════

═══════ Exception caught by widgets library ════════════════════════

No MediaQuery widget found.
The relevant error-causing widget was
FlutterEasyLoading
lib\main.dart:34
══════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ══════════════════════════

No MediaQuery widget found.
The relevant error-causing widget was
FlutterEasyLoading
lib\main.dart:34
══════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═════════════════════════════

No MediaQuery widget found.
The relevant error-causing widget was
FlutterEasyLoading
lib\main.dart:34
═══════════════════════════════════════════════════════════

This is my code structure

 @override
  Widget build(BuildContext context) {
    return FlutterEasyLoading(
      child: ChangeNotifierProvider<StateManagerHelper>(
        create: (context) => StateManagerHelper(),
        child: CustomMaterial(),
      ),
    );
  }

Flutter/Dart info
dell@EMEKA MINGW64 ~/VSC/FLUTTER/truthx (master)
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.17763.973], locale en-US)

[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[√] Android Studio (version 3.6)
[√] VS Code (version 1.45.0)
[√] Connected device (1 available)

• No issues found!

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

WhatsApp Image 2020-05-11 at 10 22 10 AM

【紧急】Interceptor中无法使用showToast

class AdapterInterceptor extends InterceptorsWrapper{
@OverRide
onRequest(RequestOptions options) async {
return options;
}

@override
onResponse(Response response) {
	BaseEntity baseEntity = BaseEntity.fromJson(response.data);
	if (baseEntity.code == 0) {
	
		return http.resolve(response.data);
	} else {
                    EasyLoading.showToast(
		 msg,
	      )
	}
}

}

Elevation

It would be nice if we could set elevation for the progress dialog(Like a Card())

存在并发问题

当一个EasyLoading.showSuccess('11111');连续除非二次就报错,比如
onTap: () { print('Get OTP Code'); EasyLoading.showSuccess('11111'); }
按钮联系点击二次出现异常
No MediaQuery widget found.
The relevant error-causing widget was
FlutterEasyLoading

点击遮罩关闭loading

能不能点击遮罩关闭loading,或者可以设置loading的show方法,默认几秒钟关闭

fluro跳转后 show出现在上一页

大佬这是报错的内容,push以后show要么没反应,要么出现在上一页,好像是丢失context造成的,不知道有什么办法可以解决
════════ 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.
package:flutter/…/widgets/framework.dart:3508

#1 Element._debugCheckStateIsActiveForAncestorLookup
package:flutter/…/widgets/framework.dart:3522

#2 Element.findAncestorStateOfType
package:flutter/…/widgets/framework.dart:3641

#3 Overlay.of
package:flutter/…/widgets/overlay.dart:237

#4 EasyLoading._show
package:flutter_easyloading/src/easy_loading.dart:338

...

Handler: "onTap"

Recognizer: TapGestureRecognizer#ece18

debugOwner: GestureDetector


state: ready


won arena


finalPosition: Offset(256.3, 404.3)


finalLocalPosition: Offset(256.3, 54.3)


button: 1


sent tap down

长按 输入框 报错

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building
flutter: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#53640](dirty, state:
flutter: _OverlayEntryWidgetState#0166b):
flutter: No MediaQuery widget found.
flutter: _OverlayEntryWidget widgets require a MediaQuery widget ancestor.
flutter: The specific widget that could not find a MediaQuery ancestor was:
flutter: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#53640]
flutter: The ownership chain for the affected widget is:
flutter: "_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#53640] ← _Theatre ← Overlay ←
flutter: Directionality ← FlutterEasyLoading ← Consumer2<ThemeModel, LocaleModel> ←
flutter: _DefaultInheritedProviderScope ← ChangeNotifierProvider ← _NestedHook
flutter: ← _DefaultInheritedProviderScope ← ⋯"
flutter: Typically, the MediaQuery widget is introduced by the MaterialApp or WidgetsApp widget at the top of
flutter: your application widget tree.
flutter:
flutter: The relevant error-causing widget was:
flutter: Overlay
flutter: file:///Users/benmo/flutter/.pub-cache/hosted/pub.flutter-io.cn/flutter_easyloading-1.1.1/lib/src/widgets/loading.dart:35:14
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0 debugCheckHasMediaQuery. (package:flutter/src/widgets/debug.dart:219:7)
flutter: #1 debugCheckHasMediaQuery (package:flutter/src/widgets/debug.dart:231:4)
flutter: #2 _CupertinoTextSelectionControls.buildToolbar (package:flutter/src/cupertino/text_selection.dart:307:12)
flutter: #3 TextSelectionOverlay._buildToolbar (package:flutter/src/widgets/text_selection.dart:556:34)
flutter: #4 _OverlayEntryWidgetState.build (package:flutter/src/widgets/overlay.dart:177:27)
flutter: #5 StatefulElement.build (package:flutter/src/widgets/framework.dart:4604:28)
flutter: #6 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4492:15)
flutter: #7 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4660:11)
flutter: #8 Element.rebuild (package:flutter/src/widgets/framework.dart:4216:5)
flutter: #9 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4475:5)
flutter: #10 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4651:11)
flutter: #11 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4470:5)
flutter: #12 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3444:14)
flutter: #13 Element.updateChild (package:flutter/src/widgets/framework.dart:3212:18)
flutter: #14 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5510:32)
flutter: #15 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5881:17)
flutter: #16 Element.updateChild (package:flutter/src/widgets/framework.dart:3199:15)
flutter: #17 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4512:16)
flutter: #18 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4660:11)
flutter: #19 Element.rebuild (package:flutter/src/widgets/framework.dart:4216:5)
flutter: #20 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2617:33)
flutter: #21 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:883:20)
flutter: #22 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:283:5)
flutter: #23 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1109:15)
flutter: #24 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1048:9)
flutter: #25 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:964:5)
flutter: #29 _invoke (dart:ui/hooks.dart:260:10)
flutter: #30 _drawFrame (dart:ui/hooks.dart:218:3)
flutter: (elided 3 frames from dart:async)
flutter:
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

App crash after long pressed on textfield

Describe the bug
App crash after doing long press to show paste option to textfield.

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#1396d](dirty, state: _OverlayEntryWidgetState#bcb2c):
No MediaQuery widget found.

_OverlayEntryWidget widgets require a MediaQuery widget ancestor.
The specific widget that could not find a MediaQuery ancestor was: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#1396d]
  dirty
  state: _OverlayEntryWidgetState#bcb2c
The ownership chain for the affected widget is: "_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#1396d] ← _Theatre ← Overlay ← Directionality ← FlutterEasyLoading ← App ← LocalizationProvider ← LocalizedApp ← [root]"

Typically, the MediaQuery widget is introduced by the MaterialApp or WidgetsApp widget at the top of your application widget tree.

The relevant error-causing widget was: 
  FlutterEasyLoading file:///Users/ngolinh/work/TCS/MG/mg/lib/app.dart:31:12
When the exception was thrown, this was the stack: 
#0      debugCheckHasMediaQuery.<anonymous closure> (package:flutter/src/widgets/debug.dart:217:7)
#1      debugCheckHasMediaQuery (package:flutter/src/widgets/debug.dart:229:4)
#2      _CupertinoTextSelectionControls.buildToolbar (package:flutter/src/cupertino/text_selection.dart:465:12)
#3      TextSelectionOverlay._buildToolbar (package:flutter/src/widgets/text_selection.dart:588:34)
#4      _OverlayEntryWidgetState.build (package:flutter/src/widgets/overlay.dart:179:34)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

My code:

return FlutterEasyLoading(
      child: MultiRepositoryProvider(
        providers: [
          RepositoryProvider<UserRepository>.value(value: userRepository),
          RepositoryProvider<TokenRepository>.value(value: tokenRepository),
        ],
        child: MultiBlocProvider(
          providers: [
            BlocProvider<AppBloc>.value(value: appBloc),
          ],
          child: LocalizationProvider(
              state: LocalizationProvider.of(context).state,
              child: MaterialApp(
                title: translate(I18n.APP_NAME),
                theme: AppTheme.defaultTheme,
                debugShowCheckedModeBanner: false,
                localizationsDelegates: [
                  GlobalMaterialLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate,
                  localizationDelegate,
                ],
                supportedLocales: localizationDelegate.supportedLocales,
                locale: localizationDelegate.currentLocale,
                onGenerateRoute: routes(),
              ),
            ),
          ),
      ),
    );

Flutter/Dart info

[✓] Flutter (Channel stable, 1.20.1, on Mac OS X 10.15.6 19G73, locale en-VN)
    • Flutter version 1.20.1 at /Users/Shared/flutter
    • Framework revision 2ae34518b8 (5 days ago), 2020-08-05 19:53:19 -0700
    • Engine revision c8e3b94853
    • Dart version 2.9.0

 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /Users/ngolinh/Library/Android/sdk
    • Platform android-29, build-tools 29.0.3
    • ANDROID_HOME = /Users/ngolinh/Library/Android/sdk
    • 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.6)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.6, Build version 11E708
    • CocoaPods version 1.8.4

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

[!] Android Studio
    • Android Studio at /Users/ngolinh/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/201.6720134/Android Studio 4.2 Preview.app/Contents
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

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

[✓] Connected device (1 available)
    • iPhone 11 Pro Max (mobile) • 3E380497-2C0E-4305-96A1-0315D2C58D77 • ios • com.apple.CoreSimulator.SimRuntime.iOS-13-6 (simulator)

Screenshots
https://gyazo.com/6bb59440ec27ebbff3fc59b6aaab7760

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);
  }
}

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.