Skip to content

Failed to generate mixin on Store #1071

@subzero911

Description

@subzero911

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.
Image

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions