Difficultés sur la création des interfaces du cours (chapitre 2 avt dernière vidéo)

Bonjour à tous,

Je rencontre une difficulté dans le cours architecture et navigation. Dans l’avant dernière vidéo du chapitre 2, Maxime nous propose de mettre en place une interface ILoginUseCases entre le viewmodel et le usecases. J’ai l’impression d’avoir suivi pas à pas la consigne, mais au moment de faire appel au usecases dans la création du View - ViewModel dans le main le usecase reste souligné en rouge parcequ’il n’est pas du type de l’interface. Si quelqu’un sait pourquoi voilà le code :



J’ai essayé de changer le implements par extends et de créer le LoginUsescases() as ILoginUseCases() : Ca ne fonctionne pas non plus.

Hello Xavier,
Je suis moi-même sur ce cours (fabuleux, y a du level exigé, comme on dit, tant sur le plan pédagogique côté Maxime (et il assure grave avec du si difficile à enseigner), que sur le plan apprentissages côté élève (lesquels restent très fragiles sur certains caps à franchir. Notamment par la désynchronisation entre les versions Flutter du cours et celle d’aujourd’hui. J’ai toutefois franchis le point où tu en est. Je te copie mon code :

import 'package:flutter/material.dart';
import 'package:flutter_application_1/data/use_cases/login_use_case.dart';
import 'package:flutter_application_1/ui%20/%20screens/login_screen.dart';
import 'package:flutter_application_1/ui%20/%20screens/login_viewmodel.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Purple Giraffe - Flutter Avancé',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        // colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        // useMaterial3: true,
      ),
      home: LoginScreen(LoginViewModel(LoginUseCases())),
    );
  }
}
 

Je m’interroge toutefois, car tu as en ligne 23 un home: LoginView(...), et moi j’ai un home: LoginScreen(...), Est toi qui a changé le nom LoginScreen en LoginView? Car si tu n’as rien changé, cela peut vouloir dire que c’est moi qui t’envoie un code mal ciblé (sachant que je conserve strictement les nommages du cours (à part User(23, « [email protected] ») que je remplace par
User(49, « [email protected] » ) :rofl:
Dis moi si cela t’aide, éventuellement je reste en contact.

Hello @jmz,

Merci d’avoir pris le temps de partager ton code :slight_smile:
Effectivement j’ai fait le choix d’appeler ma vue LoginView et non LoginScreen, mais pour le coup je pense que ca n’a pas d’impact (puisque le widget associé que j’ai créé s’appel bien LoginView).

Je pense que le problème se situe ailleurs :slight_smile: Mais où telle est la question :wink:

D’ailleurs quand je « cut » l’interface ILoginUseCases en disant au ViewModel de recevoir un LoginUseCases tout fonctionne. J’aimerai bien faire marcher cette interface :slight_smile:

Salut,

Je suis pas aussi calé que vous la dedans et peut être que ça n’a rien à voir mais ta ligne 24 tu as écris

LoginUseCases

alors que plus haut ligne 5 tu l’a appelé

ILoginUseCases

Est-ce qu’il n’y aurait pas un " I " en trop ?

Hello @tosk8an
Merci pour ton message. C’est bien l’objectif. Si ma compréhension des choses est bonne, on crée un Usecases qui hérite (extends implements la pour le coup je ne connais pas encore la différence) d’une interface IUsecases. Du coup on devrait pourvoir appeler là ou une interface est attendue, la classe heritère de l’interface. L’intérêt évoqué dans le cours est de pouvoir faciliter les tests sur le code.
Comme je l’écrivais dans le message de @jmz et en lien avec ton message, quand je court circuite l’interface il n’y a effectivement pas de problème.
J’aimerai bien réussir à ne pas la court circuiter :wink:

1 « J'aime »

Pas de problème pour renommer le code à ta façon. Mais en phase d’apprentissage, cela peut devenir compliqué pour le cerveau de développer de la compréhension sur du code « opaque » parce que justement en cours d’apprentissage, tout en ayant à développer simultanément de la transposition de noms. C’est loin d’être facile dans ce cas de construire et d’avoir une bonne image mentale de l’ensemble, mais tu dois savoir tout cela. Regardant ton problème je t’adresse un zip du dossier lib du code de mon projet à ce jours (à la fin du chapitre 2 - Vues et gestion des données) avec toutes les versions impliquées à jour. Normalement, si tu dézippe et exécute, ça devrait marcher?! Si le run me marche pas, ce sera dû aux différences entre nos 2 plateformes, mais tu pourras quand même lire et comparer tous mes fichiers avec les tiens, pour y déceler d’éventuelles différences. Aie, Impossible de charger le zip complet (trop lourd peut-être?!) alors je joins la partie lib. Si tu me communique ton email, je t’adresserai le zip global.
lib.zip (8,8 Ko)
A+ éventuellement :wink:

@jmz Je te remercie pour les conseils mais ma question n’est pas sur la méthode d’apprentissage. De plus le remplacement de LoginScreen par LoginView n’affecte en rien l’image mentale que j’ai du projet :joy:
D’ailleurs si tu regardes mes captures, on voit bien que le soucis ne vient absolument pas de là puisque ce que la View accepte le ViewModel sans problème, et que c’est le usecase qu’attend le ViewModel qui pose problème…

Si toutefois quelqu’un à une idée précisise sur la question initiale je serai ravis de la lire :slight_smile:

Hello,

J’ai tenté de reproduire ton problème et pour moi ça fonctionne…

J’ai remarqué que tu avais déclaré ton ILoginUseCases dans le fichier login_viewmodel.dart, n’aurais tu pas déclaré cette classe dans 2 fichiers différents ? Cela pourrait expliquer pourquoi le compilateur voit une différence de type.

1 « J'aime »

Hello @isanforc
Merci pour ton message. Tu me conseilles de regarder les imports de chacun de mes fichiers et de vérifier que je n’importe pas deux fichiers qui auraient tout les deux le ILoginUseCases c’est bien ca ?

Oui, c’est une piste :slightly_smiling_face:

1 « J'aime »

J’ai passé un moment sur ce bug avec @Xababa_Dalabama et nous avons trouvé la solution.
C’était tellement étrange et nous a fait galérer pendant un petit moment.
Il a suffit de déplacer la déclaration de l’interface ILoginUseCases en dehors du fichier login_view_model.dart, spécifiquement je l’ai mis dans le fichier login_use_case.dart mais je pense que ça aurait aussi marché ailleurs.

Ça ressemble un bug du compilateur car :

  • il n’y a aucune raison de devoir déplacer cette interface
  • les erreurs de compilation n’étaient pas détectées par VSCode (il fallait lancer la compilation pour voir l’erreur dans le terminal)
  • en relançant VSCode l’erreur apparaissait, mais les changements n’étaient plus pris en compte jusqu’au prochain redémarrage de vscode

Vraiment bizarre comme problème :thinking:

2 « J'aime »