sync_indicator.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import 'dart:async';
  2. import 'dart:developer';
  3. import 'package:flutter/material.dart';
  4. import 'package:photos/core/event_bus.dart';
  5. import 'package:photos/events/photo_upload_event.dart';
  6. import 'package:photos/photo_sync_manager.dart';
  7. import 'package:pull_to_refresh/pull_to_refresh.dart';
  8. class SyncIndicator extends StatefulWidget {
  9. final RefreshController refreshController;
  10. const SyncIndicator(this.refreshController, {Key key}) : super(key: key);
  11. @override
  12. _SyncIndicatorState createState() => _SyncIndicatorState();
  13. }
  14. class _SyncIndicatorState extends State<SyncIndicator> {
  15. PhotoUploadEvent _event;
  16. StreamSubscription<PhotoUploadEvent> _subscription;
  17. String _completeText = "Sync completed.";
  18. @override
  19. void initState() {
  20. _subscription = Bus.instance.on<PhotoUploadEvent>().listen((event) {
  21. setState(() {
  22. _event = event;
  23. });
  24. });
  25. super.initState();
  26. }
  27. @override
  28. void dispose() {
  29. _subscription.cancel();
  30. super.dispose();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. return ClassicHeader(
  35. idleText: "Pull down to sync.",
  36. refreshingText: _getRefreshingText(),
  37. releaseText: "Release to sync.",
  38. completeText: _completeText,
  39. failedText: "Sync unsuccessful.",
  40. completeDuration: const Duration(milliseconds: 1000),
  41. refreshStyle: RefreshStyle.UnFollow,
  42. refreshingIcon: Container(
  43. width: 24,
  44. height: 24,
  45. child: GestureDetector(
  46. onTap: () {
  47. AlertDialog alert = AlertDialog(
  48. title: Text("Pause?"),
  49. content: Text(
  50. "Are you sure that you want to pause backing up your memories?"),
  51. actions: [
  52. FlatButton(
  53. child: Text("NO"),
  54. onPressed: () {
  55. Navigator.of(context).pop();
  56. },
  57. ),
  58. FlatButton(
  59. child: Text("YES"),
  60. onPressed: () {
  61. Navigator.of(context).pop();
  62. PhotoSyncManager.instance.stopSync();
  63. _completeText = "Sync stopped.";
  64. setState(() {});
  65. widget.refreshController.refreshCompleted();
  66. },
  67. ),
  68. ],
  69. );
  70. showDialog(
  71. context: context,
  72. builder: (BuildContext context) {
  73. return alert;
  74. },
  75. );
  76. },
  77. child: Stack(
  78. children: [
  79. Icon(
  80. Icons.pause_circle_outline,
  81. size: 24,
  82. color: Colors.pink,
  83. ),
  84. CircularProgressIndicator(strokeWidth: 2),
  85. ],
  86. ),
  87. ),
  88. ),
  89. );
  90. }
  91. String _getRefreshingText() {
  92. if (_event == null) {
  93. return "Syncing...";
  94. } else {
  95. var s;
  96. if (_event.hasError) {
  97. widget.refreshController.refreshFailed();
  98. s = "Upload failed.";
  99. } else if (_event.wasStopped) {
  100. s = "Sync stopped.";
  101. } else {
  102. s = "Backing up " +
  103. _event.completed.toString() +
  104. "/" +
  105. _event.total.toString();
  106. }
  107. _event = null;
  108. return s;
  109. }
  110. }
  111. }