You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

35 lines
1.6 KiB

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<String, dynamic>?)?['translationId'] as String?;
if (!Get.isRegistered<TranslationController>()) {
Get.put<TranslationController>(TranslationController(), permanent: true);
return;
}
// 复用的是已有实例——大概率是上一次「后台继续」留下来的。如果这次进来
// 要的模式跟它当前跑的不一样,得先切过去,不然用户点的明明是「同声传译」,
// 看到的却还是上一个没结束的「通话翻译」界面。
if (requestedMode != null) {
final controller = Get.find<TranslationController>();
if (controller.currentMode.value != requestedMode) {
unawaited(controller.changeTranslationMode(requestedMode));
}
}
}
}