Created the upload status service to keep track of currently being uploaded files

This commit is contained in:
Mariano Uvalle 2019-04-11 00:17:11 -05:00
parent 52623c1511
commit f503cce0e3
4 changed files with 98 additions and 3 deletions

View file

@ -10,6 +10,7 @@ import '../models/user_model.dart';
import '../resources/firestore_provider.dart';
import '../resources/firebase_storage_provider.dart';
import '../services/auth_service.dart';
import '../services/upload_status_service.dart';
import '../utils.dart'
show kTaskListPriorityTransforemer, getImageThumbnailPath;

View file

@ -107,8 +107,10 @@ class HomeBloc {
_searchBoxText.add(newText);
}
void dispose() {
void dispose() async {
await _searchBoxText.drain();
_searchBoxText.close();
await _tasks.drain();
_tasks.close();
}
}

View file

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../utils.dart' show getImageThumbnailPath;
@ -165,8 +167,7 @@ class _EventScreenState extends State<EventScreen>
Widget buildAddPictureButton() {
return GradientTouchableContainer(
radius: 8,
onTap: () =>
Navigator.of(context).pushNamed('newImage/${bloc.eventName}'),
onTap: onAddPicturePressed,
child: Icon(
Icons.camera_alt,
color: Colors.white,
@ -191,6 +192,11 @@ class _EventScreenState extends State<EventScreen>
);
}
Future<void> onAddPicturePressed() async {
await Navigator.of(context).pushNamed('newImage/${bloc.eventName}');
print('popped the pictures');
}
void dispose() {
bloc.dispose();
super.dispose();

View file

@ -0,0 +1,86 @@
import 'dart:async';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:rxdart/rxdart.dart';
/// A service that maintains a record of the upload operations made to
/// the firebase storage bucket.
class _UploadStatusService {
/// A subject of the current status of uploads.
final _status = BehaviorSubject<UploadStatus>();
/// A map that contains the information about all the current upload tasks.
Map<StorageUploadTask, List<int>> tasksData =
<StorageUploadTask, List<int>>{};
/// An observable of the status for all current upload tasks.
Observable<UploadStatus> get status => _status.stream;
/// Adds a new upload task to be tracked.
///
/// The task gets automatically removed when done.
void addNewUpload(StorageUploadTask task) async {
final initialSnap = task.lastSnapshot;
// Initialize the map entry with the initial values.
tasksData[task] = [
initialSnap.bytesTransferred,
initialSnap.totalByteCount,
];
task.events.listen(
(StorageTaskEvent event) {
// Update the map with the current values.
final snap = event.snapshot;
tasksData[task] = [
snap.bytesTransferred,
snap.totalByteCount,
];
_sendUpdate();
},
);
await task.onComplete;
tasksData.remove(task);
}
/// Updates the _status subject with the most current data.
void _sendUpdate() {
int totalBytes = 0, bytestTransferred = 0;
double percentage = 0.0;
tasksData.forEach(
(_, data) {
bytestTransferred += data[0];
totalBytes += data[1];
},
);
if (bytestTransferred != 0) {
percentage = totalBytes / bytestTransferred;
}
_status.sink.add(UploadStatus(
percentage: percentage,
numberOfFiles: tasksData.length,
));
}
dispose() async {
await _status.drain();
_status.close();
}
}
/// The status of an upload.
class UploadStatus {
/// Percentage of the upload.
final double percentage;
/// Number of files being uploaded.
///
/// It can be 0 if nothing is currently being uploaded.
final int numberOfFiles;
/// Creates an [UploadStatus] instance.
UploadStatus({
this.percentage,
this.numberOfFiles,
});
}
final uploadStatusService = _UploadStatusService();