revamp on bloc approach

This commit is contained in:
2024-05-05 15:48:26 +02:00
parent ee6af2bc07
commit f58a2ec8cd
28 changed files with 523 additions and 480 deletions

View File

@ -1,58 +1,58 @@
import 'package:flutter/material.dart';
import '../../app/base/infrastructure/errorBar/error_bar_controller.dart';
import '../../infrastructure/state_extensions.dart';
import '../controller_provider.dart';
class ErrorBar extends StatelessWidget {
final bool visible;
const ErrorBar({required this.visible, super.key});
final Duration animationDuration = const Duration(milliseconds: 200);
@override
Widget build(BuildContext context) => ControllerProvider<ErrorBarController>(
create: (context) => ErrorBarController(),
child: (context) => AnimatedSize(
duration: animationDuration,
child: AnimatedSwitcher(
duration: animationDuration,
transitionBuilder: (Widget child, Animation<double> animation) => SlideTransition(
position: Tween<Offset>(
begin: const Offset(0.0, -1.0),
end: Offset.zero,
).animate(animation),
child: child,
),
child: Visibility(
key: Key(visible.hashCode.toString()),
visible: visible,
replacement: const SizedBox(width: double.infinity),
child: Builder(
builder: (context) {
var controller = context.watchController<ErrorBarController>();
var status = controller.connectivityStatusKnown() && !controller.isConnected()
? (icon: Icons.wifi_off_outlined, text: 'Offline', color: Colors.grey.shade600)
: (icon: Icons.wifi_find_outlined, text: 'Verbindung fehlgeschlagen', color: Theme.of(context).primaryColor);
return Container(
height: 20,
decoration: BoxDecoration(
color: status.color,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(status.icon, size: 14),
const SizedBox(width: 10),
Text(status.text, style: const TextStyle(fontSize: 12))
],
),
);
},
)
)
),
),
);
}
// import 'package:flutter/material.dart';
//
// import '../../app/base/infrastructure/errorBar/error_bar_controller.dart';
// import '../../infrastructure/state_extensions.dart';
// import '../controller_provider.dart';
//
// class ErrorBar extends StatelessWidget {
// final bool visible;
// const ErrorBar({required this.visible, super.key});
//
// final Duration animationDuration = const Duration(milliseconds: 200);
//
// @override
// Widget build(BuildContext context) => ControllerProvider<ErrorBarController>(
// create: (context) => ErrorBarController(),
// child: (context) => AnimatedSize(
// duration: animationDuration,
// child: AnimatedSwitcher(
// duration: animationDuration,
// transitionBuilder: (Widget child, Animation<double> animation) => SlideTransition(
// position: Tween<Offset>(
// begin: const Offset(0.0, -1.0),
// end: Offset.zero,
// ).animate(animation),
// child: child,
// ),
// child: Visibility(
// key: Key(visible.hashCode.toString()),
// visible: visible,
// replacement: const SizedBox(width: double.infinity),
// child: Builder(
// builder: (context) {
// var controller = context.watchController<ErrorBarController>();
// var status = controller.connectivityStatusKnown() && !controller.isConnected()
// ? (icon: Icons.wifi_off_outlined, text: 'Offline', color: Colors.grey.shade600)
// : (icon: Icons.wifi_find_outlined, text: 'Verbindung fehlgeschlagen', color: Theme.of(context).primaryColor);
//
// return Container(
// height: 20,
// decoration: BoxDecoration(
// color: status.color,
// ),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Icon(status.icon, size: 14),
// const SizedBox(width: 10),
// Text(status.text, style: const TextStyle(fontSize: 12))
// ],
// ),
// );
// },
// )
// )
// ),
// ),
// );
// }

View File

@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../infrastructure/controller.dart';
class ControllerConsumer<TController extends Controller<TState>, TState> extends StatelessWidget {
final Widget Function(BuildContext context, TState state) child;
const ControllerConsumer({required this.child, super.key});
@override
Widget build(BuildContext context) => BlocBuilder<TController, TState>(builder: child);
}
// import 'package:flutter/material.dart';
// import 'package:flutter_bloc/flutter_bloc.dart';
//
// import '../infrastructure/controller.dart';
//
// class ControllerConsumer<TController extends Controller<TState>, TState> extends StatelessWidget {
// final Widget Function(BuildContext context, TState state) child;
// const ControllerConsumer({required this.child, super.key});
//
// @override
// Widget build(BuildContext context) => BlocBuilder<TController, TState>(builder: child);
// }

View File

