import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/common/request/dao/lesson_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/common/request/dao/listen_dao.dart'; import 'package:wow_english/models/course_process_entity.dart'; import 'package:wow_english/utils/loading.dart'; import 'package:wow_english/utils/toast_util.dart'; import '../../../models/course_section_entity.dart'; import '../../../models/course_unit_entity.dart'; import '../../../utils/list_ext.dart'; part 'section_event.dart'; part 'section_state.dart'; class SectionBloc extends Bloc { PageController _pageController; PageController get pageController => _pageController; ///当前页索引 int _currentPage = 0; int get currentPage => _currentPage; ScrollController _listController; ScrollController get listController => _listController; CourseUnitEntity _courseUnitEntity; CourseUnitEntity get courseUnitEntity => _courseUnitEntity; CourseUnitDetail _courseUnitDetail; CourseUnitDetail get courseUnitDetail => _courseUnitDetail; List? _courseSectionDatas; List? get courseSectionDatas => _courseSectionDatas; CourseProcessEntity? _processEntity; CourseProcessEntity? get processEntity => _processEntity; SectionBloc(this._courseUnitEntity, this._courseUnitDetail, this._pageController, this._listController) : super(LessonInitial()) { on(_requestData); on(_requestExitClass); on(_requestEndClass); on(_requestEnterClass); on(_requestVideoLesson); on(_pageControllerChange); } void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { _courseSectionDatas = await LessonDao.courseSection(courseUnitId: _courseUnitDetail.id!); emitter(LessonDataLoadState()); }); } catch (e) { if (e is ApiException) { showToast(e.message.toString()); } } } void _requestVideoLesson(RequestVideoLessonEvent event, Emitter emitter) async { try { await loading(() async { _processEntity = await ListenDao.process(event.courseLessonId); emitter(RequestVideoLessonState(event.courseLessonId,event.courseType)); }); } catch (e) { if (e is ApiException) { showToast(e.message??'请求失败,请检查网络连接'); } } } void _requestEnterClass(RequestEnterClassEvent event,Emitter emitter) async { try { await loading(() async { await ListenDao.enterClass(event.courseLessonId); emitter(RequestEnterClassState(event.courseLessonId,event.courseType)); }); } catch (e) { if (e is ApiException) { showToast(e.message??'请求失败,请检查网络连接'); } } } void _requestExitClass(RequestExitClassEvent event,Emitter emitter) async { await ListenDao.exitClass(event.courseLessonId,event.currentStep); } void _requestEndClass(RequestEndClassEvent event,Emitter emitter) async { final obj = await ListenDao.endClass(event.courseLessonId,event.currentStep); if (event.autoNextSection) { final nextCourseSection = getNextCourseSectionBySort(int.parse(event.courseLessonId)); ///进入课堂 add(RequestEnterClassEvent(nextCourseSection!.id.toString() ?? '', nextCourseSection.courseType)); } } void _pageControllerChange(CurrentUnitIndexChangeEvent event, Emitter emitter) async { _currentPage = event.unitIndex; emitter(CurrentPageIndexState()); } // 未锁定的页数 int unlockPageCount() { return _courseUnitEntity.courseUnitVOList?.indexWhereOrNull((element) => element.lock == true) ?? 1; } CourseSectionEntity? getNextCourseSectionBySort(int courseLessonId) { final curCourseSectionEntity = _courseSectionDatas?.firstWhere((element) => element.id == courseLessonId); final curSort = curCourseSectionEntity?.sortOrder ?? 0; CourseSectionEntity? nextCourseSectionEntity = _courseSectionDatas?.firstWhere((element) => element.sortOrder == curSort + 1); if (nextCourseSectionEntity != null) { return nextCourseSectionEntity; } else { ///跨unit选lesson final curCourseUnitDetail = _courseUnitEntity.courseUnitVOList?.firstWhere((element) => element.id == curCourseSectionEntity?.courseUnitId); if (curCourseUnitDetail != null) { final nextCourseUnitDetail = _courseUnitEntity.courseUnitVOList?.firstWhere((element) => element.sortOrder == 0); if (nextCourseUnitDetail != null) { ///pageView翻页了,可能需要预加载 todo return null; } else { ///最后一个unit了 return null; } } else { ///找不到对应的unitDetail,理论上不可能 return null; } } } }