diff --git a/docs/ar/ready_list.md b/docs/ar/ready_list.md index 642f02b..4e09305 100644 --- a/docs/ar/ready_list.md +++ b/docs/ar/ready_list.md @@ -1,5 +1,4 @@ # Complete list that - - Handle pull to refresh - Infinite scroll - Making grids @@ -7,58 +6,51 @@ # usage + ## First create controller ```dart -class ReadyListCubit extends Cubit> implements ReadyListController { - ReadyListCubit() : super(const ReadyListState.firstState()); - /// if you don't need to use loading features you can return null - /// ListLoadingHandler? get handler =>null +class ReadyListCubit extends DefaultReadyRemoteCubit { + ReadyListCubit() : super(ReadyListState.initial()); + @override - ListLoadingHandler? get handler => DefaultListLoadingHandler( - loadData: (skip, pageSize, cancelToken) async { - /// Fetch your data - }, - controller: this, - ); - + Future> loadData(int skip, int? pageSize, + [ICancelToken? cancelToken]) async { + var list = await FakeRepo.asyncList(pageSize ?? 20); + return RemoteResult.success(list, 100); + } } ``` -# if you want to use your own class or change notifier +# Some times you need to use stage-management rather than bloc +# if so see this example of how to use ValueNotifier as statemangement ```dart -class ReadyListCubit extends ChangeNotifier implements ReadyRemoteController { - ReadyListState _state = ReadyListState(); - @override - ReadyListState get state => _state; - final StreamController> _controller = StreamController>.broadcast(); - @override - Stream> get stream => _controller.stream; +class OtherController extends ValueNotifier> { + DefaultReadyListController controller = + DefaultReadyListController(ReadyListState.initial()); + + OtherController(ReadyListState value) : super(value); @override - void emit(ReadyListState state) { - _state = state; - _controller.add(state); + void notifyListeners() { + controller.setState(value); + super.notifyListeners(); } @override - Future> loadData({ - ICancelToken? cancelToken, - required int skip, - required int pageSize, - }) async { - /// Fetch your data + void dispose() { + controller.close(); + super.dispose(); } } ``` ## List - ```dart return ReadyList.list( key: Key(DateTime.now().toIso8601String()), @@ -81,6 +73,7 @@ return ReadyList.grid( ); ``` + ## Slivers ```dart @@ -92,6 +85,7 @@ return ReadyList.slivers( ); ``` + Property | Description | Nullable -- | ------ | - scrollController | List scroll controller | ✓ @@ -118,6 +112,7 @@ topLevelFooterSlivers | The first items in the list | ✓ topLevelHeaderSlivers | The last items in the list | ✓ pageSize | page size to be passed to controller loadData| ✓ + # Global config > you can config your all list with global config @@ -127,4 +122,4 @@ ReadyListConfig( showNoMoreText: false, child: MaterialApp(), ) -``` +``` \ No newline at end of file diff --git a/packages/ready_picker/CHANGELOG.md b/packages/ready_picker/CHANGELOG.md index 9c560e3..48fa82a 100644 --- a/packages/ready_picker/CHANGELOG.md +++ b/packages/ready_picker/CHANGELOG.md @@ -97,3 +97,7 @@ ## 2.0.0 * Use ready version 2.0.0 + +## 2.1.0 + +* Use ready version 2.1.0 diff --git a/packages/ready_picker/pubspec.yaml b/packages/ready_picker/pubspec.yaml index d535a87..27f312c 100644 --- a/packages/ready_picker/pubspec.yaml +++ b/packages/ready_picker/pubspec.yaml @@ -1,6 +1,6 @@ name: ready_picker description: Pop up picker that uses ready controllers -version: 2.0.0 +version: 2.1.0 homepage: https://github.com/mo-ah-dawood/ready environment: @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - ready: ^2.0.0 + ready: ^2.1.0 dev_dependencies: flutter_test: diff --git a/packages/ready_validation/example/pubspec.lock b/packages/ready_validation/example/pubspec.lock index dcaf85f..cc5f617 100644 --- a/packages/ready_validation/example/pubspec.lock +++ b/packages/ready_validation/example/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" clock: dependency: transitive description: @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.2" flutter: dependency: transitive description: flutter @@ -46,14 +46,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.18.1" - js: - dependency: transitive - description: - name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.dev" - source: hosted - version: "0.6.5" lints: dependency: transitive description: @@ -66,18 +58,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" path: dependency: transitive description: @@ -122,6 +114,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=1.17.0" diff --git a/packages/ready_validation/example/pubspec.yaml b/packages/ready_validation/example/pubspec.yaml index da3052a..a283ded 100644 --- a/packages/ready_validation/example/pubspec.yaml +++ b/packages/ready_validation/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.17.0 <4.0.0" dependencies: ready_validation: diff --git a/ready/CHANGELOG.md b/ready/CHANGELOG.md index 972eb86..4f47c99 100644 --- a/ready/CHANGELOG.md +++ b/ready/CHANGELOG.md @@ -54,3 +54,7 @@ * Remove freezd and equatble instead +## 2.1.0 + +* Use bloc + diff --git a/ready/example/lib/ready_grid.dart b/ready/example/lib/ready_grid.dart index 2aeeb34..e20c99b 100644 --- a/ready/example/lib/ready_grid.dart +++ b/ready/example/lib/ready_grid.dart @@ -1,6 +1,5 @@ import 'package:example/fake_data.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ready/ready.dart'; class ReadyGridExample extends StatelessWidget { @@ -28,24 +27,13 @@ class ReadyGridExample extends StatelessWidget { ), ); }, - controller: ReadyListCubit(ReadyListState.intitial()), + controller: ReadyListCubit(), ); } } -abstract class BaseController> extends Cubit - implements ReadyListController { - BaseController(S initialState) : super(initialState); -} - -abstract class BaseController2 extends BaseController> - with ReadyListControllerCopyMixin { - BaseController2(ReadyListState initialState) : super(initialState); -} - -class ReadyListCubit extends BaseController2 - with ReadyRemoteControllerMixin { - ReadyListCubit(ReadyListState initialState) : super(initialState); +class ReadyListCubit extends DefaultReadyRemoteController { + ReadyListCubit() : super(ReadyListState.initial()); @override Future> loadData(int skip, int? pageSize, @@ -54,3 +42,22 @@ class ReadyListCubit extends BaseController2 return RemoteResult.success(list, 100); } } + +class OtherController extends ValueNotifier> { + DefaultReadyListController controller = + DefaultReadyListController(ReadyListState.initial()); + + OtherController(ReadyListState value) : super(value); + + @override + void notifyListeners() { + controller.setState(value); + super.notifyListeners(); + } + + @override + void dispose() { + controller.close(); + super.dispose(); + } +} diff --git a/ready/example/lib/ready_list.dart b/ready/example/lib/ready_list.dart index aa5d603..78143ef 100644 --- a/ready/example/lib/ready_list.dart +++ b/ready/example/lib/ready_list.dart @@ -1,6 +1,5 @@ import 'package:example/fake_data.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ready/ready.dart'; class ReadyListExample extends StatelessWidget { @@ -20,7 +19,7 @@ class ReadyListExample extends StatelessWidget { buildItem: (FakeItem? item, int index) { return _buildItem(item, index); }, - controller: ReadyListCubit(ReadyListState.intitial()), + controller: ReadyListCubit(ReadyListState.initial()), ); } @@ -55,31 +54,13 @@ class ReadyListExample extends StatelessWidget { } } -abstract class BaseController> extends Cubit - implements ReadyListController { - BaseController(S initialState) : super(initialState); -} - -abstract class BaseController2 extends BaseController> - with ReadyListControllerCopyMixin { - BaseController2(ReadyListState initialState) : super(initialState); -} - -class ReadyListCubit extends BaseController2 - with ReadyRemoteControllerMixin { +class ReadyListCubit extends DefaultReadyRemoteController { ReadyListCubit(ReadyListState initialState) : super(initialState); @override Future> loadData(int skip, int? pageSize, [ICancelToken? cancelToken]) async { - var list = await FakeRepo.asyncList(30, 0, const Duration(seconds: 3)); + var list = await FakeRepo.asyncList(pageSize ?? 20); return RemoteResult.success(list, 100); } - - @override - void onChange(Change> change) { - // print(change.currentState); - // print(change.nextState); - super.onChange(change); - } } diff --git a/ready/example/lib/responsive.dart b/ready/example/lib/responsive.dart index a1f5b4d..3bb605e 100644 --- a/ready/example/lib/responsive.dart +++ b/ready/example/lib/responsive.dart @@ -1,10 +1,9 @@ import 'package:example/fake_data.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ready/ready.dart'; class ResponsiveList extends StatelessWidget { - final controller = ReadyListCubit(ReadyListState.intitial()); + final controller = ReadyListCubit(ReadyListState.initial()); final bool sub; ResponsiveList({ Key? key, @@ -110,24 +109,13 @@ class ResponsiveList extends StatelessWidget { } } -abstract class BaseController> extends Cubit - implements ReadyListController { - BaseController(S initialState) : super(initialState); -} - -abstract class BaseController2 extends BaseController> - with ReadyListControllerCopyMixin { - BaseController2(ReadyListState initialState) : super(initialState); -} - -class ReadyListCubit extends BaseController2 - with ReadyRemoteControllerMixin { +class ReadyListCubit extends DefaultReadyRemoteController { ReadyListCubit(ReadyListState initialState) : super(initialState); int value = 1; @override Future> loadData(int skip, int? pageSize, [ICancelToken? cancelToken]) async { - var list = await FakeRepo.asyncList(pageSize ?? 20, skip); + var list = await FakeRepo.asyncList(pageSize ?? 20); return RemoteResult.success(list, 100); } } diff --git a/ready/lib/src/animated_items/animated_item.dart b/ready/lib/src/animated_items/animated_item.dart index c7b6c66..d69a30d 100644 --- a/ready/lib/src/animated_items/animated_item.dart +++ b/ready/lib/src/animated_items/animated_item.dart @@ -145,7 +145,7 @@ class _AnimatedState extends State with TickerProviderStateMixin { .transform(t), child: Transform( transform: transform, - alignment:widget.alignment, + alignment: widget.alignment, child: widget.builder(t), ), ); diff --git a/ready/lib/src/controllers/controllers.dart b/ready/lib/src/controllers/controllers.dart index b13b067..5aa07ec 100644 --- a/ready/lib/src/controllers/controllers.dart +++ b/ready/lib/src/controllers/controllers.dart @@ -2,9 +2,9 @@ library controllers; import 'dart:async'; +import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart' hide State; - part 'extensions.dart'; part 'ready_list_controller.dart'; part 'ready_list_remote_controller.dart'; diff --git a/ready/lib/src/controllers/extensions.dart b/ready/lib/src/controllers/extensions.dart index bd3480c..59a3e1e 100644 --- a/ready/lib/src/controllers/extensions.dart +++ b/ready/lib/src/controllers/extensions.dart @@ -4,67 +4,8 @@ typedef TotalCountResolver = int Function( int currentTotalCount, int difference); int _defaultResolver(int current, int difference) => current + difference; -extension ReadyListStateExt> +extension ReadyListStateExt> on ReadyListController { - /// emit requestFirstLoading - void requestFirstLoading(int pageSize, [ICancelToken? cancelToken]) { - return emit(copyWith( - stateType: StateType.requestFirstLoading, - cancelToken: cancelToken, - pageSize: pageSize, - )); - } - - /// emit isLoadingFirstTime - void isLoadingFirstTime() { - return emit(copyWith(stateType: StateType.isLoadingFirstTime)); - } - - /// emit loaded - void loaded({ - required Iterable items, - required int totalCount, - }) { - return emit(copyWith( - stateType: StateType.loaded, - items: items, - totalCount: totalCount, - )); - } - - /// emit error - void error({required ErrorDisplayCallBack display}) { - return emit(copyWith(stateType: StateType.error, errorDisplay: display)); - } - - /// emit requestNextLoading - void requestNextLoading(int pageSize, [ICancelToken? cancelToken]) { - return emit(copyWith( - stateType: StateType.requestNextLoading, - cancelToken: cancelToken, - pageSize: pageSize, - )); - } - - /// emit isLoadingNext - void isLoadingNext() { - return emit(copyWith(stateType: StateType.isLoadingNext)); - } - - /// emit requestRefreshing - void requestRefreshing(int pageSize, [ICancelToken? cancelToken]) { - return emit(copyWith( - stateType: StateType.requestRefreshing, - cancelToken: cancelToken, - pageSize: pageSize, - )); - } - - /// emit isRefreshing - void isRefreshing() { - return emit(copyWith(stateType: StateType.isRefreshing)); - } - int diff(int original, int current) { return current - original; } @@ -74,7 +15,7 @@ extension ReadyListStateExt> /// /// The list must be growable. S add(T value, [TotalCountResolver totalCountResolver = _defaultResolver]) { - return copyWith( + return state.copyWith( items: [...state.items, value], totalCount: totalCountResolver(state.totalCount, 1), ); @@ -86,7 +27,7 @@ extension ReadyListStateExt> /// The list must be growable. S addAll(Iterable iterable, [TotalCountResolver totalCountResolver = _defaultResolver]) { - return copyWith( + return state.copyWith( items: [...state.items, ...iterable], totalCount: totalCountResolver(state.totalCount, iterable.length), ); @@ -104,7 +45,7 @@ extension ReadyListStateExt> var current = state.items; List data = current is List ? current : current.toList(); data.insert(index, element); - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, 1), ); @@ -122,7 +63,7 @@ extension ReadyListStateExt> var current = state.items; List data = current is List ? current : current.toList(); data.insertAll(index, iterable); - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, iterable.length), ); @@ -144,7 +85,7 @@ extension ReadyListStateExt> var oldLength = data.length; data.remove(value); var newLength = data.length; - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -169,7 +110,7 @@ extension ReadyListStateExt> var oldLength = data.length; data.removeRange(start, end); var newLength = data.length; - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -194,7 +135,7 @@ extension ReadyListStateExt> var oldLength = data.length; data.removeWhere(test); var newLength = data.length; - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -210,7 +151,7 @@ extension ReadyListStateExt> var oldLength = data.length; data.removeLast(); var newLength = data.length; - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -231,7 +172,7 @@ extension ReadyListStateExt> var oldLength = data.length; data.removeAt(index); var newLength = data.length; - return copyWith( + return state.copyWith( items: data, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -257,7 +198,7 @@ extension ReadyListStateExt> var oldLength = data.length; var newData = data.where(test); var newLength = newData.length; - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newLength)), @@ -280,7 +221,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.skip(count); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -301,7 +242,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.skipWhile(test); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -321,7 +262,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.take(count); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -340,7 +281,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.takeWhile(test); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -366,7 +307,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.expand(toElements); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -382,7 +323,7 @@ extension ReadyListStateExt> [TotalCountResolver totalCountResolver = _defaultResolver]) { var oldLength = state.items.length; var newData = state.items.followedBy(other); - return copyWith( + return state.copyWith( items: newData, totalCount: totalCountResolver(state.totalCount, diff(oldLength, newData.length)), @@ -415,12 +356,13 @@ extension ReadyListStateExt> /// } /// } S map(T Function(T) toElement) { - return copyWith(items: state.items.map(toElement)); + return state.copyWith(items: state.items.map(toElement)); } /// replace items where test return `true` S replaceWhere({required bool Function(T) where, required T item}) { - return copyWith(items: state.items.map((old) => where(old) ? item : old)); + return state.copyWith( + items: state.items.map((old) => where(old) ? item : old)); } /// Whether this collection has no elements. @@ -599,7 +541,7 @@ extension ReadyListStateExt> /// Removes all objects from this list; the length of the list becomes zero. S clear([TotalCountResolver totalCountResolver = _defaultResolver]) { - return copyWith( + return state.copyWith( items: [], totalCount: totalCountResolver(state.totalCount, diff(state.items.length, 0)), diff --git a/ready/lib/src/controllers/ready_list_controller.dart b/ready/lib/src/controllers/ready_list_controller.dart index a158853..684038e 100644 --- a/ready/lib/src/controllers/ready_list_controller.dart +++ b/ready/lib/src/controllers/ready_list_controller.dart @@ -1,43 +1,107 @@ part of controllers; -abstract class ReadyListController> { - /// The current state - S get state; - - /// The stream to listen please use broadcast stream to allow multiple listeners - Stream get stream; - - /// emitting new state to stream - void emit(S state); - - S copyWith({ - Iterable? items, - int? totalCount, - int? pageSize, - ErrorDisplayCallBack? errorDisplay, - StateType? stateType, - ICancelToken? cancelToken, - }); +abstract class ReadyListController> + extends Cubit { + ReadyListController(super.initialState); + void setState(S state) { + emit(state); + } + + /// emit requestFirstLoading state + void requestFirstLoading(int pageSize, [ICancelToken? cancelToken]); + + /// emit isLoadingFirstTime state + void isLoadingFirstTime(); + + /// emit loaded + void loaded({required Iterable items, required int totalCount}); + + /// emit error + void error({required ErrorDisplayCallBack display}); + + /// emit requestNextLoading + void requestNextLoading(int pageSize, [ICancelToken? cancelToken]); + + /// emit isLoadingNext + void isLoadingNext(); + + /// emit requestRefreshing + void requestRefreshing(int pageSize, [ICancelToken? cancelToken]); + + /// emit isRefreshing + void isRefreshing(); } -mixin ReadyListControllerCopyMixin - on ReadyListController> { - @override - ReadyListState copyWith({ - Iterable? items, - int? totalCount, - int? pageSize, - ErrorDisplayCallBack? errorDisplay, - StateType? stateType, - ICancelToken? cancelToken, - }) { - return ReadyListState( - items: items ?? state.items, - totalCount: totalCount ?? state.totalCount, - pageSize: pageSize ?? state.pageSize, - errorDisplay: errorDisplay ?? state.errorDisplay, - stateType: stateType ?? state.stateType, - cancelToken: cancelToken ?? state.cancelToken, - ); +mixin ReadyListControllerMixin> + on ReadyListController { + /// emit requestFirstLoading state + @override + void requestFirstLoading(int pageSize, [ICancelToken? cancelToken]) { + return emit(state.copyWith( + stateType: StateType.requestFirstLoading, + cancelToken: cancelToken, + pageSize: pageSize, + )); + } + + /// emit isLoadingFirstTime state + @override + void isLoadingFirstTime() { + return emit(state.copyWith(stateType: StateType.isLoadingFirstTime)); } + + /// emit loaded + @override + void loaded({required Iterable items, required int totalCount}) { + return emit(state.copyWith( + stateType: StateType.loaded, + items: items, + totalCount: totalCount, + )); + } + + /// emit error + @override + void error({required ErrorDisplayCallBack display}) { + return emit( + state.copyWith(stateType: StateType.error, errorDisplay: display)); + } + + /// emit requestNextLoading + @override + void requestNextLoading(int pageSize, [ICancelToken? cancelToken]) { + return emit(state.copyWith( + stateType: StateType.requestNextLoading, + cancelToken: cancelToken, + pageSize: pageSize, + )); + } + + /// emit isLoadingNext + @override + void isLoadingNext() { + return emit(state.copyWith(stateType: StateType.isLoadingNext)); + } + + /// emit requestRefreshing + @override + void requestRefreshing(int pageSize, [ICancelToken? cancelToken]) { + return emit(state.copyWith( + stateType: StateType.requestRefreshing, + cancelToken: cancelToken, + pageSize: pageSize, + )); + } + + /// emit isRefreshing + @override + void isRefreshing() { + return emit(state.copyWith(stateType: StateType.isRefreshing)); + } +} + +class DefaultReadyListController + extends ReadyListController> + with ReadyListControllerMixin { + DefaultReadyListController(super.initialState); } diff --git a/ready/lib/src/controllers/ready_list_remote_controller.dart b/ready/lib/src/controllers/ready_list_remote_controller.dart index d26d5dd..bdbf216 100644 --- a/ready/lib/src/controllers/ready_list_remote_controller.dart +++ b/ready/lib/src/controllers/ready_list_remote_controller.dart @@ -14,7 +14,7 @@ class RemoteResult { errorDisplay = null; } -mixin ReadyRemoteControllerMixin> +mixin ReadyRemoteControllerMixin> on ReadyListController { /// load data from remote source Future> loadData(int skip, int? pageSize, @@ -110,3 +110,8 @@ mixin ReadyRemoteControllerMixin> } } } + +abstract class DefaultReadyRemoteController + extends DefaultReadyListController with ReadyRemoteControllerMixin { + DefaultReadyRemoteController(super.initialState); +} diff --git a/ready/lib/src/controllers/ready_list_state.dart b/ready/lib/src/controllers/ready_list_state.dart index 7be638e..1ca820a 100644 --- a/ready/lib/src/controllers/ready_list_state.dart +++ b/ready/lib/src/controllers/ready_list_state.dart @@ -9,7 +9,7 @@ abstract class ICancelToken { } enum StateType { - intitial, + initial, requestFirstLoading, isLoadingFirstTime, loaded, @@ -20,6 +20,18 @@ enum StateType { isRefreshing, } +mixin ICopyWith> + on BaseReadyListState { + State copyWith({ + Iterable? items, + int? totalCount, + int? pageSize, + ErrorDisplayCallBack? errorDisplay, + StateType? stateType, + ICancelToken? cancelToken, + }); +} + abstract class BaseReadyListState extends Equatable { final Iterable items; final int totalCount; @@ -34,7 +46,7 @@ abstract class BaseReadyListState extends Equatable { required this.errorDisplay, required this.stateType, required this.cancelToken, - }) : assert(items.length <= totalCount); + }); @override List get props => [ @@ -46,7 +58,8 @@ abstract class BaseReadyListState extends Equatable { ]; } -class ReadyListState extends BaseReadyListState { +class ReadyListState extends BaseReadyListState + with ICopyWith> { const ReadyListState({ super.items = const [], super.totalCount = 0, @@ -56,11 +69,30 @@ class ReadyListState extends BaseReadyListState { super.cancelToken, }); - const ReadyListState.intitial({ + const ReadyListState.initial({ super.items = const [], super.totalCount = 0, super.pageSize = 20, super.errorDisplay, }) : assert(items.length <= totalCount), - super(cancelToken: null, stateType: StateType.intitial); + super(cancelToken: null, stateType: StateType.initial); + + @override + ReadyListState copyWith({ + Iterable? items, + int? totalCount, + int? pageSize, + ErrorDisplayCallBack? errorDisplay, + StateType? stateType, + ICancelToken? cancelToken, + }) { + return ReadyListState( + items: items ?? this.items, + totalCount: totalCount ?? this.totalCount, + pageSize: pageSize ?? this.pageSize, + errorDisplay: errorDisplay ?? this.errorDisplay, + stateType: stateType ?? this.stateType, + cancelToken: cancelToken ?? this.cancelToken, + ); + } } diff --git a/ready/lib/src/ready_list/ready_list.dart b/ready/lib/src/ready_list/ready_list.dart index 0d50990..f367b48 100644 --- a/ready/lib/src/ready_list/ready_list.dart +++ b/ready/lib/src/ready_list/ready_list.dart @@ -190,7 +190,7 @@ class _ReadyListState, @override void didChangeDependencies() { - if (state.stateType == StateType.intitial) { + if (state.stateType == StateType.initial) { var configuration = _ReadyListConfigOptionsDefaults.effective(widget, context); widget.controller.requestFirstLoading(configuration.pageSize); @@ -201,7 +201,7 @@ class _ReadyListState, @override void didUpdateWidget(covariant ReadyList oldWidget) { - if (state.stateType == StateType.intitial) { + if (state.stateType == StateType.initial) { var configuration = _ReadyListConfigOptionsDefaults.effective(widget, context); widget.controller.requestFirstLoading(configuration.pageSize); @@ -365,7 +365,7 @@ class _ReadyListState, return _buildPlaceholders( shrinkWrap, configuration, false, state.errorDisplay!(context)); case StateType.isLoadingFirstTime: - case StateType.intitial: + case StateType.initial: case StateType.requestFirstLoading: return !configuration.allowFakeItems ? _buildPlaceholders(shrinkWrap, configuration, true, null) @@ -398,7 +398,7 @@ class _ReadyListState, shrinkWrap, configuration, false, state.errorDisplay!(context)), ); case StateType.isLoadingFirstTime: - case StateType.intitial: + case StateType.initial: case StateType.requestFirstLoading: return widget._slivers!( state, diff --git a/ready/lib/src/responsive_data_table/data_table/data_table.dart b/ready/lib/src/responsive_data_table/data_table/data_table.dart index 49bdb96..bebb53b 100644 --- a/ready/lib/src/responsive_data_table/data_table/data_table.dart +++ b/ready/lib/src/responsive_data_table/data_table/data_table.dart @@ -174,15 +174,15 @@ class _DataTableState, }) { final List result = []; final int startIndex = (paging.currentPage - 1) * paging.rowsPerPage; - bool loading = ![StateType.error, StateType.loaded, StateType.intitial] + bool loading = ![StateType.error, StateType.loaded, StateType.initial] .contains(widget.controller.state); - var length = widget.controller.length; + var length = widget.controller.state.items.length; for (int index = startIndex; index < startIndex + paging.rowsPerPage; index++) { if (index < length) { - var element = widget.controller.elementAt(index); + var element = widget.controller.state.items.elementAt(index); result.add(_buildRow( options: options, index: index, diff --git a/ready/lib/src/responsive_data_table/data_table/footer.dart b/ready/lib/src/responsive_data_table/data_table/footer.dart index ac84a46..d2024d4 100644 --- a/ready/lib/src/responsive_data_table/data_table/footer.dart +++ b/ready/lib/src/responsive_data_table/data_table/footer.dart @@ -25,9 +25,10 @@ class _FooterState, S get state => widget.controller.state; bool _loading = false; - int get length => widget.controller.length; + int get length => widget.controller.state.items.length; - int get totalCount => math.max(state.totalCount, widget.controller.length); + int get totalCount => + math.max(state.totalCount, widget.controller.state.items.length); bool get _canGoNext => !_loading && (paging.currentPage * paging.rowsPerPage) < totalCount; @@ -71,7 +72,7 @@ class _FooterState, toFirst(); } - bool loading = ![StateType.error, StateType.loaded, StateType.intitial] + bool loading = ![StateType.error, StateType.loaded, StateType.initial] .contains(widget.controller.state); if (loading != _loading) { diff --git a/ready/lib/src/responsive_data_table/responsive_data_table.dart b/ready/lib/src/responsive_data_table/responsive_data_table.dart index 407fee8..c5bc9fe 100644 --- a/ready/lib/src/responsive_data_table/responsive_data_table.dart +++ b/ready/lib/src/responsive_data_table/responsive_data_table.dart @@ -490,7 +490,8 @@ class _SelectedIndices, @override void selectAll() { - value = List.generate(controller.length, (index) => index).toSet(); + value = + List.generate(controller.state.items.length, (index) => index).toSet(); } @override diff --git a/ready/pubspec.yaml b/ready/pubspec.yaml index 2f53508..2135374 100644 --- a/ready/pubspec.yaml +++ b/ready/pubspec.yaml @@ -1,6 +1,6 @@ name: ready description: Package that contains complete list solution and admin dashboard -version: 2.0.0 +version: 2.1.0 homepage: https://github.com/mo-ah-dawood/ready environment: @@ -13,6 +13,7 @@ dependencies: intl: ^0.18.1 equatable: ^2.0.5 flutter_staggered_grid_view: ^0.7.0 + bloc: ^8.1.2 dev_dependencies: