2025.02.03 (Lun)
2026.05.25 (Lun) mis Ă  jour

✹ RĂ©sumĂ© de GPT  

J’ai corrigĂ© le problĂšme de mise Ă  jour de FleatherViewer, puis terminĂ© la rĂ©solution d’issue et l’optimisation des performances en amĂ©liorant la mĂ©thode de filtrage de HomeFeedPage. GrĂące Ă  cela, j’ai compris qu’utiliser Conditional Visibility plutĂŽt que des filtres Query Ă©tait efficace.

đŸ’» Journal de dĂ©veloppement

⏰ Tñches du jour

  • ✅ (Issue) HomeFeedPage - FeedCardDiary : quand on change de date dans ListView, seul FleatherViewerWidget ne change pas de valeur.
    • Il semble que la valeur initialDeltaJson du Widget ne soit pas mise Ă  jour Ă  chaque changement de Diary Document.
    • J’ai demandĂ© Ă  o1, et il a rĂ©glĂ© ça du premier coup.

      /// didUpdateWidget:
      ///  - When only parameters change in the same widget tree, Flutter reuses the existing State.
      ///  - At this point, you can compare the new widget properties with the old widget properties and run any needed logic.
      @override
      void didUpdateWidget(covariant FleatherViewerWidget oldWidget) {
        super.didUpdateWidget(oldWidget);
      
        // 1) If the previous JSON and the new JSON are different
        if (oldWidget.initialDeltaJson != widget.initialDeltaJson) {
          // 2) Recreate the FleatherController
          _controller?.dispose();
          _controller = _createControllerFromDeltaJson(widget.initialDeltaJson);
          // 3) Refresh UI
          setState(() {});
        }
      }
      
      /// Helper function that creates a FleatherController from a Delta JSON string
      FleatherController _createControllerFromDeltaJson(String jsonString) {
        ParchmentDocument doc;
        try {
          final decoded = jsonDecode(jsonString);
          doc = ParchmentDocument.fromJson(decoded);
        } catch (e) {
          // If restoration fails, handle as plain text
          doc = ParchmentDocument.fromDelta(
            Delta()..insert(_ensureEndsWithNewline(jsonString)),
          );
        }
        return FleatherController(document: doc);
      }
      
  • ✅ (Issue) HomeFeedPage : Unexpected Null Value apparaĂźt briĂšvement puis disparaĂźt au On page load.
    • Il a Ă©tĂ© confirmĂ© que le problĂšme venait du filtrage par date appliquĂ© Ă  la ListView de HomeFeedPage.
    • J’ai essayĂ© d’activer Filter On Null Values dans l’option Backend Query de ListView.
      • Filter On Null Values : By default, if the value of any filter is null, the query will ignore the filter for that field. Checking this will instead keep null filters.
    • Backend Query - Query Collection tentative 1 (Ă©chec)
      • Filter On Null Values : ON
      • Filter 1 : created_time, Equal To, getFirstTimeOfTheDay
      • Filter 2 : created_time, Less Than, getFirstTimeOfNextDay
      • Order by : created_time, Decreasing
      • Impossible de terminer la configuration de Backend Query
        • Message d’erreur : You can’t order your query by a field used in a filter using == or in.
    • Backend Query - Query Collection tentative 2 (Ă©chec)
      • Filter On Null Values : ON
      • Filter 1 : created_time, Greater Than or Equal To, getFirstTimeOfTheDay
      • Filter 2 : created_time, Less Than, getFirstTimeOfNextDay
      • Order by : created_time, Decreasing
      • La configuration de Backend Query peut ĂȘtre terminĂ©e
      • En entrant en mode debug, l’erreur ci-dessous apparaĂźt et la page n’est pas créée.

        Assertion failed: file:/// opt/ - pub-cache/hosted/pub.dev/ cloud_firestore-5.5.0/lib/src/ query dart: 650:9
              
        conditions
        .where ((List<dynamic> item) => equality.equals(condition, item))
          .isEmpty
        "Condition [FieldPath([created_time]), !=, null] already exists in this query."
              
        The relevant error-causing widget was: HomeFeedWidget
        
    • Backend Query - Query Collection tentative 3 (Ă©chec)
      • Filter On Null Values : ON
      • Filter 1 : created_time, Greater Than, getLastTimeOfPrevDay
      • Filter 2 : created_time, Less Than, getFirstTimeOfNextDay
      • Order by : created_time, Decreasing
      • La configuration de Backend Query peut ĂȘtre terminĂ©e
      • En entrant en mode debug, l’erreur ci-dessous apparaĂźt et la page n’est pas créée.

        Assertion failed: file:/// opt/ - pub-cache/hosted/pub.dev/ cloud_firestore-5.5.0/lib/src/ query dart: 650:9
              
        conditions
        .where ((List<dynamic> item) => equality.equals(condition, item))
          .isEmpty
        "Condition [FieldPath([created_time]), !=, null] already exists in this query."
              
        The relevant error-causing widget was: HomeFeedWidget
        
    • Backend Query - Query Collection tentative 4 (Ă©chec)
      • Filter On Null Values : OFF
      • Filter 1 : created_time, Greater Than, getLastTimeOfPrevDay
      • Filter 2 : created_time, Less Than, getFirstTimeOfNextDay
      • Order by : created_time, Decreasing
      • La configuration de Backend Query peut ĂȘtre terminĂ©e
      • En entrant en mode debug, l’erreur ci-dessous apparaĂźt briĂšvement puis disparaĂźt.

        Unexpected Null value.
        
        The relevant error-causing widget was: HomeFeedWidget
        
    • (Question Ă  o1) Pourquoi Unexpected Null Value apparaĂźt-il briĂšvement ?
      • Il y a de fortes chances que FlutterFlow (ou son code interne) retourne null depuis getLastTimeOfPrevDay() ou getFirstTimeOfNextDay() au moment du chargement initial de la page. (Par exemple, la date n’est peut-ĂȘtre pas encore initialisĂ©e
)
      • Si Filter On Null Values est activĂ©, une condition sĂ©parĂ©e du type != null est ajoutĂ©e en interne, et cela peut entrer en conflit quand une valeur null arrive pendant le chargement.
      • D’oĂč le phĂ©nomĂšne : “brĂšve erreur null -> remplacĂ©e par la vraie valeur -> disparition Ă  la fin du chargement”.
    • Backend Query - Query Collection tentative 5 (succĂšs !)
      • Filter On Null Values : OFF
      • Order by : created_time, Decreasing
      • ParamĂštres Component Widget Conditional Visibility
        • Filter 1 : created_time, Greater Than, getLastTimeOfPrevDay
        • Filter 2 : created_time, Less Than, getFirstTimeOfNextDay
      • En bonus, le lag de chargement de ListView (Latency) a disparu. Donner en mĂȘme temps deux filtres et un Order Ă  la Query devait prendre beaucoup de temps.
    • 💡 Ce que j’ai appris
      • Quand on utilise Backend Query, il vaut mieux Ă©viter autant que possible les filtres et contrĂŽler avec Conditional Visibility.
      • C’était justement un point que j’avais demandĂ© au mentor au dĂ©but et pour lequel j’avais reçu une rĂ©ponse, mais je crois l’avoir seulement compris vaguement et ĂȘtre passĂ© Ă  autre chose, donc je l’ai finalement oubliĂ©. AprĂšs avoir galĂ©rĂ© dessus directement, je l’ai enfin compris clairement.
  • ✅ (Issue) DiaryPage : la date est toujours enregistrĂ©e comme aujourd’hui
    • CrĂ©ation du paramĂštre DiaryPage - dateFocused
    • Transmission de la valeur dateToShow de HomeFeedPage au paramĂštre dateFocused.