@ -1,21 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/single_child_widget.dart';
import '../infrastructure/controller.dart';
class ControllerProvider<TState extends Controller> extends SingleChildStatelessWidget {
final TState Function(BuildContext context) create;
final bool lazy;
final Widget Function(BuildContext context) child;
ControllerProvider({required this.create, this.lazy = true, required this.child, super.key})
: super(child: Builder(builder: child));
@override
Widget buildWithChild(BuildContext context, Widget? child) => BlocProvider(
create: create,
lazy: lazy,
child: child,
);
}
// import 'package:flutter/material.dart';
// import 'package:flutter_bloc/flutter_bloc.dart';
// import 'package:provider/single_child_widget.dart';
//
// import '../infrastructure/controller.dart';
//
//
// class ControllerProvider<TState extends Controller> extends SingleChildStatelessWidget {
// final TState Function(BuildContext context) create;
// final bool lazy;
// final Widget Function(BuildContext context) child;
// ControllerProvider({required this.create, this.lazy = true, required this.child, super.key})
// : super(child: Builder(builder: child));
//
// @override
// Widget buildWithChild(BuildContext context, Widget? child) => BlocProvider(
// create: create,
// lazy: lazy,
// child: child,
// );
// }

View File

@ -1,17 +1,17 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'controller_provider.dart';
class ControllersProvider extends StatelessWidget {
final List<ControllerProvider> controllers;
final Widget Function(BuildContext context) child;
const ControllersProvider({required this.controllers, required this.child, super.key});
@override
Widget build(BuildContext context) => MultiBlocProvider(
providers: controllers,
child: Builder(builder: child)
);
}
//
// import 'package:flutter/material.dart';
// import 'package:flutter_bloc/flutter_bloc.dart';
//
// import 'controller_provider.dart';
//
// class ControllersProvider extends StatelessWidget {
// final List<ControllerProvider> controllers;
// final Widget Function(BuildContext context) child;
// const ControllersProvider({required this.controllers, required this.child, super.key});
//
// @override
// Widget build(BuildContext context) => MultiBlocProvider(
// providers: controllers,
// child: Builder(builder: child)
// );
// }

View File

@ -1,40 +1,42 @@
import 'package:flutter/material.dart';
import '../infrastructure/controller.dart';
import '../infrastructure/loadable_state.dart';
import '../infrastructure/state_extensions.dart';
import 'components/background_loading_indicator.dart';
import 'components/error_bar.dart';
import 'components/primary_loading_indicator.dart';
class LoadableControllerConsumer<TController extends Controller<TState>, TState extends LoadableState> extends StatelessWidget {
final Widget child;
const LoadableControllerConsumer({required this.child, super.key});
final Duration animationDuration = const Duration(milliseconds: 200);
@override
Widget build(BuildContext context) {
var state = context.readController<TController>().state;
return Column(
children: [
ErrorBar(visible: state.errorBarVisible()),
Expanded(
child: Stack(
children: [
PrimaryLoadingIndicator(visible: !state.hasStateData()),
BackgroundLoadingIndicator(visible: state.isBackgroundLoading() && !state.errorBarVisible()),
AnimatedOpacity(
opacity: state.hasStateData() ? 1.0 : 0.0,
duration: animationDuration,
curve: Curves.easeInOut,
child: state.hasStateData() ? child : const SizedBox.shrink()
),
],
),
)
],
);
}
}
// import 'package:flutter/material.dart';
// import 'package:flutter_bloc/flutter_bloc.dart';
//
// import '../infrastructure/controller.dart';
// import '../infrastructure/loadable_state.dart';
// import '../infrastructure/state_extensions.dart';
// import 'components/background_loading_indicator.dart';
// import 'components/error_bar.dart';
// import 'components/primary_loading_indicator.dart';
//
// class LoadableControllerConsumer<TController extends Controller<TState>, TState extends LoadableState> extends StatelessWidget {
// final Widget child;
// const LoadableControllerConsumer({required this.child, super.key});
//
// final Duration animationDuration = const Duration(milliseconds: 200);
//
// @override
// Widget build(BuildContext context) {
// var state = context.readController<TController>().state;
//
// return Column(
// children: [
// // ErrorBar(visible: state.errorBarVisible()),
// // Expanded(
// // child: Stack(
// // children: [
// // PrimaryLoadingIndicator(visible: !state.hasStateData()),
// // BackgroundLoadingIndicator(visible: state.isBackgroundLoading() && !state.errorBarVisible()),
// //
// // AnimatedOpacity(
// // opacity: state.hasStateData() ? 1.0 : 0.0,
// // duration: animationDuration,
// // curve: Curves.easeInOut,
// // child: state.hasStateData() ? child : const SizedBox.shrink()
// // ),
// // ],
// // ),
// // )
// ],
// );
// }
// }