release
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# 主页诗词卡片骨架屏设计文档
|
||||
|
||||
## 问题描述
|
||||
|
||||
当前主页诗词卡片在点击加载下一条时会出现闪白现象,原因是:
|
||||
1. `poetryData.value = newPoetryData` 触发整个卡片重建
|
||||
2. 重建过程中卡片内容短暂消失,显示白色背景
|
||||
3. 用户体验不佳,应该有平滑的过渡效果
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 方案:骨架屏过渡(推荐)
|
||||
|
||||
在加载新数据时,保持卡片容器显示,使用骨架屏(Skeleton)代替实际内容,实现平滑过渡。
|
||||
|
||||
**核心思路:**
|
||||
1. 卡片容器始终存在,不随数据变化而销毁重建
|
||||
2. 每个区域(标题、诗句、原文、关键词、译文)独立控制加载状态
|
||||
3. 加载时使用骨架屏动画,加载完成后显示实际内容
|
||||
4. 避免整个卡片的闪白现象
|
||||
|
||||
**技术实现:**
|
||||
1. 修改 `PoetryCard` 组件,添加骨架屏支持
|
||||
2. 使用 `Shimmer` 效果或自定义骨架动画
|
||||
3. 保持卡片背景色在加载过程中不变
|
||||
4. 分区域加载,逐步显示内容
|
||||
|
||||
## 文件修改
|
||||
|
||||
### 1. home_part.dart
|
||||
- 修改 `PoetryCard` 组件
|
||||
- 添加骨架屏 Widget
|
||||
- 优化加载状态的显示逻辑
|
||||
|
||||
### 2. home_controller.dart(如有需要)
|
||||
- 调整加载状态的管理
|
||||
- 确保骨架屏在正确时机显示
|
||||
|
||||
## 设计要点
|
||||
|
||||
1. **骨架屏样式**
|
||||
- 使用与卡片背景对比的颜色
|
||||
- 添加脉冲动画效果
|
||||
- 保持与内容区域相同的尺寸
|
||||
|
||||
2. **过渡动画**
|
||||
- 骨架屏到实际内容的淡入淡出
|
||||
- 避免突兀的切换
|
||||
|
||||
3. **深色模式支持**
|
||||
- 骨架屏颜色适配深色/浅色模式
|
||||
- 保持视觉一致性
|
||||
|
||||
## 预期效果
|
||||
|
||||
- 点击下一条时,卡片保持显示
|
||||
- 各区域显示骨架屏动画
|
||||
- 数据加载完成后,内容平滑过渡显示
|
||||
- 无闪白现象,用户体验流畅
|
||||
@@ -0,0 +1,185 @@
|
||||
# 诗词答题页面主题色支持与代码重构设计文档
|
||||
|
||||
**日期:** 2026-04-03
|
||||
**状态:** 待实现
|
||||
**作者:** AI Assistant
|
||||
|
||||
## 1. 概述
|
||||
|
||||
### 1.1 目标
|
||||
|
||||
将诗词答题相关页面重构以支持动态主题色,并将代码分流到 `poetry-page.dart`,实现 UI 和逻辑的分离。
|
||||
|
||||
### 1.2 范围
|
||||
|
||||
涉及文件:
|
||||
- `lib/views/profile/level/poetry.dart` - 主页面(状态管理、网络请求)
|
||||
- `lib/views/profile/level/poetry-page.dart` - UI 组件(选项、标签、布局)
|
||||
- `lib/views/profile/level/flow-anim.dart` - 流动边框动画
|
||||
- `lib/views/profile/level/distinguish.dart` - 答题记录页面
|
||||
- `lib/views/profile/level/level-jilu.dart` - 业务逻辑管理器(无需修改)
|
||||
|
||||
## 2. 架构设计
|
||||
|
||||
### 2.1 文件结构
|
||||
|
||||
```
|
||||
lib/views/profile/level/
|
||||
├── poetry.dart # 主页面(状态管理、网络请求)
|
||||
├── poetry-page.dart # UI 组件(选项、标签、布局)
|
||||
├── level-jilu.dart # 业务逻辑管理器
|
||||
├── flow-anim.dart # 流动边框动画
|
||||
└── distinguish.dart # 答题记录页面
|
||||
```
|
||||
|
||||
### 2.2 职责划分
|
||||
|
||||
**poetry.dart 职责:**
|
||||
- `PoetryLevelPage` 类(StatefulWidget)
|
||||
- `_PoetryLevelPageState` 类
|
||||
- 状态变量管理
|
||||
- 生命周期方法
|
||||
- 业务逻辑方法(网络请求、数据处理)
|
||||
- `build` 方法的主框架
|
||||
|
||||
**poetry-page.dart 职责:**
|
||||
- UI 组件定义
|
||||
- 主题色支持
|
||||
- 深色模式适配
|
||||
- 组件复用
|
||||
|
||||
## 3. 组件设计
|
||||
|
||||
### 3.1 PoetryOptionItem 组件
|
||||
|
||||
**功能:** 单个答题选项组件
|
||||
|
||||
**参数:**
|
||||
- `option`: dynamic - 选项数据
|
||||
- `isSelected`: bool - 是否被选中
|
||||
- `isCorrect`: bool - 是否正确
|
||||
- `isWrong`: bool - 是否错误
|
||||
- `isSubmitting`: bool - 是否正在提交
|
||||
- `showFeedback`: bool - 是否显示反馈
|
||||
- `isAnswerCorrect`: bool - 答案是否正确
|
||||
- `onTap`: Function(int) - 点击回调
|
||||
|
||||
**主题色支持:**
|
||||
- 使用 `ThemeColors.getThemeColor(themeController.themeColorIndexRx.value)` 获取主题色
|
||||
- 正确答案使用 `Colors.green`
|
||||
- 错误答案使用 `Colors.red`
|
||||
- 背景色根据深色模式动态调整
|
||||
|
||||
### 3.2 PoetryOptionsLayout 组件
|
||||
|
||||
**功能:** 选项布局组件(支持 2x2 和 1x4 布局)
|
||||
|
||||
**参数:**
|
||||
- `options`: List<dynamic> - 选项列表
|
||||
- `selectedAnswer`: int? - 选中的答案
|
||||
- `showFeedback`: bool - 是否显示反馈
|
||||
- `isAnswerCorrect`: bool - 答案是否正确
|
||||
- `isSubmitting`: bool - 是否正在提交
|
||||
- `onTap`: Function(int) - 点击回调
|
||||
|
||||
**布局逻辑:**
|
||||
- 检查所有选项是否都少于等于4个字
|
||||
- 如果是且选项数>=4,使用 2x2 布局
|
||||
- 否则使用 1x4 布局
|
||||
|
||||
### 3.3 PoetryTag 组件
|
||||
|
||||
**功能:** 标签组件(显示题目类型、年级、朝代)
|
||||
|
||||
**参数:**
|
||||
- `label`: String - 标签名称
|
||||
- `value`: String - 标签值
|
||||
|
||||
**主题色支持:**
|
||||
- 使用主题色作为背景色和文字颜色
|
||||
|
||||
## 4. 主题色支持策略
|
||||
|
||||
### 4.1 颜色替换规则
|
||||
|
||||
**替换:**
|
||||
- `AppConstants.primaryColor` → `ThemeColors.getThemeColor(themeController.themeColorIndexRx.value)`
|
||||
|
||||
**保留:**
|
||||
- 正确答案:`Colors.green` / `AppColors.iosGreen`
|
||||
- 错误答案:`Colors.red` / `AppColors.iosRed`
|
||||
- 背景色:根据深色模式动态调整
|
||||
|
||||
### 4.2 深色模式支持
|
||||
|
||||
**判断方式:**
|
||||
- 使用 `themeController.isDarkModeRx.value` 判断深色模式
|
||||
|
||||
**颜色调整:**
|
||||
- 背景色:`isDark ? Color(0xFF1A1A1A) : Colors.white`
|
||||
- 文字颜色:`isDark ? Colors.grey[300] : Colors.grey[700]`
|
||||
- 边框颜色:`isDark ? Colors.white.withAlpha(20) : Colors.black.withAlpha(10)`
|
||||
|
||||
## 5. 实现步骤
|
||||
|
||||
### 5.1 创建 poetry-page.dart
|
||||
|
||||
1. 创建 `PoetryOptionItem` 组件
|
||||
2. 创建 `PoetryOptionsLayout` 组件
|
||||
3. 创建 `PoetryTag` 组件
|
||||
4. 添加主题色支持
|
||||
5. 添加深色模式支持
|
||||
|
||||
### 5.2 修改 poetry.dart
|
||||
|
||||
1. 移除 `_buildOptionItem` 方法
|
||||
2. 移除 `_buildOptionsLayout` 方法
|
||||
3. 移除 `_buildTag` 方法
|
||||
4. 导入 `poetry-page.dart`
|
||||
5. 使用新组件替换原有方法
|
||||
6. 添加主题色支持
|
||||
|
||||
### 5.3 修改 flow-anim.dart
|
||||
|
||||
1. 添加主题色支持
|
||||
2. 使用 `ThemeColors.getThemeColor()` 替换硬编码颜色
|
||||
|
||||
### 5.4 修改 distinguish.dart
|
||||
|
||||
1. 添加主题色支持
|
||||
2. 使用 `ThemeColors.getThemeColor()` 替换硬编码颜色
|
||||
|
||||
## 6. 测试要点
|
||||
|
||||
### 6.1 功能测试
|
||||
|
||||
- 选项点击正常
|
||||
- 答案提交正常
|
||||
- 反馈显示正常
|
||||
- 布局切换正常(2x2 和 1x4)
|
||||
|
||||
### 6.2 主题色测试
|
||||
|
||||
- 主题色切换正常
|
||||
- 所有组件颜色同步更新
|
||||
- 深色模式切换正常
|
||||
|
||||
### 6.3 兼容性测试
|
||||
|
||||
- 关怀模式正常显示
|
||||
- 底部导航栏不遮挡内容
|
||||
- 动画效果正常
|
||||
|
||||
## 7. 注意事项
|
||||
|
||||
1. **保持布局不变**:重构过程中不修改页面布局
|
||||
2. **代码平衡**:确保两个文件代码量相近
|
||||
3. **性能优化**:使用 `Obx` 进行响应式更新,避免不必要的重建
|
||||
4. **向后兼容**:确保现有功能不受影响
|
||||
|
||||
## 8. 后续优化
|
||||
|
||||
1. 考虑将更多组件提取到 `poetry-page.dart`
|
||||
2. 添加单元测试
|
||||
3. 优化性能,减少不必要的重建
|
||||
4. 添加更多主题色选项
|
||||
Reference in New Issue
Block a user