sync_indicator.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/event_bus.dart';
  4. import 'package:photos/events/photo_upload_event.dart';
  5. import 'package:pull_to_refresh/pull_to_refresh.dart';
  6. class SyncIndicator extends StatefulWidget {
  7. final RefreshController refreshController;
  8. const SyncIndicator(this.refreshController, {Key key}) : super(key: key);
  9. @override
  10. _SyncIndicatorState createState() => _SyncIndicatorState();
  11. }
  12. class _SyncIndicatorState extends State<SyncIndicator> {
  13. PhotoUploadEvent _event;
  14. StreamSubscription<PhotoUploadEvent> _subscription;
  15. @override
  16. void initState() {
  17. _subscription = Bus.instance.on<PhotoUploadEvent>().listen((event) {
  18. setState(() {
  19. _event = event;
  20. });
  21. });
  22. super.initState();
  23. }
  24. @override
  25. void dispose() {
  26. _subscription.cancel();
  27. super.dispose();
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return ClassicHeader(
  32. idleText: "Pull down to sync.",
  33. refreshingText: _getRefreshingText(),
  34. releaseText: "Release to sync.",
  35. completeText: "Sync completed.",
  36. failedText: "Sync unsuccessful.",
  37. completeDuration: const Duration(milliseconds: 1000),
  38. refreshStyle: RefreshStyle.UnFollow,
  39. );
  40. }
  41. String _getRefreshingText() {
  42. if (_event == null) {
  43. return "Syncing...";
  44. } else {
  45. var s;
  46. if (_event.hasError) {
  47. widget.refreshController.refreshFailed();
  48. s = "Upload failed.";
  49. } else {
  50. s = "Backing up " +
  51. _event.completed.toString() +
  52. "/" +
  53. _event.total.toString();
  54. }
  55. _event = null;
  56. return s;
  57. }
  58. }
  59. }