Model Riverpod

SimulatorSessionState

@immutable
class SimulatorSessionState {
  final int id;
  final String name;
  final Country destinationCountry;
  final double duration;
  final bool isMainSimulation;
  final SimulationStats stats;
  final Datetime createdAt;
  final CurrencyRateModel currentCurrency;
  final CurrencyRateModel otherCurrency;

SimulatorSessionState

@immutable
class SimulatorSessionDetailsState {
  double confidenceIndicator;
  SimulationStats stats;
  List<SimulationDetails> simulationDetails;

  SimulatorSessionDetailsState({this.confidenceIndicator, this.stats, this.simulationDetails});

  SimulatorSessionDetailsState.initial();

  SimulatorSessionDetailsState copyWith(double? confidenceIndicator, SimulationStats? stats, List<SimulationDetails>? simulationDetails) {
    return SimulatorSessionDetailsState(confidenceIndicator: confidenceIndicator ?? this.confidenceIndicator, 
            stats: stats ?? this.stats,
            simulationDetails: simulationDetails ?? this.simulationDetails);
  }
}

Notifier

class SimulationsStateNotifier extends StateNotifier<List<SimulatorSessionState>> {
  final Ref _ref;

  SimulatorSessionStateNotifier(this._ref) : super(SimulatorSessionState.initial());

  // Let's allow the UI to add simulation.
  void addSimulation(SimulatorSessionInputModel simulation);
  
  // Let's allow removing simulation
  void removeSimulation(String simulationId);
  
  // Let's mark a simulation as principal
  void setIsMainSimulation(String simulationId);

  // Let's allow the UI to update simulation.
  void updateSimulatorSessionModel(String simulationId, SimulatorSessionInputModel simulation);

  void swapCurrencies(String simulationId);
class SimulationDetailsStateNotifier extends StateNotifier<SimulatorSessionDetailsState> {
  final Ref _ref;

  SimulationDetailsStateNotifier(this._ref) : super(SimulatorSessionDetailsState.initial());

  // Find the Simulation Detail in the repository
  void init();
  
  // Let's allow the UI to add BudgetItem at simulationId
  void addSimulatorSessionItem(String simulationId, SimulatorSessionItemInputModel budgetItem);

  // Let's allow the UI removing BudgetItem at simulationId
  void removeSimulatorSessionItem(String simulationId, String budgetItemId);

  // Let's allow the UI updating BudgetItem at simulationId
  void updateSimulatorSessionItem(String simulationId, SimulatorSessionItemInputModel budgetItem);

  // Let's allow the UI to swap currencies
  void swapCurrencies(String simulationId);

Providers

Allow the UI to interact with our SimulationsStateNotifier class.

final simulationsStatesProvider = StateNotifierProvider<SimulationsStateNotifier, List<SimulatorSessionState>>((ref) {
  return SimulationsStateNotifier();
});

final simulationDetailProvider = StateNotifierProvider<SimulationDetailsStateNotifier, SimulatorSessionDetailsState>((ref) {
  return SimulationDetailsStateNotifier();
});