- 标注:AI 预标注直写 labels_json(去候选确认两阶段);重叠去重(minIoU);全量标注按钮 - 训练:脚本迁移入 server/training/(Go 化 prepare_yolo/analyze_rfdetr,保留 train_server.py);tflite 产物自检并入训练流程(check_tflite) - 数据目录/权重不进 git;.gitignore 迁移至仓库根
50 lines
1.5 KiB
Dart
50 lines
1.5 KiB
Dart
import 'package:flutter/services.dart';
|
||
|
||
/// 安装进度事件(原生 PackageInstaller 会话回调经 EventChannel 回传)
|
||
class InstallEvent {
|
||
/// progress / finished / failed
|
||
final String event;
|
||
|
||
/// event=progress 时的安装进度 0-100
|
||
final int progress;
|
||
|
||
/// event=finished 时是否安装成功
|
||
final bool? success;
|
||
|
||
/// event=failed 时的错误描述
|
||
final String? error;
|
||
|
||
const InstallEvent({
|
||
required this.event,
|
||
this.progress = 0,
|
||
this.success,
|
||
this.error,
|
||
});
|
||
}
|
||
|
||
/// App 内安装 APK:原生侧 PackageInstaller 会话安装(InstallerChannel.kt)
|
||
class ApkInstaller {
|
||
static const _method = MethodChannel('observer/installer');
|
||
static const _progress = EventChannel('observer/installer/progress');
|
||
|
||
/// 提交安装。返回 installing(已进入安装流程)/ permission_required
|
||
/// (未允许「安装未知应用」,原生侧已拉起系统设置页)。
|
||
static Future<String> install(String path) =>
|
||
_method.invokeMethod<String>('install', {'path': path}).then(
|
||
(v) => v ?? 'installing',
|
||
);
|
||
|
||
/// 安装进度流:progress(0-100) → finished(success) / failed(error)
|
||
static Stream<InstallEvent> progress() {
|
||
return _progress.receiveBroadcastStream().map((e) {
|
||
final m = e as Map;
|
||
return InstallEvent(
|
||
event: m['event'] as String? ?? '',
|
||
progress: (m['progress'] as num?)?.toInt() ?? 0,
|
||
success: m['success'] as bool?,
|
||
error: m['error'] as String?,
|
||
);
|
||
});
|
||
}
|
||
}
|