【Flutter for OpenHarmony】Flutter三方库GAD-7焦虑量表的鸿蒙化适配与实战指南
【Flutter for OpenHarmony】Flutter三方库GAD-7焦虑量表的鸿蒙化适配与实战指南欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net一、什么是GAD-7量表我是 IntMainJhy上海某高校大一计算机专业的学生。GAD-7 是我做的第二个心理量表功能。GAD-7 全称Generalized Anxiety Disorder-7中文名叫广泛性焦虑障碍量表-7项。它是由纽约大学的 Robert L. Spitzer 等人于2006年开发的专门用于筛查焦虑障碍。GAD-7 vs PHQ-9 的区别维度GAD-7PHQ-9用途筛查焦虑障碍筛查抑郁症评估时间过去2周过去2周题数7题9题满分21分27分侧重点担忧、紧张、恐惧情绪低落、兴趣减退二、GAD-7量表内容2.1 七道题目题号问题描述1感觉紧张、焦虑或烦躁不安2无法停止或控制担忧3对各种事情担忧过多4很难放松下来5因为担忧而很难静坐6变得容易烦恼或急躁7感到害怕好像有什么可怕的事会发生2.2 评分标准和 PHQ-9 一样选项含义分数完全没有过去两周没有或几乎没有0分好几天1-6天1分一半以上天数7-11天2分几乎每天12-14天3分总分范围0-21分2.3 结果解读分数焦虑程度建议0-4无或极轻微焦虑正常范围5-9轻度焦虑学习放松技巧10-14中度焦虑建议咨询专业人士15-21重度焦虑需要专业治疗三、GAD-7数据模型// lib/mental_health/models/gad7_model.dart/// GAD-7 量表题目classGAD7Questions{staticconstListQuizQuestionquestions[QuizQuestion(questionText:感觉紧张、焦虑或烦躁不安,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:无法停止或控制担忧,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:对各种事情担忧过多,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:很难放松下来,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:因为担忧而很难静坐,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:变得容易烦恼或急躁,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),QuizQuestion(questionText:感到害怕好像有什么可怕的事会发生,options:[完全没有,好几天,一半以上天数,几乎每天],scores:[0,1,2,3],),];}/// GAD-7 结果解读classGAD7Interpretation{staticconstListInterpretationRangeranges[InterpretationRange(minScore:0,maxScore:4,level:无或极轻微焦虑,color:Color(0xFF27AE60),description:你的焦虑水平处于正常范围。继续保持良好的心态。,suggestion:建议保持规律运动和充足睡眠。,),InterpretationRange(minScore:5,maxScore:9,level:轻度焦虑,color:Color(0xFFF39C12),description:你可能有轻度焦虑。建议学习一些放松技巧。,suggestion:建议尝试深呼吸、渐进性肌肉放松。,),InterpretationRange(minScore:10,maxScore:14,level:中度焦虑,color:Color(0xFFE67E22),description:你可能有中度焦虑症状。建议咨询专业人士。,suggestion:建议寻求心理咨询师的帮助。,),InterpretationRange(minScore:15,maxScore:21,level:重度焦虑,color:Color(0xFFE74C3C),description:你可能有重度焦虑症状。需要专业治疗。,suggestion:请寻求心理健康专业人士的帮助。,),];staticInterpretationRangegetInterpretation(int score){for(finalrangeinranges){if(scorerange.minScorescorerange.maxScore){returnrange;}}returnranges.first;}}四、代码复用设计GAD-7 和 PHQ-9 的实现逻辑几乎完全一样只是题目不同。为了代码复用我设计了一个通用的测试框架// lib/mental_health/models/quiz_model.dart/// 测试结果classQuizResult{finalint totalScore;finalint maxScore;finaldouble percentage;finalStringlevel;finalDateTimecompletedAt;finalQuizCategorycategory;finalMapString,dynamicinterpretation;QuizResult({requiredthis.totalScore,requiredthis.maxScore,requiredthis.category,requiredthis.interpretation,}):percentage(totalScore/maxScore)*100,levelinterpretation[level]??,completedAtDateTime.now();}/// 通用测试服务classQuizService{/// 计算测试结果staticQuizResultcalculateResult({requiredQuizCategorycategory,requiredMapint,intanswers,requiredListQuizQuestionquestions,}){int totalScore0;for(varentryinanswers.entries){totalScorequestions[entry.key].scores[entry.value];}MapString,dynamicinterpretation;if(categoryQuizCategory.phq9){interpretationPHQ9Interpretation.getInterpretation(totalScore).toMap();}else{interpretationGAD7Interpretation.getInterpretation(totalScore).toMap();}returnQuizResult(totalScore:totalScore,maxScore:category.maxScore,category:category,interpretation:interpretation,);}}extensiononInterpretationRange{MapString,dynamictoMap(){return{level:level,color:color,description:description,suggestion:suggestion,};}}五、心理健康双量表对比为了帮助用户更好地理解自己的状态我在 App 中做了一个双量表对比功能// lib/mental_health/widgets/dual_scale_widget.dart/// 双量表对比组件classDualScaleComparisonextendsStatelessWidget{finalQuizResultphq9Result;finalQuizResultgad7Result;constDualScaleComparison({super.key,requiredthis.phq9Result,requiredthis.gad7Result,});overrideWidgetbuild(BuildContextcontext){returnCard(child:Padding(padding:constEdgeInsets.all(16),child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[constText(综合心理健康评估,style:TextStyle(fontSize:18,fontWeight:FontWeight.bold,),),constSizedBox(height:16),// PHQ-9 结果_buildResultBar(label:抑郁倾向 (PHQ-9),score:phq9Result.totalScore,maxScore:phq9Result.maxScore,color:QuizCategory.phq9.color,),constSizedBox(height:12),// GAD-7 结果_buildResultBar(label:焦虑倾向 (GAD-7),score:gad7Result.totalScore,maxScore:gad7Result.maxScore,color:QuizCategory.gad7.color,),constSizedBox(height:16),// 综合建议_buildSuggestion(),],),),);}Widget_buildResultBar({requiredStringlabel,required int score,required int maxScore,requiredColorcolor,}){finalpercentagescore/maxScore;returnColumn(crossAxisAlignment:CrossAxisAlignment.start,children:[Row(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:[Text(label),Text($score/$maxScore),],),constSizedBox(height:4),LinearProgressIndicator(value:percentage,backgroundColor:color.withOpacity(0.2),valueColor:AlwaysStoppedAnimation(color),),],);}Widget_buildSuggestion(){finalhigherScorephq9Result.totalScoregad7Result.totalScore?抑郁:焦虑;returnContainer(padding:constEdgeInsets.all(12),decoration:BoxDecoration(color:constColor(0xFFFFF3E0),borderRadius:BorderRadius.circular(8),),child:Row(children:[constIcon(Icons.info_outline,color:Color(0xFFFF9800)),constSizedBox(width:8),Expanded(child:Text(你的${higherScore}倾向相对较高建议多关注这方面的心理调节。,style:constTextStyle(fontSize:13),),),],),);}}六、我的踩坑记录坑1PHQ-9 和 GAD-7 结果解读逻辑混淆问题两个量表的结果解读逻辑搞混了。原因两个量表的分数区间不同解析函数写错了一个。解决// ✅ 正确写法分别处理MapString,dynamicinterpretation;if(categoryQuizCategory.phq9){interpretationPHQ9Interpretation.getInterpretation(totalScore).toMap();}else{interpretationGAD7Interpretation.getInterpretation(totalScore).toMap();}七、大一学生真实学习总结做 GAD-7 功能让我学到了代码复用的重要性。GAD-7 和 PHQ-9 的实现几乎完全一样如果没有设计好通用框架代码会非常冗余。后来我重构了代码设计了一个通用测试框架通用题目模型通用结果计算通用结果显示这样以后再添加新的量表只需要添加题目数据和解读逻辑不用重复写页面代码。作者IntMainJhy创作时间2026年5月