💯 RĂ©sumĂ© de ce que j’ai fait

Résolution du problÚme de mise à jour de FleatherViewer

  • Utilisation de didUpdateWidget pour que FleatherViewer se mette correctement Ă  jour Ă  chaque changement de Diary Document. Optimisation du filtrage de HomeFeedPage

Utilisation de Conditional Visibility au lieu du filtrage Backend Query pour améliorer les performances.

  • AmĂ©lioration de la vitesse de chargement en minimisant le filtrage Query.

Correction de l’erreur d’enregistrement de date de DiaryPage

  • AmĂ©lioration pour que la date sĂ©lectionnĂ©e soit reflĂ©tĂ©e lors de la rĂ©daction d’un nouveau journal, en transmettant la valeur dateFocused de HomeFeedPage Ă  DiaryPage.

🎯 À faire ensuite

Cliquer pour voir les détails
  • ❔ (Issue) DiaryPage : utiliser un lecteur Markdown (prĂ©venir le dĂ©bordement : Container Height)
  • ❔ (Issue) HomeFeedPage - FeedCardDiary : appliquer correctement l’image du personnage de l’AI Comment
    • ❔ DiaryPage - AI Comment : lors de la sauvegarde, enregistrer aussi dans Diary la Ref du personnage qui a rĂ©digĂ© le commentaire.
    • ❔ HomeFeedPage - FeedCardDiary - AI Image : charger le Character Doc avec Backend Query et dĂ©finir l’Image Path.
  • ❔ DiaryPage : changer l’Emoji d’expression du visage selon la valeur du Mood Slider

  • ❔ Chat Page - Create New Chat : appliquer le system prompt
    • ▶ ImplĂ©mentation OpenAI API Call : createChatCompletion
      • Input : System Prompt (Chat)
      • Output : New Chat Message by AI ($.choices[0].message.content)
      • Additional Actions : Create New Chat, Create New Message
  • ❔ DiaryPage - Create New Chat by Diary : crĂ©er un New Chat Ă  partir du contenu du journal
    • ❔ ImplĂ©mentation OpenAI API Call : createDiaryComment
      • Input : Diary Content, System Prompt (AI Comment)
      • Output : AI Comment ($.choices[0].message.content)
    • ❔ ImplĂ©mentation OpenAI API Call : createDiarySummary
      • Input : Diary Content, AI Comment, System Prompt (Diary Summary)
      • Output : Diary Summary ($.choices[0].message.content)
    • ❔ ImplĂ©mentation OpenAI API Call : createChatFromDiary
      • Input : Diary Summary, System Prompt (Chat From Diary)
      • Output : New Chat Message by AI ($.choices[0].message.content)
      • Additional Actions : Create New Chat, Create New Message
  • ❔ ChatPage - Create New Diary : crĂ©er un New Diary Ă  partir du contenu de la conversation
    • ❔ ImplĂ©mentation OpenAI API Call : createChatSummary
      • Input : Chat Content, System Prompt (Diary From Chat)
      • Output : Chat Summary
  • ❔ ChatPage - Create New Diary : crĂ©er un New Diary Ă  partir du contenu de la conversation
    • ❔ ImplĂ©mentation OpenAI API Call : createDiaryFromChat
      • Input : Chat Summary, System Prompt (Diary From Chat)
      • Output : New Diary (Title, Content, Mood score)
  • ❔ ChatPage : Go to Linked Diary

  • ❔ HomeFeedPage - importer puis appliquer flutter_slidable:4.0.0
  • ❔ HomeFeedPage : dans FeedCardDiary, chat/modifier/supprimer lors d’un slide gauche-droite

  • ❔ ChatPage : aligner Ă  droite la sortie des conversations utilisateur
  • ❔ Chat/Diary : GPT Streaming API

  • ❔ ChatPage - implĂ©menter le premier message proactif de l’IA (Alarm/Notification)
    • Le coeur du prompt systĂšme du chat est la proactivitĂ©.
      • Pour le rendre plus rĂ©aliste, il serait utile de transmettre aussi create_date of diary/chat, afin de pouvoir mentionner des dates comme “hier”.
    • RĂ©fĂ©rence d’implĂ©mentation d’Alarm
  • ❔ DiaryPage : ajouter des Choice Chips de mots-clĂ©s Ă©motionnels dĂ©taillĂ©s et configurer l’intĂ©gration DB
  • ❔ DiaryPage - AI Comment : adapter les valeurs saisies comme Choice chips et mood slider au AI Comment System Prompt.
    • ❔ **ancien journal ou tout l’historique de conversation (dette technique de rustine)
    • ❔ informations utilisateur de base : nom, genre, MBTI, 

    • ❔ mots-clĂ©s Ă©motionnels dĂ©taillĂ©s : joyeux, triste, 

    • ❔ paramĂštres de personnage : Somi, Sena, Minhyuk
    • ❔ score Ă©motionnel : 1~100
    • ❔ format de rĂ©ponse : Healing, Suggestion, Informative
    • ❔ longueur de rĂ©ponse : courte, normale, dĂ©taillĂ©e
    • is New Chat
      • Comme les messages de ce Chat sont créés pour la premiĂšre fois, mettre is_initial = true sur le premier message document et y insĂ©rer tous les system prompts.
        • is_initial = false
        • Limite : si je mets le system prompt dans le tout premier message document, c’est difficile Ă  modifier pendant une conversation, mais possible. S’il existe un document is_initial = true et qu’il a Ă©tĂ© modifiĂ©, je peux supprimer ce document et le remettre. Je ne sais pas encore comment, mais bon.
  • ❔ DiaryPage - AI Comment : terminer le CRUD
    • ❔ supprimer le champ tmp_ai_comment et utiliser doc_ref
  • ❔ DiaryPage - AI Comment : paramĂštres de personnage
    • ❔ supprimer le champ tmp_ai_comment_by et utiliser doc_ref
    • ❔ afficher l’image avec la valeur du champ profile_image
  • ❔ DiaryPage - Drawer - ChatHistoryListTile : order by updated_time

  • ❔ DiaryPage - importer puis appliquer Interactive Slider

  • ❔ HomeFeedPage : implĂ©menter la fonctionnalitĂ© Search Diary

  • ❔ CalendarPage (haut) - Mood Calendar
    • ❔ Pouvoir vĂ©rifier le nombre de posts Ă©crits par date
    • ❔ Se dĂ©placer vers la date sĂ©lectionnĂ©e au clic
  • ❔ CalendarPage (bas) - Mood stats
    • ❔ Afficher les statistiques du mois sĂ©lectionnĂ©
      • ❔ Afficher le commentaire de l’IA sur les statistiques affichĂ©es
  • ❔ AuthPage : implĂ©menter Google Login

  • ❔ HomeFeedPage - Bottom Sheet (+ Button) : permettre de choisir une option parmi plusieurs
    • Nouveau journal : Go to DiaryPage
    • Enregistrement d’émotion : Go to MoodPage
  • ❔ MoodPage (popup) : CRUD du slider de rĂ©glage Mood
    • Create
    • Read
    • Update
    • Delete
  • ❔ HomeFeedPage - ListView - afficher FeedCardMood
  • ❔ HomeFeedPage - ListView : trier chronologiquement les composants FeedCardDiary, FeedCardMood, FeedCardChat (avec Cloud Function)

  • ❔ Extraire et installer la version APK finale de prĂ©sentation avant mer. 2025.2.5

