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