60e47f7c
liangchengyou
feat:课程选择功能
|
1
2
|
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
|
60e47f7c
liangchengyou
feat:课程选择功能
|
3
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
60e47f7c
liangchengyou
feat:课程选择功能
|
4
|
import 'package:wow_english/common/widgets/we_app_bar.dart';
|
8988aa69
liangchengyou
feat:首页+课程列表数据获取
|
5
6
|
import 'package:wow_english/models/course_module_entity.dart';
import 'package:wow_english/route/route.dart';
|
4b358e22
liangchengyou
feat:调整文件结构
|
7
|
|
2187c85f
吴启风
feat:课程结构调整
|
8
9
|
import 'bloc/module_bloc.dart';
import 'widgets/module_item_widget.dart';
|
60e47f7c
liangchengyou
feat:课程选择功能
|
10
|
|
5b87e560
吴启风
feat:导航栏视觉优化
|
11
12
13
|
// 课程阶段(模块)列表页
class CourseModulePage extends StatelessWidget {
const CourseModulePage({super.key, this.starPageIndex});
|
60e47f7c
liangchengyou
feat:课程选择功能
|
14
15
16
|
final int? starPageIndex;
|
60e47f7c
liangchengyou
feat:课程选择功能
|
17
18
19
|
@override
Widget build(BuildContext context) {
return BlocProvider(
|
2187c85f
吴启风
feat:课程结构调整
|
20
21
22
|
create: (context) => ModuleBloc(
starPageIndex ?? 0,
PageController(initialPage: starPageIndex ?? 0, viewportFraction: 0.3),
|
842b7132
liangchengyou
feat:磨耳朵/练习页面调整
|
23
|
)..add(RequestDataEvent()),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
24
25
26
27
28
29
|
child: _LessonPageView(),
);
}
}
class _LessonPageView extends StatelessWidget {
|
f0d56772
liangchengyou
feat:更新尺寸适配
|
30
|
final double _cardHeight = 240.h;
|
60e47f7c
liangchengyou
feat:课程选择功能
|
31
|
|
60e47f7c
liangchengyou
feat:课程选择功能
|
32
33
34
35
|
final double _scale = 0.8;
@override
Widget build(BuildContext context) {
|
2187c85f
吴启风
feat:课程结构调整
|
36
37
|
return BlocListener<ModuleBloc, ModuleState>(
listener: (context, state) {},
|
60e47f7c
liangchengyou
feat:课程选择功能
|
38
|
child: Scaffold(
|
5b87e560
吴启风
feat:导航栏视觉优化
|
39
|
appBar: const WEAppBar(),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
40
41
42
43
44
|
body: _lessViewWidget(),
),
);
}
|
2187c85f
吴启风
feat:课程结构调整
|
45
46
47
|
Widget _lessViewWidget() =>
BlocBuilder<ModuleBloc, ModuleState>(builder: (context, state) {
final bloc = BlocProvider.of<ModuleBloc>(context);
|
60e47f7c
liangchengyou
feat:课程选择功能
|
48
49
50
51
52
53
54
|
return Center(
child: SafeArea(
child: Column(
children: [
SizedBox(
height: _cardHeight,
child: PageView.builder(
|
993c1a04
liangchengyou
feat:添加数据模型
|
55
|
itemCount: bloc.listData.length,
|
60e47f7c
liangchengyou
feat:课程选择功能
|
56
57
58
59
|
controller: bloc.pageController,
onPageChanged: (int index) {
bloc.add(PageViewChangeIndexEvent(index));
},
|
2187c85f
吴启风
feat:课程结构调整
|
60
|
itemBuilder: (context, index) => _itemTransCard(index)),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
61
62
63
|
),
32.verticalSpace,
SizedBox(
|
f0d56772
liangchengyou
feat:更新尺寸适配
|
64
|
height: 32.h,
|
6f617434
liangchengyou
feat:磨耳朵/视频跟读列表页接口调整
|
65
|
width: 66.w * bloc.listData.length,
|
60e47f7c
liangchengyou
feat:课程选择功能
|
66
|
child: ListView.builder(
|
8988aa69
liangchengyou
feat:首页+课程列表数据获取
|
67
|
itemCount: bloc.listData.length,
|
60e47f7c
liangchengyou
feat:课程选择功能
|
68
|
scrollDirection: Axis.horizontal,
|
2187c85f
吴启风
feat:课程结构调整
|
69
|
itemBuilder: (BuildContext context, int index) {
|
60e47f7c
liangchengyou
feat:课程选择功能
|
70
|
return Container(
|
f0d56772
liangchengyou
feat:更新尺寸适配
|
71
72
|
height: 32.h,
width: 66.w,
|
60e47f7c
liangchengyou
feat:课程选择功能
|
73
74
75
76
77
78
|
padding: const EdgeInsets.symmetric(horizontal: 5),
child: GestureDetector(
onTap: () {
if (index == bloc.currentPageIndex) {
return;
}
|
2187c85f
吴启风
feat:课程结构调整
|
79
80
81
82
83
84
|
int mill = (index - bloc.currentPageIndex) > 0
? 100 * (index - bloc.currentPageIndex)
: 100 * (bloc.currentPageIndex - index);
bloc.pageController.animateToPage(index,
duration: Duration(milliseconds: mill),
curve: Curves.ease);
|
60e47f7c
liangchengyou
feat:课程选择功能
|
85
86
|
},
child: Container(
|
2187c85f
吴启风
feat:课程结构调整
|
87
|
height: bloc.currentPageIndex == index ? 32 : 20,
|
60e47f7c
liangchengyou
feat:课程选择功能
|
88
|
decoration: BoxDecoration(
|
2187c85f
吴启风
feat:课程结构调整
|
89
90
91
|
color: bloc.currentPageIndex == index
? Colors.red
: Colors.white,
|
6f617434
liangchengyou
feat:磨耳朵/视频跟读列表页接口调整
|
92
|
borderRadius: BorderRadius.circular(5.r),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
93
94
95
96
97
98
99
|
border: Border.all(
width: 0.5,
color: Colors.black,
),
),
alignment: Alignment.center,
child: Text(
|
2187c85f
吴启风
feat:课程结构调整
|
100
|
(index + 1).toString(),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
101
|
style: TextStyle(
|
2187c85f
吴启风
feat:课程结构调整
|
102
103
104
|
color: bloc.currentPageIndex == index
? Colors.white
: Colors.black),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
105
106
107
108
109
|
),
),
),
);
}),
|
60e47f7c
liangchengyou
feat:课程选择功能
|
110
111
112
113
114
115
116
|
)
],
),
),
);
});
|
2187c85f
吴启风
feat:课程结构调整
|
117
118
119
120
121
122
123
124
125
|
Widget _itemTransCard(int index) =>
BlocBuilder<ModuleBloc, ModuleState>(builder: (context, state) {
final bloc = BlocProvider.of<ModuleBloc>(context);
Matrix4 matrix4 = Matrix4.identity();
if (index == bloc.currentPageIndex.floor()) {
//当前的item
double currScale =
(1 - (bloc.currentPageIndex - index) * (1 - _scale)).toDouble();
var currTrans = _cardHeight * (1 - currScale) / 2;
|
60e47f7c
liangchengyou
feat:课程选择功能
|
126
|
|
2187c85f
吴启风
feat:课程结构调整
|
127
128
129
130
131
132
133
|
matrix4 = Matrix4.diagonal3Values(1.0, currScale, 1.0)
..setTranslationRaw(0.0, currTrans, 0.0);
} else if (index == bloc.currentPageIndex.floor() + 1) {
//右边的item
var currScale =
_scale + (bloc.currentPageIndex - index + 1) * (1 - _scale);
var currTrans = _cardHeight * (1 - currScale) / 2;
|
60e47f7c
liangchengyou
feat:课程选择功能
|
134
|
|
2187c85f
吴启风
feat:课程结构调整
|
135
136
137
138
139
140
141
|
matrix4 = Matrix4.diagonal3Values(1.0, currScale, 1.0)
..setTranslationRaw(0.0, currTrans, 0.0);
} else if (index == bloc.currentPageIndex - 1) {
//左边
var currScale =
(1 - (bloc.currentPageIndex - index) * (1 - _scale)).toDouble();
var currTrans = _cardHeight * (1 - currScale) / 2;
|
60e47f7c
liangchengyou
feat:课程选择功能
|
142
|
|
2187c85f
吴启风
feat:课程结构调整
|
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
matrix4 = Matrix4.diagonal3Values(1.0, currScale, 1.0)
..setTranslationRaw(0.0, currTrans, 0.0);
} else {
//其他,不在屏幕显示的item
matrix4 = Matrix4.diagonal3Values(1.0, _scale, 1.0)
..setTranslationRaw(0.0, _cardHeight * (1 - _scale) / 2, 0.0);
}
CourseModuleEntity? model = bloc.listData[index];
return Transform(
transform: matrix4,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: ModuleItemWidget(
model: model,
isSelected: bloc.currentPageIndex == index,
onClickEvent: () {
pushNamedAndRemoveUntil(
AppRouteName.courseUnit, (route) => route.isFirst,
arguments: {'courseModuleEntity': model});
},
),
|
8988aa69
liangchengyou
feat:首页+课程列表数据获取
|
164
|
),
|
2187c85f
吴启风
feat:课程结构调整
|
165
166
|
);
});
|
c61b3c1a
Key
feat: toast_util....
|
167
|
}
|