dreampad/lib/app/modules/home/controllers/home_controller.dart
2023-12-01 20:45:31 +08:00

628 lines
33 KiB
Dart
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ignore_for_file: unnecessary_overrides
import 'dart:async';
import 'package:flutter/scheduler.dart';
import 'package:flutter_guid/flutter_guid.dart';
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_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';
class HomeController extends GetxController {
final HomeProvider homeProvider;
HomeController({required this.homeProvider});
final explored = false.obs;
final explored2 = 0.obs;
final create = true.obs;
final prompt = false.obs;
final exploreCount = 0.obs;
final exploreDay = 1.obs;
final chatMsgList = RxList<ChatMsg>([]);
final selectKnowledge = Rx<KnowledgePoint?>(null);
final knowledgePoints = RxList<Rx<KnowledgePoint>>([]);
final knowledgePointDialogues = RxList<KnowledgePointDialogue?>([]);
final chatInputMsg = ''.obs;
late final remainTimeStr =
'${(kTotalTimer ~/ 60).toString().padLeft(2, '0')}:${(kTotalTimer % 60).toString().padLeft(2, '0')}'
.obs;
final remainTime = kTotalTimer.obs;
final availableApp = false.obs;
late String account = '琉璃';
late int gender = 1;
late int age = 10;
late int occupationId = 1;
late String occupationName = '画家';
late List<ExploreApp> leftExploreApps = [];
late List<ExploreApp> rightExploreApps = [];
late List<Goal> goals = [];
late int sendCount = 0;
final int second = 3;
StreamSubscription<dynamic>? subscription;
final scrollController = ScrollController();
late TextEditingController textController = TextEditingController();
Timer? exploreTimer;
static const kTotalTimer = 2 * 60;
late int countTime = kTotalTimer;
// late int countTime = 45 * 60;
final repeatPeriod = const Duration(seconds: 1);
@override
void onInit() {
super.onInit();
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)!;
initLeftExploreApps();
initRightExploreApps();
initArtistGoals();
initAcademicianGoals();
initKnowledgePoints();
if (create.value) {
subscription = Stream.periodic(const Duration(seconds: 1), (int i) => i)
.take(second)
.listen((int i) async {
if (i >= second - 1) {
create.value = false;
prompt.value = true;
SpUtil.putBool(Constant.create, false);
await SmartDialog.show<bool>(
maskColor: const Color(0xFF02184B).withOpacity(0.9),
backDismiss: false,
clickMaskDismiss: false,
builder: (_) => const FirstTimeDialog(),
);
prompt.value = false;
}
});
}
if (account.isEmpty) {
SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
Get.offAllNamed(Routes.WELCOME);
});
}
}
@override
void onReady() async {
super.onReady();
}
@override
void onClose() {
super.onClose();
textController.dispose();
subscription?.cancel();
exploreTimer?.cancel();
}
Future explorePress() async {
if (explored.value) {
if (exploreTimer == null) {
availableApp.value = true;
exploreTimer = Timer.periodic(repeatPeriod, (timer) {
if (countTime <= 0) {
explored.value = false;
exploreCount.value = 0;
availableApp.value = false;
countTime = kTotalTimer;
remainTime.value = kTotalTimer;
exploreTimer!.cancel();
exploreTimer = null;
return;
}
countTime--;
int minute = countTime % 3600 ~/ 60;
int second = countTime % 60;
var str = '';
if (minute / 10 < 1) {
str = '${str}0$minute:';
} else {
str = '$str$minute:';
}
if (second / 10 < 1) {
str = '${str}0$second';
} else {
str = '$str$second';
}
remainTimeStr.value = str;
remainTime.value = countTime;
});
} else {
availableApp.value = false;
exploreTimer!.cancel();
exploreTimer = null;
}
}
}
void initKnowledgePoints() {
knowledgePoints.add(KnowledgePoint(
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)
.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)
.obs);
knowledgePointDialogues.add(KnowledgePointDialogue(
kpId: 3,
id: 0,
isGpt: true,
text: '''冰是水在低温下的固态形式。当水的温度降到0°C32°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)
.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)
.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)
.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() {
goals.add(
Goal(id: 1, occupationId: 5, age: age + 0, title: '今年目标', contents: [
GoalContent(title: '基础绘画技巧', content: '学习和练习基础的绘画技巧,如素描、色彩等。'),
GoalContent(title: '艺术欣赏能力', content: '参观美术馆、画展,增进对不同画派和风格的了解。'),
GoalContent(title: '创意表达培养', content: '通过日常生活的观察和想象,创作一些个人作品。'),
]));
goals.add(
Goal(id: 2, occupationId: 5, age: age + 3, title: '三年目标', contents: [
GoalContent(title: '基础绘画技巧', content: '尝试不同的绘画媒介和技巧,开始探索个人的艺术风格。'),
GoalContent(title: '艺术欣赏能力', content: '参加美术课程或夏令营,系统学习绘画知识。'),
GoalContent(title: '创意表达培养', content: '参加学校或社区的绘画比赛和展览,锻炼展示自己作品的能力。'),
]));
goals.add(Goal(id: 3, occupationId: 5, title: '18岁目标', contents: [
GoalContent(title: '艺术类院校申请', content: '申请艺术类高中或大学,接受正规的艺术教育。'),
GoalContent(title: '艺术实践加强', content: '通过参加画展、艺术竞赛等,增加实践经验。'),
GoalContent(title: '艺术理论学习', content: '学习艺术史、美学等,增强艺术理论素养。'),
]));
goals.add(Goal(id: 4, occupationId: 5, title: '22岁目标', contents: [
GoalContent(title: '专业深造', content: '在艺术类大学深入学习绘画,探索个人艺术方向。'),
GoalContent(title: '国际视野拓展', content: '参与国际艺术交流活动,了解全球艺术潮流。'),
GoalContent(title: '独立创作展示', content: '举办个人画展或参加重要艺术展览,展示个人作品。'),
]));
goals.add(Goal(id: 5, occupationId: 5, title: '30岁目标', contents: [
GoalContent(title: '个人品牌建立', content: '作为画家在艺术界建立良好的个人品牌和声誉。'),
GoalContent(title: '艺术教育贡献', content: '通过教学或工作坊等方式分享艺术知识和技巧。'),
GoalContent(title: '国际艺术影响力', content: '作品具有国际影响力,参与国际艺术交流与合作。'),
]));
}
void initAcademicianGoals() {
goals.add(
Goal(id: 1, occupationId: 1, age: age + 0, title: '今年目标', contents: [
GoalContent(title: '课外阅读提升', content: '选择与科学相关的儿童图书,每周至少阅读一本。'),
GoalContent(title: '科学兴趣培养', content: '参加科学实验兴趣小组或课外科学俱乐部,增进对科学的兴趣和理解。'),
GoalContent(title: '基础数学能力', content: '每天坚持数学练习,提高逻辑思维和解决问题的能力。'),
]));
goals.add(
Goal(id: 2, occupationId: 1, age: age + 3, title: '三年目标', contents: [
GoalContent(title: '科学竞赛参与', content: '参加学校或地区的科学竞赛,提高科学实践能力。'),
GoalContent(title: '英语能力加强', content: '科学领域英语是必备技能,提高英语水平以便阅读国际科学文献。'),
GoalContent(title: '拓展科学知识', content: '通过在线课程或夏令营等方式,学习物理、化学等更多科学知识。'),
]));
goals.add(Goal(id: 3, occupationId: 1, title: '18岁目标', contents: [
GoalContent(title: '理想大学申请', content: '申请国内外知名大学的科学相关专业,为深造打下基础。'),
GoalContent(title: '科学研究实习', content: '在大学期间尽早寻找实习机会,加入科研团队。'),
GoalContent(title: '专业网络构建', content: '建立与科学家和研究人员的联系,拓宽学术交流圈。'),
]));
goals.add(Goal(id: 4, occupationId: 1, title: '22岁目标', contents: [
GoalContent(title: '硕士/博士深造', content: '申请硕士或直接博士项目,深入专业领域研究。'),
GoalContent(title: '学术论文发表', content: '在专业期刊上发表研究成果,建立学术声誉。'),
GoalContent(title: '国际科研合作', content: '参与国际科研项目,扩大研究视野。'),
]));
goals.add(Goal(id: 5, occupationId: 1, title: '30岁目标', contents: [
GoalContent(title: '科学研究突破', content: '在某一科学领域取得显著研究成果。'),
GoalContent(title: '科学社群领导', content: '在科学界承担一定的领导角色,如项目负责人或研究小组领头。'),
GoalContent(title: '学术影响力拓展', content: '通过公开讲座、论文发表等方式,提高在科学界的影响力。'),
]));
}
void initLeftExploreApps() {
leftExploreApps.add(ExploreApp(
name: '哔哩哔哩',
icon: 'btn_app_bilibili',
grayIcon: 'btn_app_bilibili_gray',
));
leftExploreApps.add(ExploreApp(
name: '知乎',
icon: 'btn_app_zhihu',
grayIcon: 'btn_app_zhihu_gray',
));
leftExploreApps.add(ExploreApp(
name: '纪念碑谷',
icon: 'btn_app_jinianbeigu',
grayIcon: 'btn_app_jinianbeigu_gray',
));
leftExploreApps.add(ExploreApp(
name: '蛋仔派对',
icon: 'btn_app_danzaipaidui',
grayIcon: 'btn_app_danzaipaidui_gray',
));
}
void initRightExploreApps() {
rightExploreApps.add(ExploreApp(
name: '古诗文网',
icon: 'btn_app_gushiwenwang',
grayIcon: 'btn_app_gushiwenwang_gray',
));
rightExploreApps.add(ExploreApp(
name: '数理思维启蒙',
icon: 'btn_app_funexpected',
grayIcon: 'btn_app_funexpected_gray',
));
rightExploreApps.add(ExploreApp(
name: '多邻国',
icon: 'btn_app_duolingo',
grayIcon: 'btn_app_duolingo_gray',
));
rightExploreApps.add(ExploreApp(
name: '每日艺术',
icon: 'btn_app_dailyart',
grayIcon: 'btn_app_dailyart_gray',
));
}
Goal getGoal(int id) {
return goals
.firstWhere((t) => t.id == id && t.occupationId == occupationId);
}
Future reset() async {
SpUtil.remove(Constant.create);
await Get.offAllNamed(Routes.WELCOME);
}
Future leareKnowledge(KnowledgePoint knowledge) async {
textController = TextEditingController();
sendCount = 0;
selectKnowledge.value = knowledge;
chatMsgList.clear();
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);
}
Future addSendMsg(String txt) async {
var chatMsg = ChatMsg(
id: Guid.newGuid.toString(),
text: txt,
isBot: 0,
knowledgeId: selectKnowledge.value!.id,
);
chatMsgList.add(chatMsg);
SchedulerBinding.instance.addPostFrameCallback((timeStamp) async {
scrollController.animateTo(
scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeIn,
);
});
await Future.delayed(const Duration(seconds: 1));
var knowledgePointDialogue = knowledgePointDialogues.firstWhereOrNull((t) =>
t!.kpId == selectKnowledge.value!.id && t.id == (sendCount - 1) && t.isGpt!);
if (knowledgePointDialogue == null) {
return;
}
chatMsg = ChatMsg(
id: Guid.newGuid.toString(),
text: knowledgePointDialogue.text,
isBot: 1,
knowledgeId: selectKnowledge.value!.id,
);
chatMsgList.add(chatMsg);
SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
scrollController.animateTo(
scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeIn,
);
});
var knowledge = knowledgePoints
.firstWhere((t) => t.value.id == selectKnowledge.value!.id);
knowledge.update((val) {
val!.leared = true;
});
selectKnowledge.update((val) {
val!.leared = true;
});
exploreCount.value++;
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!;
}
}
}