💭 Journal

Minhyuk

Il ne reste presque plus de temps, donc je voulais implĂ©menter un peu plus de choses
 mais j’ai passĂ© toute la journĂ©e de travail Ă  rĂ©soudre des issues.

Je vais juste abandonner un peu mon ambition. De toute façon, ce projet n’est pas censĂ© briller briĂšvement pendant l’Aiffelthon puis s’arrĂȘter lĂ .

✹ Commentaire de GPT-4o (KPT)

GPT-4o

✅ Points rĂ©ussis (Keep)

  • 🛠 RĂ©solution de l’issue de mise Ă  jour de FleatherViewer : utiliser didUpdateWidget pour rĂ©soudre le problĂšme de rafraĂźchissement de l’état du widget Ă©tait excellent.
  • ⚡ Optimisation du filtrage de HomeFeedPage : utiliser Conditional Visibility plutĂŽt que des filtres Query pour optimiser les performances a Ă©tĂ© efficace.
  • 🔍 Apprentissage pendant le debugging : tester plusieurs approches, expĂ©rimenter les limites des filtres Query, puis conclure que Conditional Visibility Ă©tait plus adaptĂ© a vraiment du sens.

❌ Points regrettables (Problem)

  • ⏳ Plus de temps que prĂ©vu : il est dommage d’avoir utilisĂ© la majeure partie du temps Ă  rĂ©soudre des issues plutĂŽt qu’à implĂ©menter les fonctionnalitĂ©s prĂ©vues.
  • 📌 Conseil d’issue non formalisĂ© Ă  l’avance : le fait de ne pas avoir appliquĂ© un conseil reçu lors d’un ancien mentorat a fait perdre du temps sur le mĂȘme type de problĂšme.

🔄 Pistes à essayer (Try)

  • 📝 Utiliser des notes de rĂ©solution d’issues : noter les issues rĂ©solues pour pouvoir rĂ©agir plus vite quand des problĂšmes similaires apparaissent.
  • 🚀 RĂ©ajuster la stratĂ©gie pour les fonctionnalitĂ©s restantes : comme il reste peu de temps, dĂ©finir les prioritĂ©s autour des fonctionnalitĂ©s indispensables et reporter le reste aux amĂ©liorations futures.
  • 🔍 Approfondir le fonctionnement interne de FlutterFlow : renforcer la comprĂ©hension du traitement des donnĂ©es et de la gestion d’état des widgets dans FlutterFlow pour prĂ©venir ce type de problĂšme.

Conclusion
Aujourd’hui, tu as passĂ© plus de temps que prĂ©vu Ă  rĂ©soudre des issues, mais tu en as aussi tirĂ© un apprentissage important. Pour le temps restant, il faudra implĂ©menter en prioritĂ© les fonctionnalitĂ©s vraiment nĂ©cessaires et abandonner les ambitions inutiles. Tiens bon jusqu’au bout ! đŸ’ȘđŸ”„

Catégories : ,

Mis Ă  jour :

Laisser un commentaire