Files
PinePods-nix/PinePods-0.8.2/mobile/lib/ui/widgets/sync_spinner.dart
2026-03-03 10:57:43 -05:00

77 lines
2.0 KiB
Dart

// Copyright 2020 Ben Hills and the project contributors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:pinepods_mobile/bloc/podcast/podcast_bloc.dart';
import 'package:pinepods_mobile/state/bloc_state.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class SyncSpinner extends StatefulWidget {
const SyncSpinner({super.key});
@override
State<SyncSpinner> createState() => _SyncSpinnerState();
}
class _SyncSpinnerState extends State<SyncSpinner> with SingleTickerProviderStateMixin {
late AnimationController _controller;
StreamSubscription<BlocState<void>>? subscription;
Widget? _child;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
)..repeat();
_child = const Icon(
Icons.refresh,
size: 16.0,
);
final podcastBloc = Provider.of<PodcastBloc>(context, listen: false);
subscription = podcastBloc.backgroundLoading.listen((event) {
if (event is BlocSuccessfulState<void> || event is BlocErrorState<void>) {
_controller.stop();
}
});
}
@override
void dispose() {
_controller.dispose();
subscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
final podcastBloc = Provider.of<PodcastBloc>(context, listen: false);
return StreamBuilder<BlocState<void>>(
initialData: BlocEmptyState<void>(),
stream: podcastBloc.backgroundLoading,
builder: (context, snapshot) {
final state = snapshot.data;
return state is BlocLoadingState<void>
? RotationTransition(
turns: _controller,
child: _child,
)
: const SizedBox(
width: 0.0,
height: 0.0,
);
});
}
}