Showing
2 changed files
with
59 additions
and
29 deletions
| @@ -152,51 +152,36 @@ class RxStatus { | @@ -152,51 +152,36 @@ class RxStatus { | ||
| 152 | final bool isError; | 152 | final bool isError; |
| 153 | final bool isSuccess; | 153 | final bool isSuccess; |
| 154 | final bool isEmpty; | 154 | final bool isEmpty; |
| 155 | + final bool isLoadingMore; | ||
| 155 | final String errorMessage; | 156 | final String errorMessage; |
| 156 | 157 | ||
| 157 | RxStatus._({ | 158 | RxStatus._({ |
| 158 | - this.isEmpty, | ||
| 159 | - this.isLoading, | ||
| 160 | - this.isError, | ||
| 161 | - this.isSuccess, | 159 | + this.isEmpty = false, |
| 160 | + this.isLoading = false, | ||
| 161 | + this.isError = false, | ||
| 162 | + this.isSuccess = false, | ||
| 162 | this.errorMessage, | 163 | this.errorMessage, |
| 164 | + this.isLoadingMore = false, | ||
| 163 | }); | 165 | }); |
| 164 | 166 | ||
| 165 | factory RxStatus.loading() { | 167 | factory RxStatus.loading() { |
| 166 | - return RxStatus._( | ||
| 167 | - isLoading: true, | ||
| 168 | - isError: false, | ||
| 169 | - isSuccess: false, | ||
| 170 | - isEmpty: false, | ||
| 171 | - ); | 168 | + return RxStatus._(isLoading: true); |
| 169 | + } | ||
| 170 | + | ||
| 171 | + factory RxStatus.loadingMore() { | ||
| 172 | + return RxStatus._(isSuccess: true, isLoadingMore: true); | ||
| 172 | } | 173 | } |
| 173 | 174 | ||
| 174 | factory RxStatus.success() { | 175 | factory RxStatus.success() { |
| 175 | - return RxStatus._( | ||
| 176 | - isLoading: false, | ||
| 177 | - isError: false, | ||
| 178 | - isSuccess: true, | ||
| 179 | - isEmpty: false, | ||
| 180 | - ); | 176 | + return RxStatus._(isSuccess: true); |
| 181 | } | 177 | } |
| 182 | 178 | ||
| 183 | factory RxStatus.error([String message]) { | 179 | factory RxStatus.error([String message]) { |
| 184 | - return RxStatus._( | ||
| 185 | - isLoading: false, | ||
| 186 | - isError: true, | ||
| 187 | - isSuccess: false, | ||
| 188 | - isEmpty: false, | ||
| 189 | - errorMessage: message, | ||
| 190 | - ); | 180 | + return RxStatus._(isError: true, errorMessage: message); |
| 191 | } | 181 | } |
| 192 | 182 | ||
| 193 | factory RxStatus.empty() { | 183 | factory RxStatus.empty() { |
| 194 | - return RxStatus._( | ||
| 195 | - isLoading: false, | ||
| 196 | - isError: false, | ||
| 197 | - isSuccess: false, | ||
| 198 | - isEmpty: true, | ||
| 199 | - ); | 184 | + return RxStatus._(isEmpty: true); |
| 200 | } | 185 | } |
| 201 | } | 186 | } |
| 202 | 187 |
| 1 | // ignore: prefer_mixin | 1 | // ignore: prefer_mixin |
| 2 | import 'package:flutter/widgets.dart'; | 2 | import 'package:flutter/widgets.dart'; |
| 3 | +import '../../../instance_manager.dart'; | ||
| 3 | 4 | ||
| 4 | import '../rx_flutter/rx_disposable.dart'; | 5 | import '../rx_flutter/rx_disposable.dart'; |
| 5 | import '../rx_flutter/rx_notifier.dart'; | 6 | import '../rx_flutter/rx_notifier.dart'; |
| @@ -26,6 +27,50 @@ abstract class GetxController extends DisposableInterface with ListNotifier { | @@ -26,6 +27,50 @@ abstract class GetxController extends DisposableInterface with ListNotifier { | ||
| 26 | } | 27 | } |
| 27 | } | 28 | } |
| 28 | 29 | ||
| 30 | +mixin ScrollMixin on GetLifeCycleBase { | ||
| 31 | + final ScrollController scroll = ScrollController(); | ||
| 32 | + | ||
| 33 | + @override | ||
| 34 | + void onInit() { | ||
| 35 | + super.onInit(); | ||
| 36 | + scroll.addListener(_listener); | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + bool _canFetchBottom = true; | ||
| 40 | + | ||
| 41 | + bool _canFetchTop = true; | ||
| 42 | + | ||
| 43 | + void _listener() { | ||
| 44 | + if (scroll.position.atEdge) { | ||
| 45 | + _checkIfCanLoadMore(); | ||
| 46 | + } | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + Future<void> _checkIfCanLoadMore() async { | ||
| 50 | + if (scroll.position.pixels == 0) { | ||
| 51 | + if (!_canFetchTop) return; | ||
| 52 | + _canFetchTop = false; | ||
| 53 | + await onTopScroll(); | ||
| 54 | + _canFetchTop = true; | ||
| 55 | + } else { | ||
| 56 | + if (!_canFetchBottom) return; | ||
| 57 | + _canFetchBottom = false; | ||
| 58 | + await onEndScroll(); | ||
| 59 | + _canFetchBottom = true; | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + Future<void> onEndScroll(); | ||
| 64 | + | ||
| 65 | + Future<void> onTopScroll(); | ||
| 66 | + | ||
| 67 | + @override | ||
| 68 | + void onClose() { | ||
| 69 | + scroll.removeListener(_listener); | ||
| 70 | + super.onClose(); | ||
| 71 | + } | ||
| 72 | +} | ||
| 73 | + | ||
| 29 | abstract class RxController extends DisposableInterface {} | 74 | abstract class RxController extends DisposableInterface {} |
| 30 | 75 | ||
| 31 | abstract class SuperController<T> extends FullLifeCycleController | 76 | abstract class SuperController<T> extends FullLifeCycleController |
-
Please register or login to post a comment