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