-
-
Notifications
You must be signed in to change notification settings - Fork 320
Open
Description
I have a repeating pagination code, so I moved it out from Store to mixin:
import 'package:mobx/mobx.dart';
import 'logger.dart' show log;
mixin PaginatedStoreMixin<T, R extends PaginatedResponse<T>> on Store {
@observable
ObservableList<T> models = ObservableList<T>();
@observable
ObservableFuture<R?> fetchFuture = ObservableFuture.value(null);
@observable
Object? _cursor;
@observable
Object? _previousCursor;
@computed
bool get hasReachedMax => _previousCursor == _cursor || _cursor == null;
@computed
bool get isLoading => fetchFuture.status == FutureStatus.pending;
Future<R?> performFetch(Object? cursor);
@action
Future<List<T>?> fetch() async {
fetchFuture = ObservableFuture(
performFetch(_cursor).catchError((error, stackTrace) {
log.e('Error while loading', error: error, stackTrace: stackTrace);
throw error;
}),
);
await fetchFuture;
final resp = fetchFuture.value;
if (resp != null && resp.data != null) {
models.addAll(resp.data!);
_previousCursor = _cursor;
_cursor = resp.cursor;
log.d('Elements loaded: ${resp.data!.length}');
log.d('cursor: $_cursor');
}
return resp?.data;
}
@action
void resetPagination() {
_cursor = null;
_previousCursor = null;
models.clear();
}
}
abstract class PaginatedResponse<T> {
List<T>? get data;
Object? get cursor;
}Then I override performFetch with a concrete repository.

Everything seems to work fine, but no data from PaginatedStoreMixin is being generated:
.g file
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'bots_payments_controller.dart';
// **************************************************************************
// StoreGenerator
// **************************************************************************
// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers
mixin _$BotsPaymentsController on _BotsPaymentsControllerBase, Store {
late final _$filtersModelAtom = Atom(
name: '_BotsPaymentsControllerBase.filtersModel',
context: context,
);
@override
BotsPaymentsFiltersModel get filtersModel {
_$filtersModelAtom.reportRead();
return super.filtersModel;
}
@override
set filtersModel(BotsPaymentsFiltersModel value) {
_$filtersModelAtom.reportWrite(value, super.filtersModel, () {
super.filtersModel = value;
});
}
late final _$exportCsvSettingsModelAtom = Atom(
name: '_BotsPaymentsControllerBase.exportCsvSettingsModel',
context: context,
);
@override
BotsPaymentsExportCsvSettingsModel get exportCsvSettingsModel {
_$exportCsvSettingsModelAtom.reportRead();
return super.exportCsvSettingsModel;
}
@override
set exportCsvSettingsModel(BotsPaymentsExportCsvSettingsModel value) {
_$exportCsvSettingsModelAtom.reportWrite(
value,
super.exportCsvSettingsModel,
() {
super.exportCsvSettingsModel = value;
},
);
}
late final _$_BotsPaymentsControllerBaseActionController = ActionController(
name: '_BotsPaymentsControllerBase',
context: context,
);
@override
void clearSearch() {
final _$actionInfo = _$_BotsPaymentsControllerBaseActionController
.startAction(name: '_BotsPaymentsControllerBase.clearSearch');
try {
return super.clearSearch();
} finally {
_$_BotsPaymentsControllerBaseActionController.endAction(_$actionInfo);
}
}
@override
void clearFilters() {
final _$actionInfo = _$_BotsPaymentsControllerBaseActionController
.startAction(name: '_BotsPaymentsControllerBase.clearFilters');
try {
return super.clearFilters();
} finally {
_$_BotsPaymentsControllerBaseActionController.endAction(_$actionInfo);
}
}
@override
String toString() {
return '''
filtersModel: ${filtersModel},
exportCsvSettingsModel: ${exportCsvSettingsModel}
''';
}
}Maybe related to #1047
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels