skip to Main Content

I have this classes for my model:

@freezed
class Generator with _$Generator {

  factory Generator({
    required int id,
    required double cost,
  }) = _Generator;

  factory Generator.fromJson(Map<String, Object?> json)  => _$GeneratorFromJson(json);
}


@riverpod
class GeneratorsNotifier extends _$GeneratorsNotifier {

  @override
  List<Generator> build() {
    return [
      for (final g in [
        {
          'id': 0,
          'cost': 2.63,
        },
        {
          'id': 1,
          'cost': 20.63,
        },
        {
          'id': 2,
          'cost': 139.63,
        },
        {
          'id': 3,
          'cost': 953.63,
          
        },
        {
          'id': 4,
          'cost': 5653.63,
        },
      ]) Generator.fromJson(g)
    ];
  }

  void addGenerator(Map<String, Object?> json) {
    state = [...state, Generator.fromJson(json)];
  }

  void changePrice(int id) {
    state = [
      for (final generator in state)
        if (generator.id == id)
          _createUpdatedGenerator(generator)
        else
          generator,
    ];
  }

  Generator _createUpdatedGenerator(Generator generator) {
    double newPrice = ...some logic here...
    Generator updatedGenerator = generator.copyWith(
        price: newPrice,
    );
    return updatedGenerator;
  }

}

The price for one single item is changed from another notifier:

@riverpod
class GameStatusNotifier extends _$GameStatusNotifier {

  @override
  GameStatus build() {
    return GameStatus(
      // some params
    );
  }

  void changePrice(int id) {
    state = ...some logic here that change the status...
    // now try to update the status of GeneratorsNotifier
    ref.read(generatorsNotifierProvider.notifier).changePrice(id);
  }
}

The flow is working as expected but every time the build() method of GeneratorsNotifier is called, the state get reset to the initial values. That does not happen for example for the build() in GameStatusNotifier (and for other example in documentation). How can I fix GeneratorsNotifier to not reset the status after build() is called?

2

Answers


  1. By default, generated providers are autodispose. Your provider is resetting when nobody watches it. To fix that, review the keepAlive options.

    Login or Signup to reply.
  2. keepalive or watch the provider in your widget build where you want to keep.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search