From 6f61743479801b967bad9cbdad2f4daaab64484f Mon Sep 17 00:00:00 2001 From: lcy <2503978335@qq.com> Date: Tue, 27 Jun 2023 14:37:50 +0800 Subject: [PATCH] feat:磨耳朵/视频跟读列表页接口调整 --- lib/common/request/dao/home_dao.dart | 3 --- lib/common/request/dao/listen_dao.dart | 12 ++++++++++-- lib/common/widgets/ow_image_widget.dart | 32 ++++++++++++++++++++++++++++++++ lib/generated/json/base/json_convert_content.dart | 5 +++++ lib/generated/json/follow_read_entity.g.dart | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/models/follow_read_entity.dart | 29 +++++++++++++++++++++++++++++ lib/pages/home/home_page.dart | 26 +++++++++++++++++++++----- lib/pages/home/widgets/home_bouns_item.dart | 3 ++- lib/pages/home/widgets/home_lesson_item_widget.dart | 27 --------------------------- lib/pages/home/widgets/home_tab_header_widget.dart | 16 ++++++++-------- lib/pages/home/widgets/home_vidoe_item.dart | 23 ++++++++++++----------- lib/pages/lessons/lesson_page.dart | 21 +++++++++++---------- lib/pages/lessons/widgets/lesson_item_widget.dart | 40 ++++++++++++++++++++++++++++++---------- lib/pages/listen/bloc/listen_bloc.dart | 12 +++--------- lib/pages/listen/listen_page.dart | 4 ++-- lib/pages/listen/widgets/listen_item_widget.dart | 24 ++++++++++++++---------- lib/pages/repeatafter/bloc/repeat_after_bloc.dart | 23 ++++++++++++++++++----- lib/pages/repeatafter/repeat_after_page.dart | 11 +++++------ lib/pages/repeatafter/widgets/repeat_after_item.dart | 36 +++++++++++++++++++----------------- 19 files changed, 288 insertions(+), 126 deletions(-) create mode 100644 lib/common/widgets/ow_image_widget.dart create mode 100644 lib/generated/json/follow_read_entity.g.dart create mode 100644 lib/models/follow_read_entity.dart delete mode 100644 lib/pages/home/widgets/home_lesson_item_widget.dart diff --git a/lib/common/request/dao/home_dao.dart b/lib/common/request/dao/home_dao.dart index c6ae3de..8ed0f60 100644 --- a/lib/common/request/dao/home_dao.dart +++ b/lib/common/request/dao/home_dao.dart @@ -22,9 +22,6 @@ class HomeDao { Apis.courseLesson, queryParameters: mapData ); - if (kDebugMode) { - print('>>>>>>>>>${data.runtimeType}'); - } return data; } } diff --git a/lib/common/request/dao/listen_dao.dart b/lib/common/request/dao/listen_dao.dart index 4745e02..8a246e3 100644 --- a/lib/common/request/dao/listen_dao.dart +++ b/lib/common/request/dao/listen_dao.dart @@ -1,10 +1,18 @@ import 'package:wow_english/common/request/apis.dart'; import 'package:wow_english/common/request/request_client.dart'; +import 'package:wow_english/models/follow_read_entity.dart'; +import 'package:wow_english/models/listen_entity.dart'; class ListenDao { /// 磨耳朵 - static Future listen() async { - var data = await requestClient.get(Apis.ears); + static Future?> listen() async { + var data = await requestClient.get>(Apis.ears); + return data; + } + + ///视频跟读 + static Future?> followRead() async { + var data = await requestClient.get>(Apis.followRead); return data; } } \ No newline at end of file diff --git a/lib/common/widgets/ow_image_widget.dart b/lib/common/widgets/ow_image_widget.dart new file mode 100644 index 0000000..7b1bc74 --- /dev/null +++ b/lib/common/widgets/ow_image_widget.dart @@ -0,0 +1,32 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; + +class OwImageWidget extends StatelessWidget { + const OwImageWidget({super.key, this.width, this.height, required this.name, this.fit}); + final double? width; + final double? height; + final BoxFit? fit; + final String name; + + @override + Widget build(BuildContext context) { + if (name.isEmpty) { + return SizedBox( + height: height, + width: width, + ); + } + return name.contains('http')? + CachedNetworkImage( + imageUrl: name, + height: height, + width: width, + fit: fit, + ):Image.asset( + name, + height: height, + width: width, + fit: fit, + ); + } +} \ No newline at end of file diff --git a/lib/generated/json/base/json_convert_content.dart b/lib/generated/json/base/json_convert_content.dart index 1f66c90..46247dc 100644 --- a/lib/generated/json/base/json_convert_content.dart +++ b/lib/generated/json/base/json_convert_content.dart @@ -4,6 +4,7 @@ // This file is automatically generated. DO NOT EDIT, all your changes would be lost. import 'package:flutter/material.dart' show debugPrint; +import 'package:wow_english/models/follow_read_entity.dart'; import 'package:wow_english/models/course_entity.dart'; import 'package:wow_english/models/course_module_entity.dart'; import 'package:wow_english/models/listen_entity.dart'; @@ -15,6 +16,7 @@ typedef EnumConvertFunction = T Function(String value); class JsonConvert { static final Map convertFuncMap = { + (FollowReadEntity).toString(): FollowReadEntity.fromJson, (CourseEntity).toString(): CourseEntity.fromJson, (CourseCourseLessons).toString(): CourseCourseLessons.fromJson, (CourseModuleEntity).toString(): CourseModuleEntity.fromJson, @@ -98,6 +100,9 @@ List? convertListNotNull(dynamic value, {EnumConvertFunction? enumConvert} //list is returned by type static M? _getListChildType(List> data) { + if([] is M){ + return data.map((Map e) => FollowReadEntity.fromJson(e)).toList() as M; + } if([] is M){ return data.map((Map e) => CourseEntity.fromJson(e)).toList() as M; } diff --git a/lib/generated/json/follow_read_entity.g.dart b/lib/generated/json/follow_read_entity.g.dart new file mode 100644 index 0000000..cf03988 --- /dev/null +++ b/lib/generated/json/follow_read_entity.g.dart @@ -0,0 +1,67 @@ +import 'package:wow_english/generated/json/base/json_convert_content.dart'; +import 'package:wow_english/models/follow_read_entity.dart'; + +FollowReadEntity $FollowReadEntityFromJson(Map json) { + final FollowReadEntity followReadEntity = FollowReadEntity(); + final String? coverUrl = jsonConvert.convert(json['coverUrl']); + if (coverUrl != null) { + followReadEntity.coverUrl = coverUrl; + } + final String? createTime = jsonConvert.convert(json['createTime']); + if (createTime != null) { + followReadEntity.createTime = createTime; + } + final String? deleted = jsonConvert.convert(json['deleted']); + if (deleted != null) { + followReadEntity.deleted = deleted; + } + final String? id = jsonConvert.convert(json['id']); + if (id != null) { + followReadEntity.id = id; + } + final bool? lock = jsonConvert.convert(json['lock']); + if (lock != null) { + followReadEntity.lock = lock; + } + final String? modifyTime = jsonConvert.convert(json['modifyTime']); + if (modifyTime != null) { + followReadEntity.modifyTime = modifyTime; + } + final int? sortOrder = jsonConvert.convert(json['sortOrder']); + if (sortOrder != null) { + followReadEntity.sortOrder = sortOrder; + } + final int? star = jsonConvert.convert(json['star']); + if (star != null) { + followReadEntity.star = star; + } + final int? status = jsonConvert.convert(json['status']); + if (status != null) { + followReadEntity.status = status; + } + final String? title = jsonConvert.convert(json['title']); + if (title != null) { + followReadEntity.title = title; + } + final int? videoTotal = jsonConvert.convert(json['videoTotal']); + if (videoTotal != null) { + followReadEntity.videoTotal = videoTotal; + } + return followReadEntity; +} + +Map $FollowReadEntityToJson(FollowReadEntity entity) { + final Map data = {}; + data['coverUrl'] = entity.coverUrl; + data['createTime'] = entity.createTime; + data['deleted'] = entity.deleted; + data['id'] = entity.id; + data['lock'] = entity.lock; + data['modifyTime'] = entity.modifyTime; + data['sortOrder'] = entity.sortOrder; + data['star'] = entity.star; + data['status'] = entity.status; + data['title'] = entity.title; + data['videoTotal'] = entity.videoTotal; + return data; +} \ No newline at end of file diff --git a/lib/models/follow_read_entity.dart b/lib/models/follow_read_entity.dart new file mode 100644 index 0000000..ea9fa79 --- /dev/null +++ b/lib/models/follow_read_entity.dart @@ -0,0 +1,29 @@ +import 'package:wow_english/generated/json/base/json_field.dart'; +import 'package:wow_english/generated/json/follow_read_entity.g.dart'; +import 'dart:convert'; + +@JsonSerializable() +class FollowReadEntity { + String? coverUrl; + String? createTime; + String? deleted; + String? id; + bool? lock; + String? modifyTime; + int? sortOrder; + int? star; + int? status; + String? title; + int? videoTotal; + + FollowReadEntity(); + + factory FollowReadEntity.fromJson(Map json) => $FollowReadEntityFromJson(json); + + Map toJson() => $FollowReadEntityToJson(this); + + @override + String toString() { + return jsonEncode(this); + } +} \ No newline at end of file diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 760a3c5..05fe0d3 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/models/course_entity.dart'; @@ -75,15 +76,30 @@ class _HomePageView extends StatelessWidget { itemCount: bloc.modelData?.totalCourseLesson, scrollDirection: Axis.horizontal, itemBuilder: (BuildContext context, int index){ - String? title = bloc.modelData?.courseLessons?[index]?.name; CourseCourseLessons? data = bloc.modelData?.courseLessons?[index]; if (data?.courseType == 5) {//彩蛋 - return HomeBoundsItem( - imageUrl: data?.coverUrl, + return GestureDetector( + onTap: (){ + if (data!.lock!) { + return; + } + EasyLoading.showToast('点击事件'); + }, + child: HomeBoundsItem( + imageUrl: data?.coverUrl, + ), ); } else { - return HomeVideoItem( - lessons: data, + return GestureDetector( + onTap: () { + if (data!.lock!) { + return; + } + EasyLoading.showToast('点击事件'); + }, + child: HomeVideoItem( + lessons: data, + ), ); } }) diff --git a/lib/pages/home/widgets/home_bouns_item.dart b/lib/pages/home/widgets/home_bouns_item.dart index f805a1f..27fa3da 100644 --- a/lib/pages/home/widgets/home_bouns_item.dart +++ b/lib/pages/home/widgets/home_bouns_item.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:wow_english/common/widgets/ow_image_widget.dart'; class HomeBoundsItem extends StatelessWidget { const HomeBoundsItem({super.key, this.imageUrl}); @@ -11,7 +12,7 @@ class HomeBoundsItem extends StatelessWidget { return SizedBox( height: 207.h, width: 169.w, - child: Image.network(imageUrl??''), + child: OwImageWidget(name:imageUrl??''), ); } } \ No newline at end of file diff --git a/lib/pages/home/widgets/home_lesson_item_widget.dart b/lib/pages/home/widgets/home_lesson_item_widget.dart deleted file mode 100644 index 6ccb08f..0000000 --- a/lib/pages/home/widgets/home_lesson_item_widget.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; - -class HomeLessonItem extends StatelessWidget { - const HomeLessonItem({super.key}); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 200, - child: ListView.builder( - itemCount: 5, - scrollDirection: Axis.horizontal, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (BuildContext context,int index){ - return Padding( - padding: EdgeInsets.symmetric(horizontal: 4.w), - child: Image.network( - 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Faa1c2213-820a-4223-8757-5f8cee318a28%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1688713226&t=192b18a613683bcdc5bd76f65c9ff032', - width: 40, - fit: BoxFit.fitHeight, - ), - ); - }), - ); - } -} \ No newline at end of file diff --git a/lib/pages/home/widgets/home_tab_header_widget.dart b/lib/pages/home/widgets/home_tab_header_widget.dart index e7a9b1f..548dad5 100644 --- a/lib/pages/home/widgets/home_tab_header_widget.dart +++ b/lib/pages/home/widgets/home_tab_header_widget.dart @@ -117,14 +117,14 @@ class HomeTabHeaderWidget extends StatelessWidget { }, icon: Image.asset('listen'.assetPng) ), - IconButton( - onPressed: (){ - if(actionTap != null) { - actionTap!(HeaderActionType.shop); - } - }, - icon: Image.asset('shop'.assetPng) - ), + // IconButton( + // onPressed: (){ + // if(actionTap != null) { + // actionTap!(HeaderActionType.shop); + // } + // }, + // icon: Image.asset('shop'.assetPng) + // ), ScreenUtil().bottomBarHeight.horizontalSpace, ], ), diff --git a/lib/pages/home/widgets/home_vidoe_item.dart b/lib/pages/home/widgets/home_vidoe_item.dart index a9ec31d..0df7216 100644 --- a/lib/pages/home/widgets/home_vidoe_item.dart +++ b/lib/pages/home/widgets/home_vidoe_item.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/ow_image_widget.dart'; import 'package:wow_english/models/course_entity.dart'; class HomeVideoItem extends StatelessWidget { @@ -16,9 +17,9 @@ class HomeVideoItem extends StatelessWidget { width: 165.w, padding: EdgeInsets.symmetric(horizontal: 16.w,vertical: 24.h), decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('gendubeij'.assetPng), - ), + image: DecorationImage( + image: AssetImage('gendubeij'.assetPng), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -26,17 +27,17 @@ class HomeVideoItem extends StatelessWidget { Expanded( child: Container( decoration: BoxDecoration( - border: Border.all( - width: 2, - color: const Color(0xFF140C10), + border: Border.all( + width: 2, + color: const Color(0xFF140C10), + ), + borderRadius: BorderRadius.circular(6) ), - borderRadius: BorderRadius.circular(6) - ), - child: Image.network( - lessons?.coverUrl??'', + child: OwImageWidget( + name: lessons?.coverUrl??'', fit: BoxFit.fill, ), - )), + )), 24.verticalSpace, Container( decoration: BoxDecoration( diff --git a/lib/pages/lessons/lesson_page.dart b/lib/pages/lessons/lesson_page.dart index 24302f3..861f1f4 100644 --- a/lib/pages/lessons/lesson_page.dart +++ b/lib/pages/lessons/lesson_page.dart @@ -52,15 +52,15 @@ class _LessonPageView extends StatelessWidget { width: 43, ) ), - actions: [ - IconButton( - icon: Image.asset('shop'.assetPng), - color: Colors.white, - onPressed: () { - EasyLoading.showToast('购买'); - }, - ) - ], + // actions: [ + // IconButton( + // icon: Image.asset('shop'.assetPng), + // color: Colors.white, + // onPressed: () { + // EasyLoading.showToast('购买'); + // }, + // ) + // ], ), body: _lessViewWidget(), ), @@ -88,7 +88,7 @@ class _LessonPageView extends StatelessWidget { 32.verticalSpace, SizedBox( height: 32.h, - width: double.infinity, + width: 66.w * bloc.listData.length, child: ListView.builder( itemCount: bloc.listData.length, scrollDirection: Axis.horizontal, @@ -109,6 +109,7 @@ class _LessonPageView extends StatelessWidget { height: bloc.currentPageIndex == index ? 32:20, decoration: BoxDecoration( color: bloc.currentPageIndex == index ? Colors.red:Colors.white, + borderRadius: BorderRadius.circular(5.r), border: Border.all( width: 0.5, color: Colors.black, diff --git a/lib/pages/lessons/widgets/lesson_item_widget.dart b/lib/pages/lessons/widgets/lesson_item_widget.dart index 142ad4e..2339bfc 100644 --- a/lib/pages/lessons/widgets/lesson_item_widget.dart +++ b/lib/pages/lessons/widgets/lesson_item_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/ow_image_widget.dart'; import 'package:wow_english/models/course_module_entity.dart'; class LessonItemWidget extends StatelessWidget { @@ -30,8 +31,8 @@ class LessonItemWidget extends StatelessWidget { image: AssetImage('gendubeij'.assetPng) ) ), - child: Image.network( - model?.picUrl??'', + child: OwImageWidget( + name: model?.picUrl??'', ), ); } @@ -40,29 +41,48 @@ class LessonItemWidget extends StatelessWidget { return Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('gendubeij'.assetPng) - ) + image: DecorationImage( + image: AssetImage( + 'gendubeij'.assetPng, + ), + fit: BoxFit.fill + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: Image.network( - model?.picUrl??'', - fit: BoxFit.contain + child: OwImageWidget( + name: model?.picUrl??'', ), ), 10.verticalSpace, Container( - color: Colors.red, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(6.r), + border: Border.all( + color: const Color(0xFF333333), + width: 1.0 + ) + ), padding: EdgeInsets.symmetric(horizontal: 10.w), child: Column( children: [ - Text(model?.name??''), + Text( + model?.name??'', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp + ), + ), Text( model?.des??'', maxLines: 1, + style: TextStyle( + color: Colors.white, + fontSize: 12.sp + ), ) ], ), diff --git a/lib/pages/listen/bloc/listen_bloc.dart b/lib/pages/listen/bloc/listen_bloc.dart index 4a23b46..035f753 100644 --- a/lib/pages/listen/bloc/listen_bloc.dart +++ b/lib/pages/listen/bloc/listen_bloc.dart @@ -13,8 +13,8 @@ part 'listen_state.dart'; class ListenBloc extends Bloc { - final List _listData = []; - List get listData => _listData; + List? _listData; + List? get listData => _listData; ListenBloc() : super(ListenInitial()) { on((event, emit) { @@ -25,13 +25,7 @@ class ListenBloc extends Bloc { Future requestData() async { try { await loading(() async { - List list = await ListenDao.listen()??[]; - if (list.isNotEmpty) { - for (String jsonStr in list) { - ListenEntity? data = ListenEntity.fromJson(jsonDecode(jsonStr)); - _listData.add(data); - } - } + _listData = await ListenDao.listen()??[]; emit(RequestListenDataState()); }); } catch (e) { diff --git a/lib/pages/listen/listen_page.dart b/lib/pages/listen/listen_page.dart index d252c00..73c1306 100644 --- a/lib/pages/listen/listen_page.dart +++ b/lib/pages/listen/listen_page.dart @@ -40,12 +40,12 @@ class _ListenPageView extends StatelessWidget { builder: (context, state) { final bloc = BlocProvider.of(context); return ListView.builder( - itemCount: bloc.listData.length, + itemCount: bloc.listData?.length, scrollDirection: Axis.horizontal, padding: EdgeInsets.symmetric(horizontal: 30.w,vertical: 36.h), itemBuilder: (BuildContext context,int index){ return ListenItemWidget( - isLock: (index > 5), + entity: bloc.listData?[index], clickEvent: (){ Navigator.of(context).pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/7194236f31b2e1e3da0fe06cfed4ba2b.mp4'}); }); diff --git a/lib/pages/listen/widgets/listen_item_widget.dart b/lib/pages/listen/widgets/listen_item_widget.dart index 374fbf6..4bc4261 100644 --- a/lib/pages/listen/widgets/listen_item_widget.dart +++ b/lib/pages/listen/widgets/listen_item_widget.dart @@ -1,13 +1,16 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/ow_image_widget.dart'; +import 'package:wow_english/models/listen_entity.dart'; class ListenItemWidget extends StatelessWidget { - const ListenItemWidget({super.key, this.isLock = false, required this.clickEvent}); + const ListenItemWidget({super.key, required this.clickEvent, this.entity}); final Function() clickEvent; - final bool isLock; + final ListenEntity? entity; @override Widget build(BuildContext context) { @@ -17,23 +20,24 @@ class ListenItemWidget extends StatelessWidget { children: [ GestureDetector( onTap: () { - if (!isLock) { - clickEvent(); + if (entity?.lock??false) { + return; } + clickEvent?.call(); }, child: ClipRRect( borderRadius:BorderRadius.circular(90.r), child: Stack( alignment:Alignment.center, children: [ - Image.network( - 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Faa1c2213-820a-4223-8757-5f8cee318a28%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1688713226&t=192b18a613683bcdc5bd76f65c9ff032', - height: 180.h, + OwImageWidget( width: 180.h, + height: 180.h, fit: BoxFit.fill, + name:entity?.coverUrl??'', ), Visibility( - visible: isLock, + visible: entity?.lock??false, child: Container( height: 180.h, width: 180.h, @@ -41,7 +45,7 @@ class ListenItemWidget extends StatelessWidget { ), ), Visibility( - visible: isLock, + visible: entity?.lock??false, child: Image.asset( 'listen_lock'.assetPng, height: 36.h, @@ -66,7 +70,7 @@ class ListenItemWidget extends StatelessWidget { ), alignment: Alignment.center, child: Text( - 'listen title', + entity?.title??'', style: TextStyle( fontSize: 20.sp, color: const Color(0xFF333333) diff --git a/lib/pages/repeatafter/bloc/repeat_after_bloc.dart b/lib/pages/repeatafter/bloc/repeat_after_bloc.dart index 1d42860..f2dfb14 100644 --- a/lib/pages/repeatafter/bloc/repeat_after_bloc.dart +++ b/lib/pages/repeatafter/bloc/repeat_after_bloc.dart @@ -1,11 +1,19 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:wow_english/common/request/dao/listen_dao.dart'; +import 'package:wow_english/common/request/exception.dart'; +import 'package:wow_english/models/follow_read_entity.dart'; +import 'package:wow_english/utils/loading.dart'; part 'repeat_after_event.dart'; part 'repeat_after_state.dart'; class RepeatAfterBloc extends Bloc { + + List _listData = []; + List get listData => _listData; + RepeatAfterBloc() : super(RepeatAfterInitial()) { on((event, emit) { // TODO: implement event handler @@ -14,10 +22,15 @@ class RepeatAfterBloc extends Bloc { Future requestData() async { - EasyLoading.show(); - Future.delayed(const Duration(milliseconds: 2000),(){ - EasyLoading.dismiss(); - emit(RequestDataState()); - }); + try { + await loading(() async { + _listData = await ListenDao.followRead()??[]; + emit(RequestDataState()); + }); + } catch (e) { + if (e is ApiException) { + EasyLoading.showToast(e.message??'请求失败,请检查网络连接'); + } + } } } diff --git a/lib/pages/repeatafter/repeat_after_page.dart b/lib/pages/repeatafter/repeat_after_page.dart index 818d290..742a835 100644 --- a/lib/pages/repeatafter/repeat_after_page.dart +++ b/lib/pages/repeatafter/repeat_after_page.dart @@ -1,9 +1,8 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; +import 'package:wow_english/models/follow_read_entity.dart'; import 'package:wow_english/pages/repeatafter/widgets/repeat_after_item.dart'; import 'bloc/repeat_after_bloc.dart'; @@ -35,6 +34,7 @@ class _RepeatAfterPageView extends StatelessWidget { Widget _repeatAfterView() => BlocBuilder( builder: (context, state) { + final bloc = BlocProvider.of(context); return Scaffold( appBar: const WEAppBar( titleText: '视频跟读', @@ -44,16 +44,15 @@ class _RepeatAfterPageView extends StatelessWidget { child: Container( alignment: Alignment.center, child: ListView.builder( - itemCount: 10, + itemCount: bloc.listData.length, scrollDirection: Axis.horizontal, itemBuilder: (BuildContext context,int index){ - bool unLock = index%3==0; + FollowReadEntity? entity = bloc.listData[index]; return RepeatAfterItem( - unLock: unLock, tapEvent: () { }, - starNumber: !unLock?0:Random().nextInt(5) + entity: entity, ); }), ), diff --git a/lib/pages/repeatafter/widgets/repeat_after_item.dart b/lib/pages/repeatafter/widgets/repeat_after_item.dart index c898b48..39f78ef 100644 --- a/lib/pages/repeatafter/widgets/repeat_after_item.dart +++ b/lib/pages/repeatafter/widgets/repeat_after_item.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/ow_image_widget.dart'; +import 'package:wow_english/models/follow_read_entity.dart'; class RepeatAfterItem extends StatelessWidget { - const RepeatAfterItem({super.key, required this.starNumber, required this.unLock, required this.tapEvent}); - //分数 - final int starNumber; - //是否解锁 - final bool unLock; + const RepeatAfterItem({super.key, required this.tapEvent, this.entity}); + + final FollowReadEntity? entity; final Function() tapEvent; @@ -19,8 +19,10 @@ class RepeatAfterItem extends StatelessWidget { ), child: GestureDetector( onTap: (){ - if(unLock) { - tapEvent(); + if (entity != null) { + if (entity?.lock??false) { + tapEvent(); + } } }, child: Stack( @@ -50,8 +52,8 @@ class RepeatAfterItem extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.network( - 'https://img.liblibai.com/web/648331d033b41.png?image_process=format,webp&x-oss-process=image/resize,w_2980,m_lfit/format,webp', + OwImageWidget( + name:entity?.coverUrl??'', height: 100.h, width: 140.w, fit: BoxFit.fitWidth, @@ -60,27 +62,27 @@ class RepeatAfterItem extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Image.asset( - starNumber >= 1 ? 'star_light'.assetPng:'star_dark'.assetPng, + (entity?.star??0) >= 1 ? 'star_light'.assetPng:'star_dark'.assetPng, width: 23.w, height: 21.h, ), Image.asset( - starNumber >= 2 ? 'star_light'.assetPng:'star_dark'.assetPng, + (entity?.star??0) >= 2 ? 'star_light'.assetPng:'star_dark'.assetPng, width: 23.w, height: 21.h, ), Image.asset( - starNumber >= 3 ? 'star_light'.assetPng:'star_dark'.assetPng, + (entity?.star??0) >= 3 ? 'star_light'.assetPng:'star_dark'.assetPng, width: 23.w, height: 21.h, ), Image.asset( - starNumber >= 4 ? 'star_light'.assetPng:'star_dark'.assetPng, + (entity?.star??0) >= 4 ? 'star_light'.assetPng:'star_dark'.assetPng, width: 23.w, height: 21.h, ), Image.asset( - starNumber >= 5 ? 'star_light'.assetPng:'star_dark'.assetPng, + (entity?.star??0) >= 5 ? 'star_light'.assetPng:'star_dark'.assetPng, width: 23.w, height: 21.h, ), @@ -99,7 +101,7 @@ class RepeatAfterItem extends StatelessWidget { ), alignment: Alignment.center, child: Text( - 'video title', + entity?.title??'', style: TextStyle( fontSize: 16.sp, color: const Color(0xFF333333) @@ -112,8 +114,8 @@ class RepeatAfterItem extends StatelessWidget { } Widget _lockWidget() { - return Offstage( - offstage: unLock, + return Visibility( + visible: entity?.lock??false, child: Container( width: 162.w, height: 235.h, -- libgit2 0.22.2