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
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));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|