You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/new_views/common_widgets/app_loading_manager.dart

86 lines
2.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import '../app_style/app_color.dart';
class AppLoadingManager extends StatefulWidget {
final bool isLoading;
final bool isFailedLoading;
final bool isNotPage;
final int? progress;
final bool askOnBack;
final int? stateCode;
final Future<void> Function() onRefresh;
final Widget child;
const AppLoadingManager({
Key? key,
required this.isLoading,
required this.isFailedLoading,
required this.onRefresh,
required this.child,
this.stateCode,
this.progress,
this.isNotPage = false,
this.askOnBack = false,
}) : super(key: key);
@override
State<AppLoadingManager> createState() => _AppLoadingManagerState();
}
class _AppLoadingManagerState extends State<AppLoadingManager> {
@override
void initState() {
if (widget.stateCode == null) {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
widget.onRefresh();
});
}
super.initState();
}
@override
Widget build(BuildContext context) {
Widget? placeHolder;
// if loading is still not started or in progress
if (widget.isLoading || widget.stateCode == null) {
placeHolder = Container(
height: 60.toScreenHeight,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: context.isDark ? AppColor.neutral50 : Colors.white,
),
child: const AppLazyLoading(),
);
} else if (widget.isFailedLoading && !widget.isNotPage) {
// if failed, return failed widget
placeHolder = Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(context.translation.httpError, style: Theme.of(context).textTheme.titleMedium),
4.height,
OutlinedButton(
onPressed: widget.onRefresh,
child: Text(context.translation.tryAgain),
),
],
),
);
}
// if loading ended successfully, return loaded widget
return RefreshIndicator(
onRefresh: widget.onRefresh,
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 400),
child: placeHolder ?? widget.child,
),
);
}
}