diff --git a/CHANGELOG.md b/CHANGELOG.md
index ed0390c..fdedf55 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## [3.0.0] - 2021.03.12
+
+* 🎉 It's support Null Safety now
+
## [2.2.2] - 2020.12.28
* fixed [#77](https://github.com/kokohuang/flutter_easyloading/issues/77)
diff --git a/README-zh_CN.md b/README-zh_CN.md
index 3b0f297..30b9fa4 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -16,7 +16,7 @@
```yaml
dependencies:
- flutter_easyloading: ^2.2.2
+ flutter_easyloading: ^3.0.0
```
## 导入
diff --git a/README.md b/README.md
index 3a74dc0..baaa8eb 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ Add this to your package's `pubspec.yaml` file:
```yaml
dependencies:
- flutter_easyloading: ^2.2.2
+ flutter_easyloading: ^3.0.0
```
## Import
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..919434a 100644
--- a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
+ location = "self:">
diff --git a/example/lib/custom_animation.dart b/example/lib/custom_animation.dart
index 8c7bfbd..af00820 100644
--- a/example/lib/custom_animation.dart
+++ b/example/lib/custom_animation.dart
@@ -10,9 +10,8 @@ class CustomAnimation extends EasyLoadingAnimation {
AnimationController controller,
AlignmentGeometry alignment,
) {
- double opacity = controller?.value ?? 0;
return Opacity(
- opacity: opacity,
+ opacity: controller.value,
child: RotationTransition(
turns: controller,
child: child,
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 6da70be..85266e2 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -46,17 +46,17 @@ class MyApp extends StatelessWidget {
}
class MyHomePage extends StatefulWidget {
- MyHomePage({Key key, this.title}) : super(key: key);
+ MyHomePage({Key? key, this.title}) : super(key: key);
- final String title;
+ final String? title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
- Timer _timer;
- double _progress;
+ Timer? _timer;
+ late double _progress;
@override
void initState() {
@@ -75,7 +75,7 @@ class _MyHomePageState extends State {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
- title: Text(widget.title),
+ title: Text(widget.title ?? ''),
),
body: Container(
width: MediaQuery.of(context).size.width,
@@ -89,8 +89,7 @@ class _MyHomePageState extends State {
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
children: [
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('open test page'),
onPressed: () {
_timer?.cancel();
@@ -102,8 +101,7 @@ class _MyHomePageState extends State {
);
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('dismiss'),
onPressed: () async {
_timer?.cancel();
@@ -111,8 +109,7 @@ class _MyHomePageState extends State {
print('EasyLoading dismiss');
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('show'),
onPressed: () async {
_timer?.cancel();
@@ -123,8 +120,7 @@ class _MyHomePageState extends State {
print('EasyLoading show');
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('showToast'),
onPressed: () {
_timer?.cancel();
@@ -133,8 +129,7 @@ class _MyHomePageState extends State {
);
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('showSuccess'),
onPressed: () async {
_timer?.cancel();
@@ -142,24 +137,21 @@ class _MyHomePageState extends State {
print('EasyLoading showSuccess');
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('showError'),
onPressed: () {
_timer?.cancel();
EasyLoading.showError('Failed with Error');
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('showInfo'),
onPressed: () {
_timer?.cancel();
EasyLoading.showInfo('Useful Information.');
},
),
- FlatButton(
- textColor: Colors.blue,
+ TextButton(
child: Text('showProgress'),
onPressed: () {
_progress = 0;
diff --git a/example/lib/test.dart b/example/lib/test.dart
index d551788..02878a0 100644
--- a/example/lib/test.dart
+++ b/example/lib/test.dart
@@ -1,6 +1,7 @@
+import 'dart:io';
+
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
-import 'package:dio/dio.dart';
class TestPage extends StatefulWidget {
@override
@@ -30,7 +31,10 @@ class _TestPageState extends State {
void loadData() async {
try {
await EasyLoading.show();
- Response response = await Dio().get('https://github.com');
+ HttpClient client = HttpClient();
+ HttpClientRequest request =
+ await client.getUrl(Uri.parse('https://github.com'));
+ HttpClientResponse response = await request.close();
print(response);
await EasyLoading.dismiss();
} catch (e) {
@@ -46,8 +50,7 @@ class _TestPageState extends State {
title: Text('Test Page'),
),
body: Center(
- child: FlatButton(
- textColor: Colors.blue,
+ child: TextButton(
child: Text('loadData'),
onPressed: () {
loadData();
diff --git a/example/pubspec.lock b/example/pubspec.lock
index a9871d9..d0fabf1 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -1,62 +1,48 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
- archive:
- dependency: transitive
- description:
- name: archive
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.0.13"
- args:
- dependency: transitive
- description:
- name: args
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "1.6.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.4.1"
+ version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.0"
- charcode:
+ version: "2.1.0"
+ characters:
dependency: transitive
description:
- name: charcode
+ name: characters
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.3"
- collection:
+ version: "1.1.0"
+ charcode:
dependency: transitive
description:
- name: collection
+ name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.14.12"
- convert:
+ version: "1.2.0"
+ clock:
dependency: transitive
description:
- name: convert
+ name: clock
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.1"
- crypto:
+ version: "1.1.0"
+ collection:
dependency: transitive
description:
- name: crypto
+ name: collection
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.4"
+ version: "1.15.0"
cupertino_icons:
dependency: "direct main"
description:
@@ -64,13 +50,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.3"
- dio:
- dependency: "direct main"
+ fake_async:
+ dependency: transitive
description:
- name: dio
+ name: fake_async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "3.0.10"
+ version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
@@ -82,68 +68,40 @@ packages:
path: ".."
relative: true
source: path
- version: "2.2.1"
+ version: "3.0.0"
flutter_spinkit:
dependency: transitive
description:
name: flutter_spinkit
url: "https://pub.flutter-io.cn"
source: hosted
- version: "4.1.2+1"
+ version: "5.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
- http_parser:
- dependency: transitive
- description:
- name: http_parser
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "3.1.4"
- image:
- dependency: transitive
- description:
- name: image
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.1.12"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.12.6"
+ version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.8"
+ version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.6.4"
- petitparser:
- dependency: transitive
- description:
- name: petitparser
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.4.0"
- quiver:
- dependency: transitive
- description:
- name: quiver
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.1.3"
+ version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
@@ -155,63 +113,56 @@ packages:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.9.3"
+ version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.0.5"
+ version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.2.15"
+ version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.6"
+ version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.8"
- xml:
- dependency: transitive
- description:
- name: xml
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "3.6.1"
+ version: "2.1.0"
sdks:
- dart: ">=2.6.0 <3.0.0"
- flutter: ">=0.1.4 <2.0.0"
+ dart: ">=2.12.0 <3.0.0"
+ flutter: ">=2.0.0"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index dce7ba8..bb2c7c5 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -14,15 +14,13 @@ description: A new Flutter project.
version: 1.0.0+1
environment:
- sdk: ">=2.1.0 <3.0.0"
+ sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
- dio: ^3.0.10
- flutter_easyloading:
- path: ../
+ flutter_easyloading: ^5.0.0
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
diff --git a/lib/src/animations/offset_animation.dart b/lib/src/animations/offset_animation.dart
index f4d0924..51c51fc 100644
--- a/lib/src/animations/offset_animation.dart
+++ b/lib/src/animations/offset_animation.dart
@@ -42,9 +42,8 @@ class OffsetAnimation extends EasyLoadingAnimation {
begin: _begin,
end: Offset(0, 0),
).animate(controller);
- double value = controller?.value ?? 0;
return Opacity(
- opacity: value,
+ opacity: controller.value,
child: SlideTransition(
position: _animation,
child: child,
diff --git a/lib/src/animations/opacity_animation.dart b/lib/src/animations/opacity_animation.dart
index f0457d5..b725525 100644
--- a/lib/src/animations/opacity_animation.dart
+++ b/lib/src/animations/opacity_animation.dart
@@ -33,9 +33,8 @@ class OpacityAnimation extends EasyLoadingAnimation {
AnimationController controller,
AlignmentGeometry alignment,
) {
- double opacity = controller?.value ?? 0;
return Opacity(
- opacity: opacity,
+ opacity: controller.value,
child: child,
);
}
diff --git a/lib/src/animations/scale_animation.dart b/lib/src/animations/scale_animation.dart
index 52ad0f0..9944c99 100644
--- a/lib/src/animations/scale_animation.dart
+++ b/lib/src/animations/scale_animation.dart
@@ -33,9 +33,8 @@ class ScaleAnimation extends EasyLoadingAnimation {
AnimationController controller,
AlignmentGeometry alignment,
) {
- double opacity = controller?.value ?? 0;
return Opacity(
- opacity: opacity,
+ opacity: controller.value,
child: ScaleTransition(
scale: controller,
child: child,
diff --git a/lib/src/easy_loading.dart b/lib/src/easy_loading.dart
index 5673856..4ff4c47 100644
--- a/lib/src/easy_loading.dart
+++ b/lib/src/easy_loading.dart
@@ -104,106 +104,105 @@ typedef EasyLoadingStatusCallback = void Function(EasyLoadingStatus status);
class EasyLoading {
/// loading style, default [EasyLoadingStyle.dark].
- EasyLoadingStyle loadingStyle;
+ late EasyLoadingStyle loadingStyle;
/// loading indicator type, default [EasyLoadingIndicatorType.fadingCircle].
- EasyLoadingIndicatorType indicatorType;
+ late EasyLoadingIndicatorType indicatorType;
/// loading mask type, default [EasyLoadingMaskType.none].
- EasyLoadingMaskType maskType;
+ late EasyLoadingMaskType maskType;
/// toast position, default [EasyLoadingToastPosition.center].
- EasyLoadingToastPosition toastPosition;
+ late EasyLoadingToastPosition toastPosition;
/// loading animationStyle, default [EasyLoadingAnimationStyle.opacity].
- EasyLoadingAnimationStyle animationStyle;
-
- /// loading custom animation, default null.
- EasyLoadingAnimation customAnimation;
+ late EasyLoadingAnimationStyle animationStyle;
/// textAlign of status, default [TextAlign.center].
- TextAlign textAlign;
-
- /// textStyle of status, default null.
- TextStyle textStyle;
+ late TextAlign textAlign;
/// content padding of loading.
- EdgeInsets contentPadding;
+ late EdgeInsets contentPadding;
/// padding of [status].
- EdgeInsets textPadding;
+ late EdgeInsets textPadding;
/// size of indicator, default 40.0.
- double indicatorSize;
+ late double indicatorSize;
/// radius of loading, default 5.0.
- double radius;
+ late double radius;
/// fontSize of loading, default 15.0.
- double fontSize;
+ late double fontSize;
/// width of progress indicator, default 2.0.
- double progressWidth;
+ late double progressWidth;
/// width of indicator, default 4.0, only used for [EasyLoadingIndicatorType.ring, EasyLoadingIndicatorType.dualRing].
- double lineWidth;
+ late double lineWidth;
/// display duration of [showSuccess] [showError] [showInfo] [showToast], default 2000ms.
- Duration displayDuration;
+ late Duration displayDuration;
/// animation duration of indicator, default 200ms.
- Duration animationDuration;
+ late Duration animationDuration;
+
+ /// loading custom animation, default null.
+ EasyLoadingAnimation? customAnimation;
+
+ /// textStyle of status, default null.
+ TextStyle? textStyle;
/// color of loading status, only used for [EasyLoadingStyle.custom].
- Color textColor;
+ Color? textColor;
/// color of loading indicator, only used for [EasyLoadingStyle.custom].
- Color indicatorColor;
+ Color? indicatorColor;
/// progress color of loading, only used for [EasyLoadingStyle.custom].
- Color progressColor;
+ Color? progressColor;
/// background color of loading, only used for [EasyLoadingStyle.custom].
- Color backgroundColor;
+ Color? backgroundColor;
/// mask color of loading, only used for [EasyLoadingMaskType.custom].
- Color maskColor;
+ Color? maskColor;
/// should allow user interactions while loading is displayed.
- bool userInteractions;
+ bool? userInteractions;
/// should dismiss on user tap.
- bool dismissOnTap;
+ bool? dismissOnTap;
/// indicator widget of loading
- Widget indicatorWidget;
+ Widget? indicatorWidget;
/// success widget of loading
- Widget successWidget;
+ Widget? successWidget;
/// error widget of loading
- Widget errorWidget;
+ Widget? errorWidget;
/// info widget of loading
- Widget infoWidget;
+ Widget? infoWidget;
- EasyLoadingOverlayEntry overlayEntry;
- Widget _w;
+ Widget? _w;
- GlobalKey _key;
- GlobalKey _progressKey;
- Timer _timer;
+ EasyLoadingOverlayEntry? overlayEntry;
+ GlobalKey? _key;
+ GlobalKey? _progressKey;
+ Timer? _timer;
- Widget get w => _w;
- GlobalKey get key => _key;
- GlobalKey get progressKey => _progressKey;
+ Widget? get w => _w;
+ GlobalKey? get key => _key;
+ GlobalKey? get progressKey => _progressKey;
final List _statusCallbacks =
[];
- factory EasyLoading() => _getInstance();
- static EasyLoading _instance;
- static EasyLoading get instance => _getInstance();
+ factory EasyLoading() => _instance;
+ static final EasyLoading _instance = EasyLoading._internal();
EasyLoading._internal() {
/// set deafult value
@@ -227,18 +226,14 @@ class EasyLoading {
);
}
- static EasyLoading _getInstance() {
- if (_instance == null) _instance = EasyLoading._internal();
- return _instance;
- }
-
- static bool get isShow => _getInstance().w != null;
+ static EasyLoading get instance => _instance;
+ static bool get isShow => _instance.w != null;
/// init EasyLoading
static TransitionBuilder init({
- TransitionBuilder builder,
+ TransitionBuilder? builder,
}) {
- return (BuildContext context, Widget child) {
+ return (BuildContext context, Widget? child) {
if (builder != null) {
return builder(context, FlutterEasyLoading(child: child));
} else {
@@ -249,14 +244,13 @@ class EasyLoading {
/// show loading with [status] [indicator] [maskType]
static Future show({
- String status,
- Widget indicator,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ String? status,
+ Widget? indicator,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
}) {
- Widget w =
- indicator ?? (_getInstance().indicatorWidget ?? LoadingIndicator());
- return _getInstance()._show(
+ Widget w = indicator ?? (_instance.indicatorWidget ?? LoadingIndicator());
+ return _instance._show(
status: status,
maskType: maskType,
dismissOnTap: dismissOnTap,
@@ -267,57 +261,57 @@ class EasyLoading {
/// show progress with [value] [status] [maskType], value should be 0.0 ~ 1.0.
static Future showProgress(
double value, {
- String status,
- EasyLoadingMaskType maskType,
+ String? status,
+ EasyLoadingMaskType? maskType,
}) async {
assert(
value >= 0.0 && value <= 1.0,
'progress value should be 0.0 ~ 1.0',
);
- if (_getInstance().loadingStyle == EasyLoadingStyle.custom) {
+ if (_instance.loadingStyle == EasyLoadingStyle.custom) {
assert(
- _getInstance().progressColor != null,
+ _instance.progressColor != null,
'while loading style is custom, progressColor should not be null',
);
}
- if (_getInstance().w == null || _getInstance().progressKey == null) {
- if (_getInstance().key != null) await dismiss(animation: false);
+ if (_instance.w == null || _instance.progressKey == null) {
+ if (_instance.key != null) await dismiss(animation: false);
GlobalKey _progressKey =
GlobalKey();
Widget w = EasyLoadingProgress(
key: _progressKey,
value: value,
);
- _getInstance()._show(
+ _instance._show(
status: status,
maskType: maskType,
dismissOnTap: false,
w: w,
);
- _getInstance()._progressKey = _progressKey;
+ _instance._progressKey = _progressKey;
}
// update progress
- _getInstance().progressKey?.currentState?.updateProgress(min(1.0, value));
+ _instance.progressKey?.currentState?.updateProgress(min(1.0, value));
// update status
- if (status != null) _getInstance().key?.currentState?.updateStatus(status);
+ if (status != null) _instance.key?.currentState?.updateStatus(status);
}
/// showSuccess [status] [duration] [maskType]
static Future showSuccess(
String status, {
- Duration duration,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ Duration? duration,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
}) {
- Widget w = _getInstance().successWidget ??
+ Widget w = _instance.successWidget ??
Icon(
Icons.done,
color: EasyLoadingTheme.indicatorColor,
size: EasyLoadingTheme.indicatorSize,
);
- return _getInstance()._show(
+ return _instance._show(
status: status,
duration: duration ?? EasyLoadingTheme.displayDuration,
maskType: maskType,
@@ -329,17 +323,17 @@ class EasyLoading {
/// showError [status] [duration] [maskType]
static Future showError(
String status, {
- Duration duration,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ Duration? duration,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
}) {
- Widget w = _getInstance().errorWidget ??
+ Widget w = _instance.errorWidget ??
Icon(
Icons.clear,
color: EasyLoadingTheme.indicatorColor,
size: EasyLoadingTheme.indicatorSize,
);
- return _getInstance()._show(
+ return _instance._show(
status: status,
duration: duration ?? EasyLoadingTheme.displayDuration,
maskType: maskType,
@@ -351,17 +345,17 @@ class EasyLoading {
/// showInfo [status] [duration] [maskType]
static Future showInfo(
String status, {
- Duration duration,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ Duration? duration,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
}) {
- Widget w = _getInstance().infoWidget ??
+ Widget w = _instance.infoWidget ??
Icon(
Icons.info_outline,
color: EasyLoadingTheme.indicatorColor,
size: EasyLoadingTheme.indicatorSize,
);
- return _getInstance()._show(
+ return _instance._show(
status: status,
duration: duration ?? EasyLoadingTheme.displayDuration,
maskType: maskType,
@@ -373,12 +367,12 @@ class EasyLoading {
/// showToast [status] [duration] [toastPosition] [maskType]
static Future showToast(
String status, {
- Duration duration,
- EasyLoadingToastPosition toastPosition,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ Duration? duration,
+ EasyLoadingToastPosition? toastPosition,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
}) {
- return _getInstance()._show(
+ return _instance._show(
status: status,
duration: duration ?? EasyLoadingTheme.displayDuration,
toastPosition: toastPosition ?? EasyLoadingTheme.toastPosition,
@@ -392,46 +386,41 @@ class EasyLoading {
bool animation = true,
}) {
// cancel timer
- _getInstance()._cancelTimer();
- return _getInstance()._dismiss(animation);
+ _instance._cancelTimer();
+ return _instance._dismiss(animation);
}
/// add loading status callback
static void addStatusCallback(EasyLoadingStatusCallback callback) {
- if (!_getInstance()._statusCallbacks.contains(callback)) {
- _getInstance()._statusCallbacks.add(callback);
+ if (!_instance._statusCallbacks.contains(callback)) {
+ _instance._statusCallbacks.add(callback);
}
}
/// remove single loading status callback
static void removeCallback(EasyLoadingStatusCallback callback) {
- if (_getInstance()._statusCallbacks.contains(callback)) {
- _getInstance()._statusCallbacks.remove(callback);
+ if (_instance._statusCallbacks.contains(callback)) {
+ _instance._statusCallbacks.remove(callback);
}
}
/// remove all loading status callback
static void removeAllCallbacks() {
- _getInstance()._statusCallbacks.clear();
+ _instance._statusCallbacks.clear();
}
/// show [status] [duration] [toastPosition] [maskType]
Future _show({
- Widget w,
- String status,
- Duration duration,
- EasyLoadingToastPosition toastPosition = EasyLoadingToastPosition.center,
- EasyLoadingMaskType maskType,
- bool dismissOnTap,
+ Widget? w,
+ String? status,
+ Duration? duration,
+ EasyLoadingMaskType? maskType,
+ bool? dismissOnTap,
+ EasyLoadingToastPosition? toastPosition,
}) async {
assert(
overlayEntry != null,
- 'overlayEntry should not be null',
- );
-
- assert(
- toastPosition != null,
- 'toastPosition should not be null',
+ 'You should call EasyLoading.init() in your MaterialApp',
);
if (loadingStyle == EasyLoadingStyle.custom) {
@@ -449,12 +438,7 @@ class EasyLoading {
);
}
- if (maskType == null) maskType = _getInstance().maskType;
- assert(
- maskType != null,
- 'maskType should not be null',
- );
-
+ maskType ??= _instance.maskType;
if (maskType == EasyLoadingMaskType.custom) {
assert(
maskColor != null,
@@ -469,6 +453,7 @@ class EasyLoading {
);
}
+ toastPosition ??= EasyLoadingToastPosition.center;
bool animation = _w == null;
_progressKey = null;
if (_key != null) await dismiss(animation: false);
@@ -489,9 +474,8 @@ class EasyLoading {
_callback(EasyLoadingStatus.show);
if (duration != null) {
_cancelTimer();
- _timer = Timer.periodic(duration, (timer) async {
+ _timer = Timer(duration, () async {
await dismiss();
- _cancelTimer();
});
}
});
@@ -500,12 +484,12 @@ class EasyLoading {
}
Future _dismiss(bool animation) async {
- if (key != null && key.currentState == null) {
+ if (key != null && key?.currentState == null) {
_reset();
return;
}
- return key?.currentState?.dismiss(animation)?.whenComplete(() {
+ return key?.currentState?.dismiss(animation).whenComplete(() {
_reset();
});
}
@@ -521,7 +505,7 @@ class EasyLoading {
void _callback(EasyLoadingStatus status) {
for (final EasyLoadingStatusCallback callback in _statusCallbacks) {
- if (callback != null) callback(status);
+ callback(status);
}
}
diff --git a/lib/src/theme.dart b/lib/src/theme.dart
index 9b5ff6c..316fa03 100644
--- a/lib/src/theme.dart
+++ b/lib/src/theme.dart
@@ -32,7 +32,7 @@ class EasyLoadingTheme {
/// color of indicator
static Color get indicatorColor =>
EasyLoading.instance.loadingStyle == EasyLoadingStyle.custom
- ? EasyLoading.instance.indicatorColor
+ ? EasyLoading.instance.indicatorColor!
: EasyLoading.instance.loadingStyle == EasyLoadingStyle.dark
? Colors.white
: Colors.black;
@@ -40,7 +40,7 @@ class EasyLoadingTheme {
/// progress color of loading
static Color get progressColor =>
EasyLoading.instance.loadingStyle == EasyLoadingStyle.custom
- ? EasyLoading.instance.progressColor
+ ? EasyLoading.instance.progressColor!
: EasyLoading.instance.loadingStyle == EasyLoadingStyle.dark
? Colors.white
: Colors.black;
@@ -48,7 +48,7 @@ class EasyLoadingTheme {
/// background color of loading
static Color get backgroundColor =>
EasyLoading.instance.loadingStyle == EasyLoadingStyle.custom
- ? EasyLoading.instance.backgroundColor
+ ? EasyLoading.instance.backgroundColor!
: EasyLoading.instance.loadingStyle == EasyLoadingStyle.dark
? Colors.black.withOpacity(0.9)
: Colors.white;
@@ -56,17 +56,17 @@ class EasyLoadingTheme {
/// font color of status
static Color get textColor =>
EasyLoading.instance.loadingStyle == EasyLoadingStyle.custom
- ? EasyLoading.instance.textColor
+ ? EasyLoading.instance.textColor!
: EasyLoading.instance.loadingStyle == EasyLoadingStyle.dark
? Colors.white
: Colors.black;
/// mask color of loading
- static Color maskColor(EasyLoadingMaskType maskType) {
- EasyLoadingMaskType type = maskType ?? EasyLoading.instance.maskType;
- return type == EasyLoadingMaskType.custom
- ? EasyLoading.instance.maskColor
- : type == EasyLoadingMaskType.black
+ static Color maskColor(EasyLoadingMaskType? maskType) {
+ maskType ??= EasyLoading.instance.maskType;
+ return maskType == EasyLoadingMaskType.custom
+ ? EasyLoading.instance.maskColor!
+ : maskType == EasyLoadingMaskType.black
? Colors.black.withOpacity(0.5)
: Colors.transparent;
}
@@ -76,7 +76,7 @@ class EasyLoadingTheme {
EasyLoadingAnimation _animation;
switch (EasyLoading.instance.animationStyle) {
case EasyLoadingAnimationStyle.custom:
- _animation = EasyLoading.instance.customAnimation;
+ _animation = EasyLoading.instance.customAnimation!;
break;
case EasyLoadingAnimationStyle.offset:
_animation = OffsetAnimation();
@@ -112,7 +112,7 @@ class EasyLoadingTheme {
EasyLoading.instance.toastPosition;
/// toast position
- static AlignmentGeometry alignment(EasyLoadingToastPosition position) =>
+ static AlignmentGeometry alignment(EasyLoadingToastPosition? position) =>
position == EasyLoadingToastPosition.bottom
? AlignmentDirectional.bottomCenter
: (position == EasyLoadingToastPosition.top
@@ -136,17 +136,17 @@ class EasyLoadingTheme {
static TextAlign get textAlign => EasyLoading.instance.textAlign;
/// textStyle of status
- static TextStyle get textStyle => EasyLoading.instance.textStyle;
+ static TextStyle? get textStyle => EasyLoading.instance.textStyle;
/// radius of loading
static double get radius => EasyLoading.instance.radius;
/// should dismiss on user tap
- static bool get dismissOnTap => EasyLoading.instance.dismissOnTap;
+ static bool? get dismissOnTap => EasyLoading.instance.dismissOnTap;
- static bool ignoring(EasyLoadingMaskType maskType) {
- EasyLoadingMaskType type = maskType ?? EasyLoading.instance.maskType;
+ static bool ignoring(EasyLoadingMaskType? maskType) {
+ maskType ??= EasyLoading.instance.maskType;
return EasyLoading.instance.userInteractions ??
- (type == EasyLoadingMaskType.none ? true : false);
+ (maskType == EasyLoadingMaskType.none ? true : false);
}
}
diff --git a/lib/src/widgets/container.dart b/lib/src/widgets/container.dart
index 7381746..239c13a 100644
--- a/lib/src/widgets/container.dart
+++ b/lib/src/widgets/container.dart
@@ -29,23 +29,23 @@ import '../theme.dart';
import '../easy_loading.dart';
class EasyLoadingContainer extends StatefulWidget {
- final Widget indicator;
- final String status;
+ final Widget? indicator;
+ final String? status;
+ final bool? dismissOnTap;
+ final EasyLoadingToastPosition? toastPosition;
+ final EasyLoadingMaskType? maskType;
+ final Completer? completer;
final bool animation;
- final bool dismissOnTap;
- final EasyLoadingToastPosition toastPosition;
- final EasyLoadingMaskType maskType;
- final Completer completer;
const EasyLoadingContainer({
- Key key,
+ Key? key,
this.indicator,
this.status,
- this.animation = true,
this.dismissOnTap,
this.toastPosition,
this.maskType,
this.completer,
+ this.animation = true,
}) : super(key: key);
@override
@@ -54,14 +54,14 @@ class EasyLoadingContainer extends StatefulWidget {
class EasyLoadingContainerState extends State
with SingleTickerProviderStateMixin {
- String _status;
- AlignmentGeometry _alignment;
- bool _dismissOnTap, _ignoring;
- Color _maskColor;
- AnimationController _animationController;
+ String? _status;
+ Color? _maskColor;
+ late AnimationController _animationController;
+ late AlignmentGeometry _alignment;
+ late bool _dismissOnTap, _ignoring;
bool get isPersistentCallbacks =>
- SchedulerBinding.instance.schedulerPhase ==
+ SchedulerBinding.instance?.schedulerPhase ==
SchedulerPhase.persistentCallbacks;
@override
@@ -81,8 +81,8 @@ class EasyLoadingContainerState extends State
vsync: this,
duration: EasyLoadingTheme.animationDuration,
)..addStatusListener((status) {
- if (status == AnimationStatus.completed &&
- !widget.completer.isCompleted) {
+ bool isCompleted = widget.completer?.isCompleted ?? false;
+ if (status == AnimationStatus.completed && !isCompleted) {
widget.completer?.complete();
}
});
@@ -91,30 +91,29 @@ class EasyLoadingContainerState extends State
@override
void dispose() {
- _animationController?.dispose();
- _animationController = null;
+ _animationController.dispose();
super.dispose();
}
Future show(bool animation) {
if (isPersistentCallbacks) {
Completer completer = Completer();
- SchedulerBinding.instance.addPostFrameCallback((_) => completer
- .complete(_animationController?.forward(from: animation ? 0 : 1)));
+ SchedulerBinding.instance?.addPostFrameCallback((_) => completer
+ .complete(_animationController.forward(from: animation ? 0 : 1)));
return completer.future;
} else {
- return _animationController?.forward(from: animation ? 0 : 1);
+ return _animationController.forward(from: animation ? 0 : 1);
}
}
Future dismiss(bool animation) {
if (isPersistentCallbacks) {
Completer completer = Completer();
- SchedulerBinding.instance.addPostFrameCallback((_) => completer
- .complete(_animationController?.reverse(from: animation ? 1 : 0)));
+ SchedulerBinding.instance?.addPostFrameCallback((_) => completer
+ .complete(_animationController.reverse(from: animation ? 1 : 0)));
return completer.future;
} else {
- return _animationController?.reverse(from: animation ? 1 : 0);
+ return _animationController.reverse(from: animation ? 1 : 0);
}
}
@@ -136,9 +135,9 @@ class EasyLoadingContainerState extends State
children: [
AnimatedBuilder(
animation: _animationController,
- builder: (BuildContext context, Widget child) {
+ builder: (BuildContext context, Widget? child) {
return Opacity(
- opacity: _animationController?.value ?? 0,
+ opacity: _animationController.value,
child: IgnorePointer(
ignoring: _ignoring,
child: _dismissOnTap
@@ -162,8 +161,8 @@ class EasyLoadingContainerState extends State
),
AnimatedBuilder(
animation: _animationController,
- builder: (BuildContext context, Widget child) {
- return EasyLoadingTheme.loadingAnimation?.buildWidget(
+ builder: (BuildContext context, Widget? child) {
+ return EasyLoadingTheme.loadingAnimation.buildWidget(
_Indicator(
status: _status,
indicator: widget.indicator,
@@ -179,12 +178,12 @@ class EasyLoadingContainerState extends State
}
class _Indicator extends StatelessWidget {
- final Widget indicator;
- final String status;
+ final Widget? indicator;
+ final String? status;
const _Indicator({
- @required this.indicator,
- @required this.status,
+ required this.indicator,
+ required this.status,
});
@override
@@ -203,26 +202,24 @@ class _Indicator extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
- indicator != null
- ? Container(
- margin: status?.isNotEmpty == true
- ? EasyLoadingTheme.textPadding
- : EdgeInsets.zero,
- child: indicator,
- )
- : null,
- status?.isNotEmpty == true
- ? Text(
- status,
- style: EasyLoadingTheme.textStyle ??
- TextStyle(
- color: EasyLoadingTheme.textColor,
- fontSize: EasyLoadingTheme.fontSize,
- ),
- textAlign: EasyLoadingTheme.textAlign,
- )
- : null,
- ].where((w) => w != null).toList(),
+ if (indicator != null)
+ Container(
+ margin: status?.isNotEmpty == true
+ ? EasyLoadingTheme.textPadding
+ : EdgeInsets.zero,
+ child: indicator,
+ ),
+ if (status != null)
+ Text(
+ status!,
+ style: EasyLoadingTheme.textStyle ??
+ TextStyle(
+ color: EasyLoadingTheme.textColor,
+ fontSize: EasyLoadingTheme.fontSize,
+ ),
+ textAlign: EasyLoadingTheme.textAlign,
+ ),
+ ],
),
);
}
diff --git a/lib/src/widgets/indicator.dart b/lib/src/widgets/indicator.dart
index 6a9ead5..83367fb 100644
--- a/lib/src/widgets/indicator.dart
+++ b/lib/src/widgets/indicator.dart
@@ -28,7 +28,7 @@ import '../theme.dart';
class LoadingIndicator extends StatefulWidget {
const LoadingIndicator({
- Key key,
+ Key? key,
}) : super(key: key);
@override
@@ -40,8 +40,7 @@ class _LoadingIndicatorState extends State {
/// indicator color of loading
final Color _indicatorColor = EasyLoadingTheme.indicatorColor;
-
- Widget _indicator;
+ late Widget _indicator;
@override
void initState() {
@@ -50,7 +49,6 @@ class _LoadingIndicatorState extends State {
@override
void dispose() {
- _indicator = null;
super.dispose();
}
diff --git a/lib/src/widgets/loading.dart b/lib/src/widgets/loading.dart
index 919a027..d188555 100644
--- a/lib/src/widgets/loading.dart
+++ b/lib/src/widgets/loading.dart
@@ -26,12 +26,12 @@ import '../easy_loading.dart';
import './overlay_entry.dart';
class FlutterEasyLoading extends StatefulWidget {
- final Widget child;
+ final Widget? child;
const FlutterEasyLoading({
- Key key,
- @required this.child,
- }) : assert(child != null),
+ Key? key,
+ required this.child,
+ }) : assert(child != null),
super(key: key);
@override
@@ -39,7 +39,7 @@ class FlutterEasyLoading extends StatefulWidget {
}
class _FlutterEasyLoadingState extends State {
- EasyLoadingOverlayEntry _overlayEntry;
+ late EasyLoadingOverlayEntry _overlayEntry;
@override
void initState() {
@@ -50,19 +50,19 @@ class _FlutterEasyLoadingState extends State {
EasyLoading.instance.overlayEntry = _overlayEntry;
}
- @override
- void dispose() {
- _overlayEntry = null;
- super.dispose();
- }
-
@override
Widget build(BuildContext context) {
return Material(
child: Overlay(
initialEntries: [
EasyLoadingOverlayEntry(
- builder: (BuildContext context) => widget.child,
+ builder: (BuildContext context) {
+ if (widget.child != null) {
+ return widget.child!;
+ } else {
+ return Container();
+ }
+ },
),
_overlayEntry,
],
diff --git a/lib/src/widgets/overlay_entry.dart b/lib/src/widgets/overlay_entry.dart
index c6cec58..57cb09a 100644
--- a/lib/src/widgets/overlay_entry.dart
+++ b/lib/src/widgets/overlay_entry.dart
@@ -27,14 +27,14 @@ class EasyLoadingOverlayEntry extends OverlayEntry {
final WidgetBuilder builder;
EasyLoadingOverlayEntry({
- @required this.builder,
+ required this.builder,
}) : super(builder: builder);
@override
void markNeedsBuild() {
- if (SchedulerBinding.instance.schedulerPhase ==
+ if (SchedulerBinding.instance?.schedulerPhase ==
SchedulerPhase.persistentCallbacks) {
- SchedulerBinding.instance.addPostFrameCallback((_) {
+ SchedulerBinding.instance?.addPostFrameCallback((_) {
super.markNeedsBuild();
});
} else {
diff --git a/lib/src/widgets/progress.dart b/lib/src/widgets/progress.dart
index 058a2af..b11fdcd 100644
--- a/lib/src/widgets/progress.dart
+++ b/lib/src/widgets/progress.dart
@@ -30,8 +30,8 @@ class EasyLoadingProgress extends StatefulWidget {
final double value;
const EasyLoadingProgress({
- Key key,
- @required this.value,
+ Key? key,
+ required this.value,
}) : super(key: key);
@override
@@ -78,9 +78,9 @@ class _CircleProgress extends ProgressIndicator {
final Color color;
_CircleProgress({
- @required this.value,
- @required this.width,
- @required this.color,
+ required this.value,
+ required this.width,
+ required this.color,
});
@override
@@ -116,9 +116,9 @@ class _CirclePainter extends CustomPainter {
final double width;
_CirclePainter({
- @required this.color,
- @required this.value,
- @required this.width,
+ required this.color,
+ required this.value,
+ required this.width,
});
@override
diff --git a/pubspec.lock b/pubspec.lock
index 3fb4fd7..5091533 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -1,62 +1,55 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
- archive:
- dependency: transitive
- description:
- name: archive
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.0.13"
- args:
- dependency: transitive
- description:
- name: args
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "1.6.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.4.1"
+ version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.3"
- collection:
+ version: "1.2.0"
+ clock:
dependency: transitive
description:
- name: collection
+ name: clock
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.14.12"
- convert:
+ version: "1.1.0"
+ collection:
dependency: transitive
description:
- name: convert
+ name: collection
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.1"
- crypto:
+ version: "1.15.0"
+ fake_async:
dependency: transitive
description:
- name: crypto
+ name: fake_async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.4"
+ version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
@@ -68,54 +61,33 @@ packages:
name: flutter_spinkit
url: "https://pub.flutter-io.cn"
source: hosted
- version: "4.1.2+1"
+ version: "5.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
- image:
- dependency: transitive
- description:
- name: image
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.1.12"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.12.6"
+ version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.8"
+ version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.6.4"
- petitparser:
- dependency: transitive
- description:
- name: petitparser
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.4.0"
- quiver:
- dependency: transitive
- description:
- name: quiver
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.1.3"
+ version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
@@ -127,63 +99,56 @@ packages:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.9.3"
+ version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.0.5"
+ version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.2.15"
+ version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.6"
+ version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.8"
- xml:
- dependency: transitive
- description:
- name: xml
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "3.6.1"
+ version: "2.1.0"
sdks:
- dart: ">=2.6.0 <3.0.0"
- flutter: ">=0.1.4 <2.0.0"
+ dart: ">=2.12.0 <3.0.0"
+ flutter: ">=2.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 3c8b46f..a059278 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,16 +1,16 @@
name: flutter_easyloading
-description: ✨A clean and lightweight loading/toast widget for Flutter, easy to use without context, support iOS、Android and Web
-version: 2.2.2
+description: ✨A clean and lightweight loading/toast widget for Flutter, Easy to use without context, Support iOS、Android and Web
+version: 3.0.0
homepage: https://github.com/kokohuang/flutter_easyloading
environment:
- sdk: ">=2.2.2 <3.0.0"
+ sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
- flutter_spinkit: ^4.1.2+1
+ flutter_spinkit: ^5.0.0
dev_dependencies:
flutter_test: