import 'dart:async'; import 'package:flutter/material.dart'; import 'package:electronic_assistant/base/base_controller.dart'; import 'package:electronic_assistant/module/talk/mindmap/mind_util.dart'; import 'package:electronic_assistant/resource/assets.gen.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../../data/bean/talks.dart'; import '../../../data/bean/template_bean.dart'; import '../controller.dart'; class MindMapController extends BaseController { final String? talkId; MindMapController(this.talkId); TalkController get talkController => Get.find(tag: talkId); List? get templateList => talkController.templateList.value; int? get templateSelectId => talkController.templateSelectId.value; RxBool get isShowMindFullScreen => talkController.isShowMindFullScreen; StreamSubscription? _talkSummaryListener; StreamSubscription? _talkStatusListener; StreamSubscription? _talkBeanListener; GlobalKey repaintKey = GlobalKey(); bool _isWebViewLoaded = false; @override void onReady() async { super.onReady(); _talkBeanListener = talkController.talkBean.listen((bean) { _dealTalkSummaryUpdate(bean?.summary.value); }); _talkStatusListener = talkController.talkBean.value?.status.listen((status) { if (status == TalkStatus.analysisSuccess) { _dealTalkSummaryUpdate(talkController.talkBean.value?.summary.value); } }); _dealTalkSummaryUpdate(talkController.talkBean.value?.summary.value); _talkSummaryListener = talkController.talkBean.value?.summary.listen((summary) { _dealTalkSummaryUpdate(summary); }); } void _loadWebMindData(String summary) { talkController.webViewController.loadFlutterAsset(Assets.html.index); talkController.webViewController.setNavigationDelegate( NavigationDelegate( onPageFinished: (String url) async { _isWebViewLoaded = true; _callUpdateMind(summary); }, onNavigationRequest: (NavigationRequest request) { return NavigationDecision.navigate; }, ), ); } void _callUpdateMind(String summary) { talkController.webViewController .callHandler(MindUtil.functionToJsUpdateMind, args: [summary], handler: (value) { debugPrint('_dealTalkSummaryUpdate mindMap update success: $value'); }); } void _updateMindData(String summary) { if (_isWebViewLoaded) { _callUpdateMind(summary); } else { _loadWebMindData(summary); } } void _dealTalkSummaryUpdate(String? summary) { if (summary == null || summary.isEmpty || talkController.talkBean.value?.status.value != TalkStatus.analysisSuccess) { return; } _updateMindData(summary); } void fullScreenClick() { talkController.isShowMindFullScreen.value = true; } void exitFullScreenClick() { talkController.onExitMindFullScreen(); } void selectTemplate(TemplateBean bean) { talkController.selectTemplate(bean); } @override void onClose() { super.onClose(); _talkBeanListener?.cancel(); _talkStatusListener?.cancel(); _talkSummaryListener?.cancel(); } }