installWithProgress method
Installs the model with progress tracking
Returns a stream of progress percentages (0-100)
Note: Some sources may not support true progress:
- AssetSource: simulates progress (copy is instant)
- BundledSource: returns 100 immediately (no download)
- FileSource: returns 100 immediately (just registration)
Example:
await for (final progress in handler.installWithProgress(source)) {
print('Progress: $progress%');
}
Implementation
@override
Stream<int> installWithProgress(ModelSource source) async* {
if (source is! FileSource) {
throw ArgumentError('FileSourceHandler only supports FileSource');
}
// Verify external file exists
final exists = await fileSystem.fileExists(source.path);
if (!exists) {
throw Exception('External file does not exist: ${source.path}');
}
// Generate unique filename for tracking
final filename = path.basename(source.path);
// Register external file in file system
await fileSystem.registerExternalFile(filename, source.path);
// Protect file from cleanup operations
await protectedFiles.protect(filename);
// Register external path mapping
await protectedFiles.registerExternalPath(filename, source.path);
// External files are immediately available, report 100% after registration
yield 100;
// Get file size for metadata
final sizeBytes = await fileSystem.getFileSize(source.path);
// Save metadata to repository
final modelInfo = ModelInfo(
id: filename,
source: source,
installedAt: DateTime.now(),
sizeBytes: sizeBytes,
type: ModelType.inference,
hasLoraWeights: false,
);
await repository.saveModel(modelInfo);
}