import 'dart:async'; import 'package:get/get.dart'; import '../controllers/translation_controller.dart'; /// 主翻译页面依赖绑定。 /// /// 注册成 permanent 单例(而不是每次进页面都新建一个):同声传译/面对面/ /// 通话/多媒体四种模式共用同一个 controller 实例,靠 `changeTranslationMode` /// 在原地切换(模式选择器就是这么切的),不是每种模式各一个实例,所以不用 /// 分 tag——通话翻译退出时选「后台继续」,页面 pop 了但这个 controller 不能 /// 被销毁,否则识别/AST 桥接全跟着断。真正结束时由页面显式 /// `Get.delete(force: true)` 释放,其它模式退出也走这条路,效果和以前 /// 「进页面新建、退出销毁」一致。 class TranslationBinding implements Bindings { @override void dependencies() { final requestedMode = (Get.arguments as Map?)?['translationId'] as String?; if (!Get.isRegistered()) { Get.put(TranslationController(), permanent: true); return; } // 复用的是已有实例——大概率是上一次「后台继续」留下来的。如果这次进来 // 要的模式跟它当前跑的不一样,得先切过去,不然用户点的明明是「同声传译」, // 看到的却还是上一个没结束的「通话翻译」界面。 if (requestedMode != null) { final controller = Get.find(); if (controller.currentMode.value != requestedMode) { unawaited(controller.changeTranslationMode(requestedMode)); } } } }