鸿蒙掌上驾考宝典应用开发15:答题交互组件——Exam 与 SelectComponent 全解析

作者:麦田ya日期:2026/8/3

第15篇:答题交互组件——Exam 与 SelectComponent 全解析

一、引言

答题交互是驾考应用最核心的用户交互场景。DriverLicenseExam 项目的 Exam 组件和 SelectComponent 组件共同实现了完整的答题交互体验,包括试题展示、选项选择、答案判断、答题卡、倒计时等。本文将深入解析这两个组件的实现。

二、Exam 组件架构

2.1 组件职责

Exam 组件是考试页面的核心容器,负责:

  • 管理试题列表(Swiper 滑动切换)
  • 展示倒计时(模拟考试)
  • 管理答题卡浮层
  • 处理模拟考试结束弹窗

2.2 组件接口

1// components/exam/src/main/ets/components/Exam.ets
2@Entry
3@ComponentV2
4export struct Exam {
5  @Param @Require appPathStack: NavPathStack;  // 路由栈
6  @Param @Require examManager: ExamManager;     // 试卷数据
7  @Param mockExamCall: (score: number) => void = (score: number) => {};  // 模拟考试回调
8  
9  private examController: ExamController = ExamController.instance;
10  @Local remainTime: number = 0;               // 剩余时间
11  @Local isShowProblemListSheet: boolean = false;  // 答题卡显示
12  @Local currentIndex: number = 0;             // 当前第几题
13  @Local isStop: boolean = false;              // 暂停状态
14  private readonly renderWindowSize: number = 2;  // 渲染窗口大小
15}
16

三、答题交互流程

3.1 试题渲染

1build() {
2  Column() {
3    // 模拟考试倒计时
4    this.showRemainTime();
5
6    // 试题列表(Swiper 滑动切换)
7    Swiper(examController.swiperController) {
8      ForEach(this.examManager.examDetails, (item: ExamDetail, examIndex: number) => {
9        Column({ space: 12 }) {
10          if (this.shouldRenderQuestion(examIndex)) {
11            SelectComponent({
12              item: item,
13              changeCorrectNum: (isAdd: boolean) => {
14                isAdd ? this.examManager.correctNumber++ : this.examManager.correctNumber--;
15              },
16            });
17          }
18        }
19      });
20    }
21    // ... 底部导航(答题卡、上一题、下一题)
22  }
23}
24

3.2 渲染窗口优化

1// 只渲染当前题附近的题目,提高大题库性能
2private readonly renderWindowSize: number = 2;
3
4shouldRenderQuestion(examIndex: number): boolean {
5  return Math.abs(examIndex - this.currentIndex) <= this.renderWindowSize;
6}
7

四、模拟考试倒计时

4.1 倒计时实现

1aboutToAppear(): void {
2  this.currentIndex = this.examManager.currentQuestionId + 1;
3
4  if (this.examManager.timeLimit !== 0) {
5    this.remainTime = this.examManager.timeLimit * 60;
6    let showDialog: boolean = true;
7    
8    setInterval(() => {
9      if (showDialog && !this.isStop) {
10        if (this.remainTime >= 1) {
11          this.remainTime--;
12        } else {
13          showDialog = false;
14          this.isStop = true;
15          this.examSubmitDialog.open();
16        }
17      }
18    }, 1000);
19  }
20}
21

4.2 时间格式化

1@Builder
2showRemainTime() {
3  if (this.examManager.timeLimit !== 0) {
4    Row() {
5      Image($r('app.media.ic_time')).width(16).height(16);
6      Text(`${Math.floor(this.remainTime / 60)}:${String(this.remainTime % 60).padStart(2, '0')}`)
7        .fontSize(14)
8        .fontColor('#FF6B6B');
9    }
10  }
11}
12

五、答题卡实现

5.1 答题卡数据

1// 生成答题卡数据
2get answerCardData() {
3  return this.examManager.examDetails.map((item, index) => ({
4    index: index + 1,
5    status: item.isCorrect === undefined ? 'unanswered' : 
6            item.isCorrect ? 'correct' : 'wrong',
7    isCurrent: index === this.currentIndex
8  }));
9}
10

5.2 答题卡交互

1// 底部打开答题卡浮层
2Button('答题卡')
3  .onClick(() => {
4    this.isShowProblemListSheet = true;
5  })
6  .bindSheet($$this.isShowProblemListSheet, this.answerCardSheet(), {
7    height: 400,
8    title: { title: '答题卡' },
9  });
10

六、总结

Exam 和 SelectComponent 组件的设计体现了 ArkUI 组件化的最佳实践:

  1. 职责分离:Exam 管理流程,SelectComponent 管理交互
  2. 性能优化:渲染窗口机制减少不必要的渲染
  3. 状态管理:@Local 管理内部状态,@Param 接收外部数据
  4. 用户体验:倒计时、答题卡、弹窗等交互细节

关键源码文件:


鸿蒙掌上驾考宝典应用开发15:答题交互组件——Exam 与 SelectComponent 全解析》 是转载文章,点击查看原文


相关推荐


[V2X]音频数据流图
墨染天玑2026/7/26

Playback / Recording / Voice 三种场景的音频数据流框图: #mermaid-svg-nAP2CEPsCFL66meU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}


Day 008:Agent 记得越多越好吗?短期与长期记忆的底层逻辑
kisbad2026/7/18

