【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-7 | PHQ-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{staticconstList<QuizQuestion>questions=[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{staticconstList<InterpretationRange>ranges=[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(score>=range.minScore&&score<=range.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;finalMap<String,dynamic>interpretation;QuizResult({requiredthis.totalScore,requiredthis.maxScore,requiredthis.category,requiredthis.interpretation,}):percentage=(totalScore/maxScore)*100,level=interpretation['level']??'',completedAt=DateTime.now();}/// 通用测试服务classQuizService{/// 计算测试结果staticQuizResultcalculateResult({requiredQuizCategorycategory,requiredMap<int,int>answers,requiredList<QuizQuestion>questions,}){int totalScore=0;for(varentryinanswers.entries){totalScore+=questions[entry.key].scores[entry.value];}Map<String,dynamic>interpretation;if(category==QuizCategory.phq9){interpretation=PHQ9Interpretation.getInterpretation(totalScore).toMap();}else{interpretation=GAD7Interpretation.getInterpretation(totalScore).toMap();}returnQuizResult(totalScore:totalScore,maxScore:category.maxScore,category:category,interpretation:interpretation,);}}extensiononInterpretationRange{Map<String,dynamic>toMap(){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,}){finalpercentage=score/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(){finalhigherScore=phq9Result.totalScore>gad7Result.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),),),],),);}}六、我的踩坑记录
坑1:PHQ-9 和 GAD-7 结果解读逻辑混淆
问题:两个量表的结果解读逻辑搞混了。
原因:两个量表的分数区间不同,解析函数写错了一个。
解决:
// ✅ 正确写法:分别处理Map<String,dynamic>interpretation;if(category==QuizCategory.phq9){interpretation=PHQ9Interpretation.getInterpretation(totalScore).toMap();}else{interpretation=GAD7Interpretation.getInterpretation(totalScore).toMap();}七、大一学生真实学习总结
做 GAD-7 功能让我学到了代码复用的重要性。GAD-7 和 PHQ-9 的实现几乎完全一样,如果没有设计好通用框架,代码会非常冗余。
后来我重构了代码,设计了一个通用测试框架:
- 通用题目模型
- 通用结果计算
- 通用结果显示
这样以后再添加新的量表,只需要添加题目数据和解读逻辑,不用重复写页面代码。
作者:IntMainJhy
创作时间:2026年5月