diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index 9b80e2b..d9a59a5 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -7,12 +7,14 @@ import 'package:dreampad/app/models/models.dart'; import 'package:dreampad/app/routes/app_pages.dart'; import 'package:flustars_flutter3/flustars_flutter3.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:dreampad/app/shared/shared.dart'; import '../models/chat_msg_model.dart'; import '../models/explore_app_model.dart'; +import '../models/knowledge_point_dialogue_model.dart'; import '../models/knowledge_point_model.dart'; import '../providers/home_provider.dart'; import '../widgets/first_time_dialog.dart'; @@ -27,12 +29,14 @@ class HomeController extends GetxController { final create = true.obs; final prompt = false.obs; final exploreCount = 0.obs; + final exploreDay = 1.obs; final chatMsgList = RxList([]); - final scrollController = ScrollController(); final selectKnowledge = Rx(null); final knowledgePoints = RxList>([]); + final knowledgePointDialogues = RxList([]); + final chatInputMsg = ''.obs; - late String account = ''; + late String account = '琉璃'; late int gender = 1; late int age = 10; @@ -42,18 +46,20 @@ class HomeController extends GetxController { late List leftExploreApps = []; late List rightExploreApps = []; late List goals = []; + late int sendCount = 0; final int second = 3; StreamSubscription? subscription; - + final scrollController = ScrollController(); + late TextEditingController textController = TextEditingController(); @override void onInit() { super.onInit(); - account = SpUtil.getString(Constant.account).nullSafe; + // account = SpUtil.getString(Constant.account).nullSafe; gender = SpUtil.getInt(Constant.gender, defValue: 1)!; age = SpUtil.getInt(Constant.age, defValue: 10)!; - occupationName = SpUtil.getString(Constant.occupationName).nullSafe; - occupationId = SpUtil.getInt(Constant.occupationId, defValue: 2)!; - // create.value = SpUtil.getBool(Constant.create, defValue: true)!; + // occupationName = SpUtil.getString(Constant.occupationName).nullSafe; + // occupationId = SpUtil.getInt(Constant.occupationId, defValue: 2)!; + create.value = SpUtil.getBool(Constant.create, defValue: true)!; initLeftExploreApps(); initRightExploreApps(); initArtistGoals(); @@ -87,28 +93,274 @@ class HomeController extends GetxController { @override void onClose() { super.onClose(); + textController.dispose(); subscription?.cancel(); } void initKnowledgePoints() { knowledgePoints.add(KnowledgePoint( - id: 1, left: 559.0, top: 149.0, title: '钱是怎么形成的?', leared: false) + id: 1, left: 559.0, top: 149.0, title: '太阳系中的行星', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 1, + id: 0, + isGpt: true, + text: '''太阳系是一个神奇的地方,它由太阳和围绕它运行的各种天体组成,包括我们的地球🌍! +你知道太阳系里有多少个行星吗?答案是八个🪐! +让我们来一起深入了解太阳系中的每一个行星。🌌 +太阳系的行星概览 + 1.水星 (Mercury) + • 太阳系中最靠近太阳的行星。 + • 表面温差极大,白天极热,夜晚极冷。 + • 没有真正的大气层。 + 2.金星 (Venus) + • 类似于地球的大小和结构,有时被称为地球的“姊妹行星”。 + • 表面被浓密的二氧化碳大气层覆盖,有着极端的温室效应。 + • 表面温度极高,足以融化铅。 + 3.地球 (Earth) + • 太阳系中唯一已知有生命存在的行星。 + • 有丰富的水资源和多样的生态系统。 + 4.火星 (Mars) + • 常被称为“红色星球”,因其表面的氧化铁而呈红色。 + • 曾经可能有液态水存在,是潜在的生命存在地。 + 5.木星 (Jupiter) + • 太阳系中最大的行星。 + • 以其显著的红斑(一个巨大的风暴)而闻名。 + 6.土星 (Saturn) + • 以其壮观的环系统而著称。 + • 主要由氢和氦组成,密度非常低,甚至可以在水上漂浮。 + 7.天王星 (Uranus) + • 以其独特的蓝绿色大气而闻名。 + • 其轴极度倾斜,几乎与轨道平面垂直。 + 8.海王星 (Neptune) + • 类似于天王星,但更远且更冷。 + • 以强烈的风暴和极高的风速而闻名。 +每个行星都有其独特的特点和奥秘,从火星可能存在的生命迹象到土星美丽的环带,太阳系充满了令人惊叹的现象和未解之谜。🚀''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 1, id: 1, isGpt: false, text: '太阳系的行星有什么有趣的知识?')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 1, + id: 1, + isGpt: true, + text: '''太阳系的行星充满了许多有趣的知识和神秘的现象。让我们来探索一些关于这些行星的迷人事实吧!🌌 + +1. 金星是太阳系中唯一一个逆时针自转的行星,这意味着从金星表面看太阳会从西边升起,从东边落下。 +2. 火星表面有河道和湖泊的迹象,暗示它曾经有液态水流动。 +3. 土星的密度低到如果放在一大盆水里,它可以漂浮。 + +每个行星都有其独特的特性和神秘,这些只是冰山一角。太阳系的探索永远充满惊喜和新发现。 +如果你对某个特定行星或现象感兴趣,可以告诉我,我们可以更深入地探讨。''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 1, id: 2, isGpt: false, text: '有哪些知识是我能用在生活中的?')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 1, + id: 2, + isGpt: true, + text: '''了解太阳系和宇宙可以帮助你在日常生活中观察和理解许多现象。这里有一些知识点,不仅有趣,而且可以应用到你的日常生活中: + 1.日夜更替: + • 理解地球围绕自己的轴旋转导致的日夜更替。当你的一侧面向太阳时,是白天;当转到背对太阳时,是夜晚。 + 2.季节变化: + • 地球倾斜的轴使得一年中不同时间接受到太阳光的角度和时间长度不同,导致季节的变化。这解释了为什么有时天气炎热,有时又寒冷。 + 3.星座和夜空: + • 学习夜空中的星座,可以让你在晚上观星时识别它们。例如,你可以找到北斗七星或猎户座。 + 4.月亮的相位: + • 观察月亮如何在一个月内从新月变为满月再回到新月。这些变化是由月亮围绕地球旋转,我们从地球上看到的月亮被太阳照亮的部分发生变化造成的。''')); knowledgePoints.add(KnowledgePoint( - id: 2, right: 751.0, top: 198.0, title: '小实验溶解糖', leared: false) + id: 2, right: 751.0, top: 198.0, title: '中国历史:炎帝和皇帝', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 2, id: 0, isGpt: true, text: '''让我们来了解一下炎帝和黄帝,这两位是中国历史上非常重要的传说人物。 +炎帝 +• 称号:炎帝也被称为神农氏,是中国古代的部落首领之一。 +• 贡献:炎帝被誉为农业和中药的始祖。据说他教会了人们耕种和使用草药来治病。 +• 传说:有许多关于炎帝的传说,其中一个著名的是他尝百草,发现了许多药用植物的功效。 +黄帝 +• 称号:黄帝的名字是轩辕氏,他是中国最古老的传说帝王之一。 +• 贡献:黄帝被认为是中华民族的始祖,对中国古代社会的发展和文化有重大影响。 +• 传说:关于黄帝有许多故事,包括他与蚩尤的战争,这场战争象征着文明对野蛮的胜利。 +炎帝和黄帝的意义 +• 这两位帝王在中国文化中非常重要,他们不仅是历史人物,也是文化和民族认同的象征。 +• 关于他们的故事和传说反映了古代中国人对理想领袖的看法以及对世界的理解。''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 2, id: 1, isGpt: false, text: '为什么这两个人总是被一起提到?他们之间发生过什么故事呢?')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 2, + id: 1, + isGpt: true, + text: + '''炎帝和黄帝之所以常常被一起提到,主要是因为他们在中国古代历史和神话中都占有非常重要的地位。他们被认为是华夏民族(古代汉族的前身)的共同祖先,象征着中国文明的起源。以下是一些关于他们的故事和为什么他们总是一起被提及的原因: +共同的文化意义 +• 炎帝和黄帝代表了古代中国文明的两个重要方面:农业(炎帝)和战争及治国策略(黄帝)。 +• 他们被视为中华民族的文化英雄,象征着中国民族的诞生和发展。中国人经常自称为“炎黄子孙”,这一称谓就来源于炎帝和黄帝。这个称号表明了他们对中国民族认同的重要性。 +传说中的战争 +• 关于炎帝和黄帝之间的故事,最著名的可能是他们的战争。根据传说,炎帝和黄帝为了争夺天下而进行了一场大战。 +• 这场战争最终以黄帝的胜利结束,标志着中国历史上一个新时代的开始。黄帝的胜利象征着中央集权和文明秩序的确立。 +历史与神话的结合 +• 炎帝和黄帝的故事是历史与神话的结合,虽然没有确凿的历史记录证明他们的真实存在,但他们的故事在中国文化和历史中占有极其重要的地位。 +• 他们的故事被传颂千百年,成为了中国历史和文化的一部分。 +''')); knowledgePoints.add(KnowledgePoint( - id: 3, left: 632.0, top: 278.0, title: '科学家是怎么工作的?', leared: false) + id: 3, left: 632.0, top: 278.0, title: '水的固态-冰', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 3, + id: 0, + isGpt: true, + text: '''冰是水在低温下的固态形式。当水的温度降到0°C(32°F)以下时,它就会开始结冰。❄️ +冰的形成 +• 冰是怎么形成的呢?当水冷却到冰点以下时,水分子的运动速度变慢,使它们紧密地排列起来,形成固态的冰。 +• 你可能已经在冬天看到过户外的水塘结冰,或者在冰箱里制作过冰块。这些都是水变成冰的例子。 +冰的特性 +• 冰比液态水轻,这就是为什么冰能在水上漂浮的原因。这个特性对于生活在冰下的水生生物非常重要,因为它们需要水下的氧气和食物。 +小实验 +让我们来做一个简单的实验吧!把一杯水放在冰箱的冷冻室里,几个小时后看看发生了什么。你会发现水变成了冰!🧊 + +这些基本知识可以帮助你理解冰在我们的日常生活和自然界中的作用。如果你有任何问题,或者想了解更多关于水的液态或气态,请随时问我。''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 3, id: 1, isGpt: false, text: '有什么有趣的知识?')); + knowledgePointDialogues + .add(KnowledgePointDialogue(kpId: 3, id: 1, isGpt: true, text: '''冰比水轻: +当水结冰时,它的体积增大,密度减小,这就是为什么冰能在水上漂浮。这个特性对于自然界非常重要,比如在冰封的湖面下,水生生物仍然可以生存。 +''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 3, id: 2, isGpt: false, text: '有哪些知识是我能用在生活中的?')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 3, + id: 2, + isGpt: true, + text: '''关于水的三态变化有许多实用的知识可以应用在日常生活中。让我们一起来看看: +1.保温和保冷: +• 了解水的不同状态可以帮助你理解为什么保温瓶可以保持热水的温度,或者为什么冰箱能保持食物冷却。水在变成蒸汽或冰时需要吸收或释放能量,这就是为什么冰可以保持东西冷却,热水可以保持温暖。 +2.烹饪时的水状态变化: +• 在烹饪时,理解水的沸腾和蒸发对于掌握正确的烹饪时间非常重要。比如说,当水沸腾时,温度是100°C,这是煮熟食物的理想温度。 +3.天气和气候: +• 通过观察水的蒸发和凝结,你可以更好地理解天气变化,例如云是如何形成的,或者雨是怎么来的。 +4.节约水资源: +• 了解水的重要性和它在自然界中的循环可以帮助你意识到节约用水的重要性,比如在刷牙或洗澡时尽量节约水。 +5.冰的安全应用: +• 在热天时,使用冰块来制冷可以帮助你保持凉爽。同时,了解冰在低温下的形成可以让你在冬天时注意到户外的冰,避免滑倒。 +6.植物的浇水: +• 理解土壤中水分的蒸发可以帮助你更好地管理植物的浇水,确保植物得到足够的水分但又不过量。 +通过学习这些知识,你不仅能够更好地理解自然界的奇妙,还能在生活中运用这些知识,更加科学地生活。''')); knowledgePoints.add(KnowledgePoint( - id: 4, left: 814.0, top: 376.0, title: '艺术家——梵高', leared: false) + id: 4, left: 814.0, top: 376.0, title: '科学是什么?', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 4, + id: 0, + isGpt: true, + text: '''科学是一种了解我们周围世界的方式,它通过观察、实验和逻辑推理来探索自然界的奥秘。🔬 +科学的重要性 + • 科学帮助我们理解日常生活中的现象,比如为什么天空是蓝色的,或者为什么水会沸腾。 + • 科学还可以帮助我们解决问题和发明新技术,改善我们的生活。 +科学的方法 + • 科学方法包括提出问题、做假设、进行实验和得出结论。这是科学家用来确保他们的发现是准确的方法。 +通过这些基本知识,你可以开始理解科学是如何工作的,以及它是如何成为我们理解世界的一个重要工具。''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 4, id: 1, isGpt: false, text: '科学跟其他学科有什么区别呢?')); + knowledgePointDialogues.add( + KnowledgePointDialogue(kpId: 4, id: 1, isGpt: true, text: '''1. 做实验: + • 科学:就像在科学课上做实验一样,科学家通过做实验来了解事物是如何工作的。 + • 其他学科:比如在美术课上,你可能会画画或制作艺术品,这更多的是关于创造和表达,而不是做实验。 +2. 探索自然: + • 科学:科学是关于探索自然世界的,比如为什么天空是蓝的,或者植物是如何生长的。 + • 其他学科:例如,在历史课上,你会学习过去发生的事情,比如古代文明或重要事件。 +3. 找答案: + • 科学:当科学家想知道答案时,他们会做很多实验来找答案。 + • 其他学科:在其他学科,比如文学,你可能会阅读故事或诗歌,并谈论这些故事或诗歌的意义。 +4. 证明理论: + • 科学:在科学中,如果你有一个想法,你需要通过实验来证明它是对的。 + • 其他学科:在如音乐或艺术等学科中,没有“对或错”的实验,更多的是根据你的感觉和创意来创作。 +5. 解释事物: + • 科学:科学帮助我们理解事物是如何工作的,比如电是如何亮起灯泡的。 + • 其他学科:其他学科,比如语文,帮助我们学习语言,讲故事,和表达我们的想法。 + ''')); knowledgePoints.add(KnowledgePoint( - id: 5, right: 696.0, top: 438.0, title: '什么是科学?', leared: false) + id: 5, right: 696.0, top: 438.0, title: '《星夜》-梵高', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 5, + id: 0, + isGpt: true, + text: '''让我们开始关于梵高的《星夜》这一主题的学习之旅吧。这幅画不仅是梵高最著名的作品之一,也是世界上最受欢迎和认可的艺术作品之一。 +了解《星夜》 +• 背景介绍:首先,我们会了解《星夜》的背景信息。这幅画是在1889年梵高住在法国圣雷米的精神病院时创作的。 +• 画作特点:《星夜》以其充满活力的星空和旋转的云彩而闻名。梵高使用了大胆的颜色和笔触来创造出动态的天空效果。 +色彩的使用 +• 对比鲜明的颜色:在《星夜》中,梵高使用了鲜明对比的颜色来营造画面上的强烈视觉效果。例如,他使用了深蓝和光亮的黄色来描绘夜空和星星。 +• 情感表达:颜色的选择和组合不仅仅是视觉上的,它们还用来表达情感。深蓝色传达了夜晚的宁静和深邃,而明亮的黄色则代表着希望和光明。 +笔触的技法 +• 浓重和动感的笔触:梵高在《星夜》中使用了浓重且充满动感的笔触。他的笔触既粗犷又流畅,给人一种躁动和能量感。 +• 创造纹理和层次:通过这种笔触,梵高在画布上创造了丰富的纹理和层次感。比如,天空中旋转的云彩和闪烁的星星就是通过这种技法生动表现出来的。 + +小问题:你认为整幅画作表达出了梵高的什么样的情感呢?''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 5, + id: 1, + isGpt: false, + text: '这幅画表达了一种梦幻的、充满活力的情感。画里的旋转星空让我感到一种强烈的生命力。')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 5, + id: 1, + isGpt: true, + text: '''你对梵高的《星夜》的感受非常深刻。这幅画确实是以其独特的方式捕捉和表达了一种梦幻般、充满活力的情感。 +生命力和运动感 +• 旋转的星空:画中的旋转星空是非常引人注目的。梵高使用螺旋形和波浪形的笔触来描绘星空和云彩,这些元素给人一种动态和流动的感觉,仿佛星空本身是活的。 +• 颜色的活力:明亮的黄色星星在深蓝色的天空中跳跃,这种鲜明的色彩对比增强了画面的生命力和活力。 +情感的表达 +• 梵高的内心世界:许多人认为《星夜》反映了梵高当时复杂的情感状态,包括他对无限宇宙的敬畏、对自然之美的热爱,以及一种深刻的孤独感。 +• 梦幻与现实的交融:画中梦幻的天空与安静的村庄形成了对比,这可能代表了梵高对理想与现实之间的思考。 +艺术的影响 +• 对后世的启发:《星夜》不仅是梵高最著名的作品之一,也对后世艺术家和观众产生了深远的影响。它的独特风格和深刻情感激发了人们对艺术的无限想象。 + +《星夜》作为一幅艺术作品,以其独特的视觉语言和深刻的情感表达,给每个观看者带来不同的感受和启发。这正是它成为永恒经典的原因之一。''')); knowledgePoints.add(KnowledgePoint( - id: 6, left: 741.0, top: 499.0, title: '足球比赛规则', leared: false) + id: 6, left: 741.0, top: 499.0, title: '《小王子》-第一章', leared: false) .obs); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 6, + id: 0, + isGpt: true, + text: + '''《小王子》是一本由法国作家安托万·德·圣-埃克苏佩里创作的著名小说,它包含了许多深刻的生活哲理和寓意。让我们一起阅读《小王子》的第1章吧! +在《小王子》的第1章中,作者安托万·德·圣-埃克苏佩里讲述了他小时候对画画的热爱,以及他如何因大人们的不理解而放弃了这个爱好。他画了一条蟒蛇吞象的画,但大人们却认为那是一顶帽子。这段故事展示了大人世界与孩子世界之间的隔阂和误解。 + +小问题:你觉得哪些句子是写的特别好的?为什么?''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 6, id: 1, isGpt: false, text: '''1. 于是我的思维飞到从林里去探险,最后用彩色蜡笔画出了处女作。 +2. 我想知道是否有人能真正地理解这幅画。但答案总是:“这是帽子呀。”如果对方这么回答,那我不会再提起大蟒蛇、原始森林和星星。我会迁就他的水平我会跟他谈论桥牌、高尔夫、政治或者领带。 + +这两句话看出了我丰富的想象力,和其他人的对比。''')); + knowledgePointDialogues.add(KnowledgePointDialogue( + kpId: 6, + id: 1, + isGpt: true, + text: + '''选择的这两句话非常有意义,它们揭示了《小王子》中一个核心主题:成人世界与儿童世界的理解和想象力的差异。这里是这两句话的英文版本以及一些关键词汇: + +1. I pondered deeply, then, over the adventures of the jungle. And after some work with a colored pencil I succeeded in making my first drawing. +关键词汇: +• Pondered - 深思熟虑 +• Adventures - 冒险 +• Jungle - 丛林 +• Colored pencil - 彩色铅笔 +• Succeeded - 成功 +• Drawing - 画画 + +2. I would try to find out, so, if this was a person of true understanding. But, whoever it was, he, or she, would always say, "That is a hat." Then I would never talk to that person about boa constrictors, or primeval forests, or stars. I would bring myself down to his level. L would talk to him about bridge, and golf, and politics, and neckties. +关键词汇: +• Understanding - 理解 +• Person - 人 +• True - 真实的 +• Whoever - 无论谁 +• Hat - 帽子 +• Boa constrictors - 蟒蛇 +• Primeval - 原始的 +• Forests - 森林 +• Level - 水平 +• Golf - 高尔夫 +• Politics - 政治 +• Neckties - 领带''')); } void initArtistGoals() { @@ -228,36 +480,25 @@ class HomeController extends GetxController { } Future leareKnowledge(KnowledgePoint knowledge) async { + textController = TextEditingController(); + sendCount = 0; selectKnowledge.value = knowledge; chatMsgList.clear(); - if (knowledge.title!.contains('科学')) { - var chatMsg = ChatMsg( - id: Guid.newGuid.toString(), - text: '''科学是一种了解我们周围世界的方式,它通过观察、实验和逻辑推理来探索自然界的奥秘。🔬 - 科学的重要性 - • 科学帮助我们理解日常生活中的现象,比如为什么天空是蓝色的,或者为什么水会沸腾。 - • 科学还可以帮助我们解决问题和发明新技术,改善我们的生活。 - 科学的方法 - • 科学方法包括提出问题、做假设、进行实验和得出结论。这是科学家用来确保他们的发现是准确的方法。 - 通过这些基本知识,你可以开始理解科学是如何工作的,以及它是如何成为我们理解世界的一个重要工具。 - ''', - isBot: 1, - knowledgeId: selectKnowledge.value!.id, - ); - SchedulerBinding.instance.addPostFrameCallback((timeStamp) { - Future.delayed(const Duration(milliseconds: 300)); - scrollController.jumpTo(scrollController.position.maxScrollExtent); - }); - chatMsgList.add(chatMsg); - } else { - chatMsgList.add(ChatMsg( - id: Guid.newGuid.toString(), - knowledgeId: knowledge.id, - isBot: 1, - text: '探梦者,关于“${knowledge.title}”这个话题,你有什么想法或者疑问? 我们起交流吧!', - )); - } + var knowledgePointDialogue = knowledgePointDialogues.firstWhere((t) => + t!.kpId == selectKnowledge.value!.id && t.id == sendCount && t.isGpt!); + var chatMsg = ChatMsg( + id: Guid.newGuid.toString(), + text: knowledgePointDialogue!.text, + isBot: 1, + knowledgeId: selectKnowledge.value!.id, + ); + chatMsgList.add(chatMsg); + + sendCount++; + knowledgePointDialogue = knowledgePointDialogues.firstWhere((t) => + t!.kpId == selectKnowledge.value!.id && t.id == sendCount && !t.isGpt!); + chatInputMsg.value = knowledgePointDialogue!.text!; await Get.toNamed(Routes.HOME + Routes.EXPLORE_STUDY); } @@ -270,31 +511,19 @@ class HomeController extends GetxController { ); chatMsgList.add(chatMsg); - if (selectKnowledge.value?.title?.contains('科学') ?? false) { - chatMsg = ChatMsg( - id: Guid.newGuid.toString(), - text: '''1. 做实验: -• 科学:就像在科学课上做实验一样,科学家通过做实验来了解事物是如何工作的。 -• 其他学科:比如在美术课上,你可能会画画或制作艺术品,这更多的是关于创造和表达,而不是做实验。 -2. 探索自然: -• 科学:科学是关于探索自然世界的,比如为什么天空是蓝的,或者植物是如何生长的。 -• 其他学科:例如,在历史课上,你会学习过去发生的事情,比如古代文明或重要事件。 -3. 找答案: -• 科学:当科学家想知道答案时,他们会做很多实验来找答案。 -• 其他学科:在其他学科,比如文学,你可能会阅读故事或诗歌,并谈论这些故事或诗歌的意义。 -4. 证明理论: -• 科学:在科学中,如果你有一个想法,你需要通过实验来证明它是对的。 -• 其他学科:在如音乐或艺术等学科中,没有“对或错”的实验,更多的是根据你的感觉和创意来创作。 -5. 解释事物: -• 科学:科学帮助我们理解事物是如何工作的,比如电是如何亮起灯泡的。 -• 其他学科:其他学科,比如语文,帮助我们学习语言,讲故事,和表达我们的想法。 -''', - isBot: 0, - knowledgeId: selectKnowledge.value!.id, - ); - chatMsgList.add(chatMsg); + SchedulerBinding.instance.addPostFrameCallback((timeStamp) { + Future.delayed(const Duration(milliseconds: 1000)); + }); + var knowledgePointDialogue = knowledgePointDialogues.firstWhere((t) => + t!.kpId == selectKnowledge.value!.id && t.id == sendCount && t.isGpt!); + chatMsg = ChatMsg( + id: Guid.newGuid.toString(), + text: knowledgePointDialogue!.text, + isBot: 1, + knowledgeId: selectKnowledge.value!.id, + ); + chatMsgList.add(chatMsg); - } SchedulerBinding.instance.addPostFrameCallback((timeStamp) { Future.delayed(const Duration(milliseconds: 300)); scrollController.jumpTo(scrollController.position.maxScrollExtent); @@ -312,5 +541,16 @@ class HomeController extends GetxController { if (exploreCount.value >= 2) { explored.value = true; } + sendCount++; + knowledgePointDialogue = knowledgePointDialogues.firstWhere( + (t) => + t!.kpId == selectKnowledge.value!.id && + t.id == sendCount && + !t.isGpt!, + orElse: () => null, + ); + if (knowledgePointDialogue != null) { + chatInputMsg.value = knowledgePointDialogue.text!; + } } } diff --git a/lib/app/modules/home/models/knowledge_point_dialogue_model.dart b/lib/app/modules/home/models/knowledge_point_dialogue_model.dart new file mode 100644 index 0000000..70938db --- /dev/null +++ b/lib/app/modules/home/models/knowledge_point_dialogue_model.dart @@ -0,0 +1,13 @@ +class KnowledgePointDialogue { + int? kpId; + int? id; + bool? isGpt; + String? text; + + KnowledgePointDialogue({ + this.kpId, + this.id, + this.isGpt, + this.text, + }); +} diff --git a/lib/app/modules/home/views/explore_study_view.dart b/lib/app/modules/home/views/explore_study_view.dart index ce516dd..5dc18fd 100644 --- a/lib/app/modules/home/views/explore_study_view.dart +++ b/lib/app/modules/home/views/explore_study_view.dart @@ -32,32 +32,32 @@ class ExploreStudyView extends GetView { } Widget buildBody(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - const RSizedBox(height: 22.0), - Container( - height: 78.h, - padding: REdgeInsets.symmetric(horizontal: 20.0, vertical: 12.0), - child: Stack( - children: [ - MyBackButton( - onPressed: () { - Get.back(); - }, - ), - Center( - child: Text( - controller.selectKnowledge.value!.title!, - style: TextStyles.boldWhiteShadow34_200, + return Obx( + () => Column( + mainAxisSize: MainAxisSize.max, + children: [ + const RSizedBox(height: 22.0), + Container( + height: 78.h, + padding: REdgeInsets.symmetric(horizontal: 20.0, vertical: 12.0), + child: Stack( + children: [ + MyBackButton( + onPressed: () { + Get.back(); + }, ), - ) - ], + Center( + child: Text( + controller.selectKnowledge.value!.title!, + style: TextStyles.boldWhiteShadow34_200, + ), + ) + ], + ), ), - ), - const RSizedBox(height: 10.0), - Obx( - () => Row( + const RSizedBox(height: 10.0), + Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( @@ -90,41 +90,37 @@ class ExploreStudyView extends GetView { ) ], ), - ), - Flexible( - fit: FlexFit.tight, - child: Container( - padding: REdgeInsets.only( - left: 45.0, - top: 10.0, - right: 45.0, + Flexible( + fit: FlexFit.tight, + child: Container( + padding: REdgeInsets.only( + left: 45.0, + top: 10.0, + right: 45.0, + ), + child: buildMsgList(context), ), - child: buildMsgList(context), ), - ), - HookBuilder( - builder: (context) { - final textController = useTextEditingController(); + HookBuilder(builder: (context) { useMemoized(() async { - if (controller.selectKnowledge.value?.title?.contains('科学') ?? false) { - const guide = '科学跟其他学科有什么区别呢'; - for (int i = 0; i < guide.length + 1; i++) { - textController.text = guide.substring(0, i); - await Future.delayed(const Duration(milliseconds: 80)); - } + for (int i = 0; + i < controller.chatInputMsg.value.length + 1; + i++) { + controller.textController.text = + controller.chatInputMsg.value.substring(0, i); + await Future.delayed(const Duration(milliseconds: 80)); } - SchedulerBinding.instance.addPostFrameCallback((timeStamp) { - }); + SchedulerBinding.instance.addPostFrameCallback((timeStamp) {}); }); return ChatInputWidget( - controller: textController, + controller: controller.textController, onPressed: (txt) { controller.addSendMsg(txt); }, ); - } - ), - ], + }), + ], + ), ); } diff --git a/lib/app/modules/home/views/explore_view.dart b/lib/app/modules/home/views/explore_view.dart index d11e1f1..493a4b7 100644 --- a/lib/app/modules/home/views/explore_view.dart +++ b/lib/app/modules/home/views/explore_view.dart @@ -148,7 +148,7 @@ class ExploreView extends GetView { ), child: Center( child: Text( - '第一天', + '第${Utils.getDayString(controller.exploreDay.value)}天', style: TextStyles.mediumWhite18, ), ), diff --git a/lib/app/modules/home/views/home_view.dart b/lib/app/modules/home/views/home_view.dart index ffbc157..5435e0a 100644 --- a/lib/app/modules/home/views/home_view.dart +++ b/lib/app/modules/home/views/home_view.dart @@ -11,6 +11,7 @@ import '../controllers/home_controller.dart'; import '../models/explore_app_model.dart'; import '../widgets/explore_widget.dart'; import '../widgets/goal_dialog.dart'; +import '../widgets/lantern_widget.dart'; import '../widgets/user_widget.dart'; class HomeView extends GetView { @@ -507,6 +508,11 @@ class HomeView extends GetView { ) : Container(), controller.explored2.value >= 1 ? firstLeafWidget() : Container(), + LanternWidget( + brightCount: controller.exploreCount.value >= 2 + ? controller.exploreDay.value + : controller.exploreDay.value - 1, + ), Positioned( left: 168.w, top: 244.h, @@ -662,10 +668,7 @@ class _ShowUp extends HookWidget { controller.forward(); }); return FadeTransition( - opacity: CurvedAnimation( - curve: Curves.easeIn, - parent: controller - ), + opacity: CurvedAnimation(curve: Curves.easeIn, parent: controller), child: child, ); } diff --git a/lib/app/modules/home/widgets/chat_input_widget.dart b/lib/app/modules/home/widgets/chat_input_widget.dart index e7a12c3..7512128 100644 --- a/lib/app/modules/home/widgets/chat_input_widget.dart +++ b/lib/app/modules/home/widgets/chat_input_widget.dart @@ -27,7 +27,7 @@ class _ChatInputWidgetState extends State { void verify() { final String input = _controller.text; bool clickabled = true; - if (input.isEmpty || input.length < 5 || input.length > 120) { + if (input.isEmpty || input.length < 5) { clickabled = false; } setState(() { @@ -86,6 +86,7 @@ class _ChatInputWidgetState extends State { focusNode: _focus, style: TextStyles.mediumGray3315, maxLength: 120, + maxLines: null, maxLengthEnforcement: MaxLengthEnforcement.enforced, decoration: InputDecoration( hintText: '请输入你想说的内容', diff --git a/lib/app/modules/home/widgets/lantern_widget.dart b/lib/app/modules/home/widgets/lantern_widget.dart new file mode 100644 index 0000000..94f2c6d --- /dev/null +++ b/lib/app/modules/home/widgets/lantern_widget.dart @@ -0,0 +1,49 @@ +import 'package:dreampad/app/shared/shared.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class LanternWidget extends GetView { + const LanternWidget({ + super.key, + this.brightCount = 0, + }); + final int? brightCount; + + @override + Widget build(BuildContext context) { + return Positioned( + right: 60.w, + top: 346.h, + child: Container( + height: 90.h, + width: 180.w, + decoration: const BoxDecoration( + image: DecorationImage( + image: Images.homeLantern, + fit: BoxFit.fill, + ), + ), + child: Stack( + clipBehavior: Clip.none, + children: [ + brightCount! >= 1 + ? Positioned( + left: -9.w, + top: 36.h, + child: Images.homeLanternBright, + ) + : Container(), + brightCount! >= 2 + ? Positioned( + left: 18.w, + top: 27.h, + child: Images.homeLanternBright, + ) + : Container(), + ], + ), + ), + ); + } +} diff --git a/lib/app/modules/home/widgets/send_message_widget.dart b/lib/app/modules/home/widgets/send_message_widget.dart index 62afc66..eadda47 100644 --- a/lib/app/modules/home/widgets/send_message_widget.dart +++ b/lib/app/modules/home/widgets/send_message_widget.dart @@ -21,9 +21,12 @@ class SendMessageWidget extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text( - userName, - style: TextStyles.mediumGray9915, + Padding( + padding: REdgeInsets.only(right: 10.0), + child: Text( + userName, + style: TextStyles.mediumGray9915, + ), ), Gaps.vGap9, BubbleBox( diff --git a/lib/app/shared/constants/images.dart b/lib/app/shared/constants/images.dart index 7821b8d..4f27e6b 100644 --- a/lib/app/shared/constants/images.dart +++ b/lib/app/shared/constants/images.dart @@ -187,6 +187,12 @@ class Images { width: 9.w, ); + static Widget homeLanternBright = LoadAssetImage( + 'home/label_icon_lantern_bright', + height: 21.h, + width: 39.w, + ); + static Widget studyHome = LoadAssetImage( 'study/btn_icon_homepage', height: 66.w, @@ -275,6 +281,8 @@ class Images { AssetImage("assets/images/home/btn_bg_shine.png"); static const AssetImage homeWindows = AssetImage("assets/images/home/bg_pic_windows.png"); + static const AssetImage homeLantern = + AssetImage("assets/images/home/label_icon_lantern.png"); static const AssetImage studyBg = AssetImage("assets/images/study/bg_pic_dream_exploration_page.png"); diff --git a/lib/app/shared/utils/other_utils.dart b/lib/app/shared/utils/other_utils.dart index 58d2d1a..a8cb468 100644 --- a/lib/app/shared/utils/other_utils.dart +++ b/lib/app/shared/utils/other_utils.dart @@ -10,6 +10,11 @@ import '../constants/constants.dart'; import 'theme_utils.dart'; class Utils { + static String getDayString(int day) { + var upperString = '一二三四五六七八九'; + return upperString[day - 1]; + } + static String formatPrice(String price, {MoneyFormat format = MoneyFormat.END_INTEGER}) { return MoneyUtil.changeYWithUnit(