View

SimulatorSession ListView

class SimulatorSessionListView extends ConsumerWidget {
  const SimulatorSessionListView({Key? key}): super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // rebuild the widget when the SimulatorSession list changes
    List<SimulatorSessionState> simulatorSessions = ref.watch(simulatorSessionsProvider);

    // Let's render the SimulatorSessions in a scrollable list view
    return ListView(
      children: [
        for (final simulatorSession in simulatorSessions)
          WidgetSimulatorSessionTile(
            isMainSimulatorSession: simulatorSession.isMainSimulatorSession,
            
            // When pin is tapped, change its isMainSimulatorSession value
            onPinChanged: (value) => ref.read(simulatorSessionsProvider.notifier).setIsMainSimulation(simulatorSession.id),
            
            // When tile is swipe on the left, remove the current SimulatorSession
            onRemoved: (value) => ref.read(simulatorSessionsProvider.notifier).remove(simulatorSession.id),

            title: Text(simulatorSession.name),
          ),
      ],

      WidgetButton(
        child: Text('Nouvelle SimulatorSession'),
        // When button tapped, add new SimulatorSession
        onTapped: (simulatorSession) => ref.read(simulatorSessionsProvider.notifier).add(simulatorSession),
      )
    );
  }
}

SimulatorSessionItem ListView

class SimulatorSessionItemListView extends ConsumerWidget {
  final Function<bool> setIsMainSimulationCallback;
  const SimulatorSessionItemListView({Key? key}): super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // rebuild the widget when the SimulatorSession changes
    SimulatorSessionState simulatorSession = ref.watch(simulatorSessionDetailProvider);


    // Let's render the SimulatorSessions in a scrollable list view
    return ListView(
      children: [
        WidgetSimulatorSessionContext(
          isMainSimulatorSession: (value) => setIsMainSimulationCallback(value),
          onValidationTriggered: (context) => updateContext(context)
        ),

        for (final SimulatorSessionItemCategory in SimulatorSession.SimulatorSessionItemItems)
          WidgetSimulatorSessionItemItemTile(
            // When pin is tapped, change its isMainSimulatorSession value
            onAdded: (itemId) => ref.read(simulatorSessionsProvider.notifier).addSimulatorSessionItem(simulatorSession.id, itemId),

            // When pin is tapped, change its isMainSimulatorSession value
            onChanged: (itemId) => ref.read(simulatorSessionsProvider.notifier).updateSimulatorSessionItem(simulatorSession.id, itemId),
            
            // When tile is swipe on the left, remove the current SimulatorSession
            onRemoved: (itemId) => ref.read(simulatorSessionDetailProvider.notifier).removeSimulatorSessionItem(simulatorSession.id, itemId),

            title: Text(simulatorSessionItemCategory.title),
            simulatorSessionItemItems: simulatorSessionItemCategory.items
          )
      ],
    );
  }
}

Simulation Details

WidgetSimulationDetailsTotal

  • List groups;
  • double remainingCostAmount; -> Si remainingCostAmount < 0 => "Reste à financer" en rouge -> Sinon (>= 0) => "Solde" en vert

WidgetSimulationStats

SimulationGroupStatsItemViewModel {
  String label;
  double amount;
  Color color;
}

// Input
- List<WidgetSimulationGroupStatsItemViewModel> items

Préparation par Riverpod de la List pour affichage.

WidgetSimulationStickySummary

La ligne tout en bas de l'écran toujours visible.

  final double totalResourcesAmount;
  final double totalCostsAmount;
  final double remainingCostAmount;

WidgetSimulationDetailsFooter

final Currency currentCurrency;