系列: 100 天系统学习 AI Agent 开发 当前阶段: Agent 基础与环境搭建 今日目标: 搞懂短期记忆与长期记忆的核心差异,建立记忆治理机制。 AI Agent 大模型 Agent开发 LangGraph 很多刚接触 Agent 开发的同学,在加上数据库之后都会有一种错觉:“我的 Agent 终于拥有长期记忆了,它可以记住一切!” 但实操下来往往会遇到这种尴尬场景:学习助手如果每次都问“你学到第几天了”,会显得很智障;可如果它把你随口抱怨的一句“我最近不想学 Python”永久保


离线优先:无网络权限的鸿蒙 Flutter 应用设计
程序员小Pyy2026/7/10

在万物互联的时代,做一个"断网"应用反而是最激进、也最负责任的设计选择。本文以 E-Brufen 为例,从架构哲学、存储设计、代码实现到用户体验,全面探讨离线优先应用的构建方法。 一、为什么选择离线? 1.1 一句话:零权限 打开 E-Brufen 的 ohos/entry/src/main/module.json5,你会看到这样一行配置: "requestPermissions": [] 一个空数组。没有 ohos.permission.INTERNET、没有 ohos.p


定时任务(root)与 Web(www)权限冲突问题——使用 ACL 彻底解决
半桶水专家2026/7/2

在 Linux 服务器中,权限冲突问是一个非常常见的问题。 例如: Cron 定时任务:root 用户执行 PHP(Nginx + PHP-FPM):www-data 或 www 用户执行 Apache:apache 用户执行 Tomcat:tomcat 用户执行 两个不同用户需要共同读写同一目录。 很多人第一反应就是: chmod -R 777 data/ 虽然能解决问题,但非常不安全。 Linux 提供了更好的方案——ACL(Access Contr


MySQL 8.0 实现 JSON 字段全文检索 | ngram 分词支持单字/字母/中英文混合搜索
勿忘初心12212026/6/23

MySQL 8.0 实现 JSON 字段全文检索 | ngram 分词支持单字/字母/中英文混合搜索 前言一、业务场景二、技术痛点三、概念解释3.1 ngram 中日韩分词器3.2 生成列(Generated Column)3.3 全文索引(FULLTEXT INDEX)3.4 停用词表3.5 BOOLEAN MODE(布尔检索模式) 四、环境五、MySQL 全局配置(my.cnf / my.ini)5.1 完整配置文件5.2 重启 MySQL 服务5.3 验证配置是否生效 六、创


Claude Codde 入门教程—— 从零到独立完成项目
fa_lsyk2026/6/15

Claude Code 入门教程 适合人群:技术小白、编程初学者、对 AI 编程感兴趣的所有人 学习目标:读完本文后,你能够独立使用 Claude Code 完成一个完整的 OCP 项目 阅读时间:约 45-60 分钟 难度等级:★☆☆☆☆(零基础友好) 目录 前言:你即将拥有的"超能力"什么是 Claude Code?—— 你的 AI 编程伙伴安装 Claude Code —— 3 步搞定第一次对话 —— 跟 AI 说"你好"核心概念:理解 Claude Code 的"


HDFS 频繁进入安全模式的原因及解决方案
数据小羊2026/6/8

你是否遇到过 HDFS 集群时不时进入安全模式(Safe Mode)的问题?这不仅会影响数据的读写,还可能导致整个 Hadoop 生态系统的应用出现异常。本文将深入分析 HDFS 安全模式的触发机制,以及如何有效解决这个棘手问题。 什么是 HDFS 安全模式? HDFS 安全模式是一种保护机制,在这种状态下,文件系统只允许读操作,不允许任何修改文件系统的操作。通常在 NameNode 启动时会进入安全模式,以确保文件系统的元数据和数据块信息的一致性。 为什么 HDFS 会频繁进入安全模


【Redis】网络高并发模型
步十人2026/6/1

目录 一、 核心场景:百万并发下的秒杀大考1. 传统多线程服务器会怎么样?2. Redis 凭什么能抗住?第一步:建立连接(非阻塞 + epoll)第二步:读取请求(非阻塞 I/O)第三步:执行命令(单线程串行,纯内存操作)第四步:返回结果(非阻塞写) 二、 深度对比:多线程阻塞 vs 单线程非阻塞三、 演进:Redis 6.0+ 的多线程 I/O 革命四、 微观视角:一个秒杀请求的时间线拆解五、 致命死穴:如果某个命令很慢怎么办?本篇总结 一、 核心场景:百万并发


你写的代码没有测试,就像出门不锁门——Jest + Testing Library 从入门到不慌
kyriewen2026/5/11

你改了一行代码,手动点了一遍页面,觉得没问题就上线了。结果用户反馈“登录按钮点不动了”。你心里咯噔:我根本没改登录相关代码啊。今天我们来给你的代码装一把“智能门锁”——单元测试。用 Jest + Testing Library,把常见 Bug 锁在门外,让你改代码时不再心惊胆战。 前言 很多前端对测试的态度是:项目那么赶,哪有时间写测试?结果修 Bug 的时间比写代码还多。你花 20 分钟写的测试,可能帮你省掉 2 小时的通宵排查。 测试不是“额外工作”,而是安全网。当你需要重构、升级依赖、添


Git Worktree: AI 编程 Agent 并行开发的秘密武器
陈佬昔编程人生2026/5/1

你在 AI 编程工具里开发一个新功能,突然产品过来让修复一个紧急 bug。于是你开了两个 AI Agent: Agent A:在 feature/new-dashboard 上写新功能 Agent B:在 fix/login-bug 上修一个登录 Bug 你心想:"两个 Agent 同时干活,效率翻倍。" 但三分钟后你回到编辑器,看到的是一幅这样的画面: app/ ├── dashboard.tsx ← Agent A 刚改了这里,但没写完 ├── login.tsx ←

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读