Commit 07b173c9516b4255c731c5c0b50a786dc51caad6

Authored by 吴启风
1 parent 37063ced

feat:练习页上方进度信息改成进度条呈现

lib/pages/practice/bloc/topic_picture_bloc.dart
... ... @@ -80,7 +80,10 @@ class TopicPictureBloc
80 80  
81 81 final BuildContext context;
82 82  
83   - TopicPictureBloc(this.context, this.pageController, this.courseLessonId)
  83 + final Color? moduleColor;
  84 +
  85 + TopicPictureBloc(
  86 + this.context, this.pageController, this.courseLessonId, this.moduleColor)
84 87 : super(TopicPictureInitial()) {
85 88 on<CurrentPageIndexChangeEvent>(_pageControllerChange);
86 89 on<VoicePlayStateChangeEvent>(_voicePlayStateChange);
... ...
lib/pages/practice/topic_picture_page.dart
... ... @@ -15,18 +15,17 @@ import &#39;bloc/topic_picture_bloc.dart&#39;;
15 15 import 'widgets/practice_header_widget.dart';
16 16  
17 17 class TopicPicturePage extends StatelessWidget {
18   - const TopicPicturePage({super.key, this.courseLessonId});
  18 + const TopicPicturePage({super.key, this.courseLessonId, this.moduleColor});
19 19  
20 20 final String? courseLessonId;
21 21  
  22 + final Color? moduleColor;
  23 +
22 24 @override
23 25 Widget build(BuildContext context) {
24 26 return BlocProvider(
25 27 create: (context) => TopicPictureBloc(
26   - context,
27   - PageController(),
28   - courseLessonId ?? '',
29   - )
  28 + context, PageController(), courseLessonId ?? '', moduleColor)
30 29 ..add(InitBlocEvent())
31 30 ..add(RequestDataEvent())
32 31 ..add(XSVoiceInitEvent({
... ... @@ -70,7 +69,9 @@ class _TopicPicturePage extends StatelessWidget {
70 69 Column(
71 70 children: [
72 71 PracticeHeaderWidget(
73   - title: '${bloc.currentPage}/${bloc.entity?.topics?.length}',
  72 + color: bloc.moduleColor,
  73 + progress: bloc.currentPage,
  74 + total: bloc.entity?.topics?.length ?? 0,
74 75 onTap: () {
75 76 popPage(data: {
76 77 'currentStep': bloc.currentPage,
... ...
lib/pages/practice/widgets/practice_header_widget.dart
1 1 import 'package:flutter/material.dart';
2 2 import 'package:flutter_screenutil/flutter_screenutil.dart';
  3 +import 'package:percent_indicator/linear_percent_indicator.dart';
3 4 import 'package:wow_english/common/extension/string_extension.dart';
4 5  
5 6 class PracticeHeaderWidget extends StatelessWidget {
6   - const PracticeHeaderWidget({super.key, required this.onTap, this.title = ''});
  7 + const PracticeHeaderWidget(
  8 + {super.key,
  9 + required this.onTap,
  10 + this.color,
  11 + required this.total,
  12 + this.progress = 0});
7 13  
8 14 final Function() onTap;
9 15  
10   - final String title;
  16 + ///进度条颜色(阶段颜色)
  17 + final Color? color;
  18 +
  19 + ///进度条总长度
  20 + final int total;
  21 +
  22 + ///进度条当前长度
  23 + final int progress;
11 24  
12 25 @override
13 26 Widget build(BuildContext context) {
... ... @@ -26,21 +39,19 @@ class PracticeHeaderWidget extends StatelessWidget {
26 39 ),
27 40 centerTitle: true,
28 41 title: Container(
29   - height: 20.h,
30   - width: 100.w, // 容器宽度
  42 + height: 10.h,
  43 + width: 150.w, // 容器宽度
31 44 // padding: EdgeInsets.symmetric(horizontal: 27.w, vertical: 10.h),
32 45 alignment: Alignment.center,
33   - decoration: BoxDecoration(
34   - color: const Color(0xFF00B6F1),
35   - borderRadius: BorderRadius.circular(20.r),
36   - border: Border.all(
37   - width: 1.0,
38   - color: const Color(0xFF333333),
39   - ),
40   - ),
41   - child: Text(
42   - title,
43   - style: TextStyle(fontSize: 15.sp, color: Colors.white),
  46 + child: LinearPercentIndicator(
  47 + animation: true,
  48 + lineHeight: 10.h,
  49 + animationDuration: 250,
  50 + animateFromLastPercent: true,
  51 + percent: total > 0 ? progress / total : 0,
  52 + // center: Text('$progress/$total}'),
  53 + barRadius: const Radius.circular(5),
  54 + progressColor: color,
44 55 ),
45 56 ),
46 57 ));
... ...
lib/pages/section/section_page.dart
... ... @@ -136,9 +136,12 @@ class _SectionPageView extends StatelessWidget {
136 136 clickController.playMusicAndPerformAction(
137 137 context, AudioPlayerUtilType.quizTime, () async {
138 138 await bloc.requestEnterClass(courseLessonId, () {
139   - pushNamed(AppRouteName.topicPic,
140   - arguments: {'courseLessonId': courseLessonId})
141   - .then((value) {
  139 + pushNamed(AppRouteName.topicPic, arguments: {
  140 + 'courseLessonId': courseLessonId,
  141 + 'moduleColor': CourseModuleModel(
  142 + bloc.courseUnitEntity.courseModuleCode ?? 'Phase-1')
  143 + .color
  144 + }).then((value) {
142 145 if (value != null) {
143 146 Map<String, dynamic> dataMap =
144 147 value as Map<String, dynamic>;
... ...
lib/route/route.dart
... ... @@ -183,12 +183,15 @@ class AppRouter {
183 183 });*/
184 184 case AppRouteName.topicPic:
185 185 var courseLessonId = '';
  186 + Color? moduleColor;
186 187 if (settings.arguments != null) {
187 188 courseLessonId =
188 189 (settings.arguments as Map)['courseLessonId'] as String;
  190 + moduleColor = (settings.arguments as Map)['moduleColor'] as Color?;
189 191 }
190 192 return CupertinoPageRoute(
191   - builder: (_) => TopicPicturePage(courseLessonId: courseLessonId));
  193 + builder: (_) => TopicPicturePage(
  194 + courseLessonId: courseLessonId, moduleColor: moduleColor));
192 195 case AppRouteName.lookVideo:
193 196 final videoUrl = (settings.arguments as Map)['videoUrl'] as String?;
194 197 final title = (settings.arguments as Map)['title'] as String?;
... ...
pubspec.yaml
... ... @@ -116,6 +116,8 @@ dependencies:
116 116 umeng_apm_sdk: ^2.2.1
117 117 # 嵌套滚动 https://pub.dev/packages/nested_scroll_views
118 118 nested_scroll_views: ^0.0.10
  119 + # 进度条组件 https://pub.dev/packages/percent_indicator 主要看重其支持的进度动画效果
  120 + percent_indicator: ^4.2.3
119 121  
120 122 dev_dependencies:
121 123 build_runner: ^2.4.4
... ...