Blame view

lib/pages/practice/bloc/topic_picture_bloc.dart 4.13 KB
2eb67dd4   liangchengyou   feat:调整代码
1
  import 'package:audioplayers/audioplayers.dart';
688b7b5c   liangchengyou   feat:更新文件结构
2
  import 'package:flutter/cupertino.dart';
2eb67dd4   liangchengyou   feat:调整代码
3
4
  import 'package:flutter/foundation.dart';
  import 'package:flutter/services.dart';
688b7b5c   liangchengyou   feat:更新文件结构
5
  import 'package:flutter_bloc/flutter_bloc.dart';
2eb67dd4   liangchengyou   feat:调整代码
6
7
8
9
10
  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/course_process_entity.dart';
  import 'package:wow_english/utils/loading.dart';
7652f701   liangchengyou   feat:课程购买UI逻辑
11
12
  
  part 'topic_picture_event.dart';
688b7b5c   liangchengyou   feat:更新文件结构
13
  part 'topic_picture_state.dart';
7652f701   liangchengyou   feat:课程购买UI逻辑
14
15
  
  class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> {
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
16
17
18
19
20
21
22
  
    final PageController pageController;
  
    final int modelCount;
  
    int _currentPage = 0;
  
2eb67dd4   liangchengyou   feat:调整代码
23
24
25
26
27
28
29
30
    int _selectItem = -1;
  
    CourseProcessEntity? _entity;
  
    ///正在评测
    bool _isVoicing = false;
  
    CourseProcessEntity? get entity => _entity;
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
31
32
33
34
35
  
    int get currentPage => _currentPage + 1;
  
    int get selectItem => _selectItem;
  
2eb67dd4   liangchengyou   feat:调整代码
36
37
38
39
40
41
    bool get isVoicing => _isVoicing;
  
    var messageChannel = const BasicMessageChannel('com.owEnglish.voiceXs.BasicMessageChannel', StandardMessageCodec());
  
    final audioPlayer = AudioPlayer();
  
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
42
43
    TopicPictureBloc(this.pageController, this.modelCount) : super(TopicPictureInitial()) {
      on<CurrentPageIndexChangeEvent>(_pageControllerChange);
2eb67dd4   liangchengyou   feat:调整代码
44
45
      on<InitMessageChannelEvent>(_initMessageChannelCall);
      on<RequestDataEvent>(_requestData);
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
46
      on<SelectItemEvent>(_selectItemLoad);
2eb67dd4   liangchengyou   feat:调整代码
47
48
49
50
51
      on<VoiceXsTestEvent>(_voiceXsTest);
      on<VoiceResultEvent>(_voiceResult);
      on<TopicPictureEvent>((event, emit) {
  
      });
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
52
53
54
55
56
    }
  
    @override
    Future<void> close() {
      pageController.dispose();
2eb67dd4   liangchengyou   feat:调整代码
57
      audioPlayer.dispose();
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
58
59
60
      return super.close();
    }
  
2eb67dd4   liangchengyou   feat:调整代码
61
62
63
64
65
66
67
68
69
70
71
72
73
    void _requestData(RequestDataEvent event,Emitter<TopicPictureState> emitter) async {
      try {
        await loading(() async {
          _entity = await ListenDao.process('8');
          emitter(RequestDataState());
        });
      } catch (e) {
        if (e is ApiException) {
          EasyLoading.showToast(e.message??'请求失败,请检查网络连接');
        }
      }
    }
  
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
74
75
    void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter<TopicPictureState> emitter) async {
      _currentPage = event.pageIndex;
2eb67dd4   liangchengyou   feat:调整代码
76
77
78
79
80
81
82
83
84
85
86
      final topics = _entity?.topics?[_currentPage];
      if (topics?.type == 1 || topics?.type == 2) {
        if (topics?.audioUrl != null) {
          final urlStr = topics?.audioUrl??'';
          if (urlStr.isNotEmpty) {
            audioPlayer.play(UrlSource(urlStr));
          }
        }
      } else {
        audioPlayer.stop();
      }
624214d0   liangchengyou   feat:看题选字/选图UI和部分逻辑
87
88
89
90
91
92
      emitter(CurrentPageIndexState());
    }
  
    void _selectItemLoad(SelectItemEvent event,Emitter<TopicPictureState> emitter) async {
      _selectItem = event.selectIndex;
      emitter(SelectItemChangeState());
7652f701   liangchengyou   feat:课程购买UI逻辑
93
    }
2eb67dd4   liangchengyou   feat:调整代码
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  
    ///messageChannel回调
    Future messageResultHandler(message,Emitter<TopicPictureState> emitter) async {
       EasyLoading.dismiss();
      final Map args = message as Map;
      final result = args['result'] as String;
      if (result == '1') {
        final overall = args['overall'].toString();
        EasyLoading.showToast('测评成功,分数是$overall',duration: const Duration(seconds: 10));
      } else {
        EasyLoading.showToast('测评失败',duration: const Duration(seconds: 10));
      }
      if (kDebugMode) {
        print('是否被移除>>>>>$emitter');
      }
      _isVoicing = false;
    }
  
    Future _initMessageChannelCall(InitMessageChannelEvent event,Emitter<TopicPictureState> emitter) async {
      messageChannel.setMessageHandler((message) =>
          messageResultHandler(message, emitter)
      );
  
      audioPlayer.onPlayerStateChanged.listen((event) {
        if (event == PlayerState.stopped) {
          if (kDebugMode) {
            print('播放结束');
          }
        }
      });
    }
  
    void _voiceXsTest(VoiceXsTestEvent event,Emitter<TopicPictureState> emitter) async {
      EasyLoading.show(status: '录音中....');
      messageChannel.send({'word':event.testWord,'type':event.type,'userId':event.userId.toString()});
      _isVoicing = true;
      emitter(VoiceXsTestState());
    }
  
    void _voiceResult(VoiceResultEvent event,Emitter<TopicPictureState> emitter) async {
      _isVoicing = false;
      emitter(VoiceXsTestState());
    }
7652f701   liangchengyou   feat:课程购买UI逻辑
137
  }