CRUD: move firestore implementation in his own package #231
| @ -35,91 +35,81 @@ class AdvancedCubitView extends StatelessWidget { | |||||||
|         create: (context) => |         create: (context) => | ||||||
|             UserAdvancedCubit(context.read<CrudRepository<User>>()) |             UserAdvancedCubit(context.read<CrudRepository<User>>()) | ||||||
|               ..streaming(), |               ..streaming(), | ||||||
|         child: Builder(builder: (context) { |         child: Builder( | ||||||
|           return Column( |           builder: (context) { | ||||||
|             children: [ |             return Column( | ||||||
|               BlocBuilder<UserAdvancedCubit, CrudState>( |               children: [ | ||||||
|                 buildWhen: (previous, current) { |                 Expanded( | ||||||
|                   if (current is CrudLoading && current is! CrudReading) { |                   child: | ||||||
|                     return false; |                       CrudBuilder.typed<UserAdvancedCubit, CrudListLoaded<User?>>( | ||||||
|                   } |                     buildWhen: (previous, current) { | ||||||
|                   return true; |                       if (current is CrudLoading && current is! CrudReading) { | ||||||
|                 }, |                         return false; | ||||||
|                 builder: (context, state) { |                       } | ||||||
|                   return Expanded( |                       return true; | ||||||
|                     child: CrudBuilder.typed<CrudListLoaded<User?>>( |                     }, | ||||||
|                       state: state, |                     builder: ((context, state) { | ||||||
|                       builder: ((context, state) { |                       return ListView.builder( | ||||||
|                         return ListView.builder( |                         itemCount: state.data.length, | ||||||
|                           itemCount: state.data.length, |                         itemBuilder: (context, index) { | ||||||
|                           itemBuilder: (context, index) { |                           final user = state.data.elementAt(index); | ||||||
|                             final user = state.data.elementAt(index); |                           return ListTile( | ||||||
|                             return ListTile( |                             title: Text(user?.name ?? 'Error'), | ||||||
|                               title: Text(user?.name ?? 'Error'), |                             subtitle: Text(user?.email ?? 'Error'), | ||||||
|                               subtitle: Text(user?.email ?? 'Error'), |                             onTap: () { | ||||||
|                               onTap: () { |                               context.read<UserAdvancedCubit>().delete((user?.id)!); | ||||||
|                                 context |                             }, | ||||||
|                                     .read<UserAdvancedCubit>() |                             onLongPress: () { | ||||||
|                                     .delete((user?.id)!); |                               context.read<UserAdvancedCubit>().update( | ||||||
|                               }, |                                     UpdateParameters(id: user?.id ?? '', raw: { | ||||||
|                               onLongPress: () { |                                       'email': '${user?.id}@updated.io', | ||||||
|                                 context.read<UserAdvancedCubit>().update( |                                     }), | ||||||
|                                       UpdateParameters( |                                   ); | ||||||
|                                           id: user?.id ?? '', |                             }, | ||||||
|                                           raw: { |                           ); | ||||||
|                                             'email': '${user?.id}@updated.io', |                         }, | ||||||
|                                           }), |  | ||||||
|                                     ); |  | ||||||
|                               }, |  | ||||||
|                             ); |  | ||||||
|                           }, |  | ||||||
|                         ); |  | ||||||
|                       }), |  | ||||||
|                       initialBuilder: (context, state) => |  | ||||||
|                           const Center(child: CircularProgressIndicator()), |  | ||||||
|                       loadingBuilder: (context, state) => |  | ||||||
|                           const Center(child: CircularProgressIndicator()), |  | ||||||
|                       errorBuilder: (context, state) => Text("Error: $state"), |  | ||||||
|                     ), |  | ||||||
|                   ); |  | ||||||
|                 }, |  | ||||||
|               ), |  | ||||||
|               const SizedBox(height: 20), |  | ||||||
|               ElevatedButton( |  | ||||||
|                 onPressed: () { |  | ||||||
|                   final r = Random().nextInt(1000); |  | ||||||
|                   context.read<UserAdvancedCubit>().create( |  | ||||||
|                         User( |  | ||||||
|                           id: '$r', |  | ||||||
|                           name: 'Wyatt $r', |  | ||||||
|                           email: '$r@wyattapp.io', |  | ||||||
|                           phone: '06$r', |  | ||||||
|                         ), |  | ||||||
|                       ); |                       ); | ||||||
|                 }, |                     }), | ||||||
|                 child: BlocBuilder<UserAdvancedCubit, CrudState>( |                     initialBuilder: (context, state) => | ||||||
|                   buildWhen: (previous, current) { |                         const Center(child: CircularProgressIndicator()), | ||||||
|                     if (current is CrudLoading && current is! CrudCreating) { |                     loadingBuilder: (context, state) => | ||||||
|                       return false; |                         const Center(child: CircularProgressIndicator()), | ||||||
|                     } |                     errorBuilder: (context, state) => Text("Error: $state"), | ||||||
|                     return true; |                   ), | ||||||
|                   }, |  | ||||||
|                   builder: (context, state) { |  | ||||||
|                     return state is CrudCreating |  | ||||||
|                         ? const SizedBox( |  | ||||||
|                             width: 20, |  | ||||||
|                             height: 20, |  | ||||||
|                             child: CircularProgressIndicator( |  | ||||||
|                               color: Colors.white, |  | ||||||
|                             ), |  | ||||||
|                           ) |  | ||||||
|                         : const Text("Create"); |  | ||||||
|                   }, |  | ||||||
|                 ), |                 ), | ||||||
|               ), |                 const SizedBox(height: 20), | ||||||
|             ], |                 ElevatedButton( | ||||||
|           ); |                   onPressed: () { | ||||||
|         }), |                     final r = Random().nextInt(1000); | ||||||
|  |                     context.read<UserAdvancedCubit>().create( | ||||||
|  |                           User( | ||||||
|  |                             id: '$r', | ||||||
|  |                             name: 'Wyatt $r', | ||||||
|  |                             email: '$r@wyattapp.io', | ||||||
|  |                             phone: '06$r', | ||||||
|  |                           ), | ||||||
|  |                         ); | ||||||
|  |                   }, | ||||||
|  |                   child: CrudBuilder.onLoading<UserAdvancedCubit>( | ||||||
|  |                     builder: (context, state) { | ||||||
|  |                       if (state is CrudCreating) { | ||||||
|  |                         return const SizedBox( | ||||||
|  |                           width: 20, | ||||||
|  |                           height: 20, | ||||||
|  |                           child: CircularProgressIndicator( | ||||||
|  |                             color: Colors.white, | ||||||
|  |                           ), | ||||||
|  |                         ); | ||||||
|  |                       } | ||||||
|  |                       return null; | ||||||
|  |                     }, | ||||||
|  |                     otherBuilder: (context, state) => const Text("Create"), | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |               ], | ||||||
|  |             ); | ||||||
|  |           } | ||||||
|  |         ), | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -37,51 +37,44 @@ class BasicCubitView extends StatelessWidget { | |||||||
|         child: Builder(builder: (context) { |         child: Builder(builder: (context) { | ||||||
|           return Column( |           return Column( | ||||||
|             children: [ |             children: [ | ||||||
|               BlocBuilder<UserCubit, CrudState>( |               Expanded( | ||||||
|                 buildWhen: (previous, current) { |                 child: CrudBuilder.typed<UserCubit, CrudListLoaded<User?>>( | ||||||
|                   if (current is CrudLoading && current is! CrudReading) { |                   buildWhen: (previous, current) { | ||||||
|                     return false; |                     if (current is CrudLoading && current is! CrudReading) { | ||||||
|                   } |                       return false; | ||||||
|                   return true; |                     } | ||||||
|                 }, |                     return true; | ||||||
|                 builder: (context, state) { |                   }, | ||||||
|                   return Expanded( |                   builder: ((context, state) { | ||||||
|                     child: CrudBuilder.typed<CrudListLoaded<User?>>( |                     return ListView.builder( | ||||||
|                       state: state, |                       itemCount: state.data.length, | ||||||
|                       builder: ((context, state) { |                       itemBuilder: (context, index) { | ||||||
|                         return ListView.builder( |                         final user = state.data.elementAt(index); | ||||||
|                           itemCount: state.data.length, |                         return ListTile( | ||||||
|                           itemBuilder: (context, index) { |                           title: Text(user?.name ?? 'Error'), | ||||||
|                             final user = state.data.elementAt(index); |                           subtitle: Text(user?.email ?? 'Error'), | ||||||
|                             return ListTile( |                           onTap: () { | ||||||
|                               title: Text(user?.name ?? 'Error'), |                             context.read<UserCubit>().delete(id: (user?.id)!); | ||||||
|                               subtitle: Text(user?.email ?? 'Error'), |                           }, | ||||||
|                               onTap: () { |                           onLongPress: () { | ||||||
|                                 context |                             context.read<UserCubit>().update( | ||||||
|                                     .read<UserCubit>() |                                   single: UpdateParameters( | ||||||
|                                     .delete(id: (user?.id)!); |                                       id: user?.id ?? '', | ||||||
|                               }, |                                       raw: { | ||||||
|                               onLongPress: () { |                                         'email': '${user?.id}@updated.io', | ||||||
|                                 context.read<UserCubit>().update( |                                       }), | ||||||
|                                       single: UpdateParameters( |                                 ); | ||||||
|                                           id: user?.id ?? '', |  | ||||||
|                                           raw: { |  | ||||||
|                                             'email': '${user?.id}@updated.io', |  | ||||||
|                                           }), |  | ||||||
|                                     ); |  | ||||||
|                               }, |  | ||||||
|                             ); |  | ||||||
|                           }, |                           }, | ||||||
|                         ); |                         ); | ||||||
|                       }), |                       }, | ||||||
|                       initialBuilder: (context, state) => |                     ); | ||||||
|                           const Center(child: CircularProgressIndicator()), |                   }), | ||||||
|                       loadingBuilder: (context, state) => |                   initialBuilder: (context, state) => | ||||||
|                           const Center(child: CircularProgressIndicator()), |                       const Center(child: CircularProgressIndicator()), | ||||||
|                       errorBuilder: (context, state) => Text("Error: $state"), |                   loadingBuilder: (context, state) => | ||||||
|                     ), |                       const Center(child: CircularProgressIndicator()), | ||||||
|                   ); |                   errorBuilder: (context, state) => Text("Error: $state"), | ||||||
|                 }, |                 ), | ||||||
|               ), |               ), | ||||||
|               const SizedBox(height: 20), |               const SizedBox(height: 20), | ||||||
|               ElevatedButton( |               ElevatedButton( | ||||||
| @ -96,48 +89,40 @@ class BasicCubitView extends StatelessWidget { | |||||||
|                         ), |                         ), | ||||||
|                       ); |                       ); | ||||||
|                 }, |                 }, | ||||||
|                 child: BlocBuilder<UserCubit, CrudState>( |                 child: CrudBuilder.onLoading<UserCubit>( | ||||||
|                   buildWhen: (previous, current) { |  | ||||||
|                     if (current is CrudLoading && current is! CrudCreating) { |  | ||||||
|                       return false; |  | ||||||
|                     } |  | ||||||
|                     return true; |  | ||||||
|                   }, |  | ||||||
|                   builder: (context, state) { |                   builder: (context, state) { | ||||||
|                     return state is CrudCreating |                     if (state is CrudCreating) { | ||||||
|                         ? const SizedBox( |                       return const SizedBox( | ||||||
|                             width: 20, |                         width: 20, | ||||||
|                             height: 20, |                         height: 20, | ||||||
|                             child: CircularProgressIndicator( |                         child: CircularProgressIndicator( | ||||||
|                               color: Colors.white, |                           color: Colors.white, | ||||||
|                             ), |                         ), | ||||||
|                           ) |                       ); | ||||||
|                         : const Text("Create"); |                     } | ||||||
|  |                     return null; | ||||||
|                   }, |                   }, | ||||||
|  |                   otherBuilder: (context, state) => const Text("Create"), | ||||||
|                 ), |                 ), | ||||||
|               ), |               ), | ||||||
|               ElevatedButton( |               ElevatedButton( | ||||||
|                 onPressed: () { |                 onPressed: () { | ||||||
|                   context.read<UserCubit>().read(); |                   context.read<UserCubit>().read(); | ||||||
|                 }, |                 }, | ||||||
|                 child: BlocBuilder<UserCubit, CrudState>( |                 child: CrudBuilder.onLoading<UserCubit>( | ||||||
|                   buildWhen: (previous, current) { |  | ||||||
|                     if (current is CrudLoading && current is! CrudReading) { |  | ||||||
|                       return false; |  | ||||||
|                     } |  | ||||||
|                     return true; |  | ||||||
|                   }, |  | ||||||
|                   builder: (context, state) { |                   builder: (context, state) { | ||||||
|                     return state is CrudReading |                     if (state is CrudReading) { | ||||||
|                         ? const SizedBox( |                       return const SizedBox( | ||||||
|                             width: 20, |                         width: 20, | ||||||
|                             height: 20, |                         height: 20, | ||||||
|                             child: CircularProgressIndicator( |                         child: CircularProgressIndicator( | ||||||
|                               color: Colors.white, |                           color: Colors.white, | ||||||
|                             ), |                         ), | ||||||
|                           ) |                       ); | ||||||
|                         : const Text("Read"); |                     } | ||||||
|  |                     return null; | ||||||
|                   }, |                   }, | ||||||
|  |                   otherBuilder: (context, state) => const Text("Read"), | ||||||
|                 ), |                 ), | ||||||
|               ), |               ), | ||||||
|               const SizedBox(height: 20), |               const SizedBox(height: 20), | ||||||
|  | |||||||
| @ -37,51 +37,47 @@ class StreamingCubitView extends StatelessWidget { | |||||||
|         child: Builder(builder: (context) { |         child: Builder(builder: (context) { | ||||||
|           return Column( |           return Column( | ||||||
|             children: [ |             children: [ | ||||||
|               BlocBuilder<UserStreamingCubit, CrudState>( |               Expanded( | ||||||
|                 buildWhen: (previous, current) { |                 child: CrudBuilder.typed<UserStreamingCubit, | ||||||
|                   if (current is CrudLoading && current is! CrudReading) { |                     CrudListLoaded<User?>>( | ||||||
|                     return false; |                   buildWhen: (previous, current) { | ||||||
|                   } |                     if (current is CrudLoading && current is! CrudReading) { | ||||||
|                   return true; |                       return false; | ||||||
|                 }, |                     } | ||||||
|                 builder: (context, state) { |                     return true; | ||||||
|                   return Expanded( |                   }, | ||||||
|                     child: CrudBuilder.typed<CrudListLoaded<User?>>( |                   builder: ((context, state) { | ||||||
|                       state: state, |                     return ListView.builder( | ||||||
|                       builder: ((context, state) { |                       itemCount: state.data.length, | ||||||
|                         return ListView.builder( |                       itemBuilder: (context, index) { | ||||||
|                           itemCount: state.data.length, |                         final user = state.data.elementAt(index); | ||||||
|                           itemBuilder: (context, index) { |                         return ListTile( | ||||||
|                             final user = state.data.elementAt(index); |                           title: Text(user?.name ?? 'Error'), | ||||||
|                             return ListTile( |                           subtitle: Text(user?.email ?? 'Error'), | ||||||
|                               title: Text(user?.name ?? 'Error'), |                           onTap: () { | ||||||
|                               subtitle: Text(user?.email ?? 'Error'), |                             context | ||||||
|                               onTap: () { |                                 .read<UserStreamingCubit>() | ||||||
|                                 context |                                 .delete(id: (user?.id)!); | ||||||
|                                     .read<UserStreamingCubit>() |                           }, | ||||||
|                                     .delete(id: (user?.id)!); |                           onLongPress: () { | ||||||
|                               }, |                             context.read<UserStreamingCubit>().update( | ||||||
|                               onLongPress: () { |                                   single: UpdateParameters( | ||||||
|                                 context.read<UserStreamingCubit>().update( |                                       id: user?.id ?? '', | ||||||
|                                       single: UpdateParameters( |                                       raw: { | ||||||
|                                           id: user?.id ?? '', |                                         'email': '${user?.id}@updated.io', | ||||||
|                                           raw: { |                                       }), | ||||||
|                                             'email': '${user?.id}@updated.io', |                                 ); | ||||||
|                                           }), |  | ||||||
|                                     ); |  | ||||||
|                               }, |  | ||||||
|                             ); |  | ||||||
|                           }, |                           }, | ||||||
|                         ); |                         ); | ||||||
|                       }), |                       }, | ||||||
|                       initialBuilder: (context, state) => |                     ); | ||||||
|                           const Center(child: CircularProgressIndicator()), |                   }), | ||||||
|                       loadingBuilder: (context, state) => |                   initialBuilder: (context, state) => | ||||||
|                           const Center(child: CircularProgressIndicator()), |                       const Center(child: CircularProgressIndicator()), | ||||||
|                       errorBuilder: (context, state) => Text("Error: $state"), |                   loadingBuilder: (context, state) => | ||||||
|                     ), |                       const Center(child: CircularProgressIndicator()), | ||||||
|                   ); |                   errorBuilder: (context, state) => Text("Error: $state"), | ||||||
|                 }, |                 ), | ||||||
|               ), |               ), | ||||||
|               const SizedBox(height: 20), |               const SizedBox(height: 20), | ||||||
|               ElevatedButton( |               ElevatedButton( | ||||||
| @ -96,24 +92,20 @@ class StreamingCubitView extends StatelessWidget { | |||||||
|                         ), |                         ), | ||||||
|                       ); |                       ); | ||||||
|                 }, |                 }, | ||||||
|                 child: BlocBuilder<UserStreamingCubit, CrudState>( |                 child: CrudBuilder.onLoading<UserStreamingCubit>( | ||||||
|                   buildWhen: (previous, current) { |  | ||||||
|                     if (current is CrudLoading && current is! CrudCreating) { |  | ||||||
|                       return false; |  | ||||||
|                     } |  | ||||||
|                     return true; |  | ||||||
|                   }, |  | ||||||
|                   builder: (context, state) { |                   builder: (context, state) { | ||||||
|                     return state is CrudCreating |                     if (state is CrudCreating) { | ||||||
|                         ? const SizedBox( |                       return const SizedBox( | ||||||
|                             width: 20, |                         width: 20, | ||||||
|                             height: 20, |                         height: 20, | ||||||
|                             child: CircularProgressIndicator( |                         child: CircularProgressIndicator( | ||||||
|                               color: Colors.white, |                           color: Colors.white, | ||||||
|                             ), |                         ), | ||||||
|                           ) |                       ); | ||||||
|                         : const Text("Create"); |                     } | ||||||
|  |                     return null; | ||||||
|                   }, |                   }, | ||||||
|  |                   otherBuilder: (context, state) => const Text("Create"), | ||||||
|                 ), |                 ), | ||||||
|               ), |               ), | ||||||
|             ], |             ], | ||||||
|  | |||||||
| @ -15,26 +15,27 @@ | |||||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
| 
 | 
 | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
| import 'package:wyatt_crud_bloc/src/features/crud/blocs/crud_base_cubit/crud_base_cubit.dart'; | import 'package:wyatt_crud_bloc/src/features/crud/blocs/crud_base_cubit/crud_base_cubit.dart'; | ||||||
| 
 | 
 | ||||||
| /// {@template crud_builder} | /// {@template crud_builder} | ||||||
| /// A widget that builds itself based on the latest snapshot of interaction | /// A widget that builds itself based on the latest snapshot of interaction | ||||||
| /// with a [CrudBaseCubit]. | /// with a [CrudBaseCubit]. | ||||||
| /// |  | ||||||
| /// * I = Initial State |  | ||||||
| /// * L = Loading State |  | ||||||
| /// * S = Success State |  | ||||||
| /// * E = Error State |  | ||||||
| /// {@endtemplate} | /// {@endtemplate} | ||||||
| class CrudBuilder<I, L, S, E> extends StatelessWidget { | class CrudBuilder< | ||||||
|  |     Bloc extends StateStreamable<CrudState>, | ||||||
|  |     Initial extends CrudState, | ||||||
|  |     Loading extends CrudState, | ||||||
|  |     Success extends CrudState, | ||||||
|  |     Error extends CrudState> extends StatelessWidget { | ||||||
|   /// {@macro crud_builder} |   /// {@macro crud_builder} | ||||||
|   const CrudBuilder({ |   const CrudBuilder({ | ||||||
|     required this.state, |  | ||||||
|     required this.builder, |     required this.builder, | ||||||
|     required this.initialBuilder, |     required this.initialBuilder, | ||||||
|     required this.loadingBuilder, |     required this.loadingBuilder, | ||||||
|     required this.errorBuilder, |     required this.errorBuilder, | ||||||
|     this.unknownBuilder, |     this.unknownBuilder, | ||||||
|  |     this.buildWhen, | ||||||
|     super.key, |     super.key, | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
| @ -43,50 +44,121 @@ class CrudBuilder<I, L, S, E> extends StatelessWidget { | |||||||
|   /// This factory constructor is used to create a [CrudBuilder] with |   /// This factory constructor is used to create a [CrudBuilder] with | ||||||
|   /// [CrudState]s. `S` is the Success State, and it must be a subtype of |   /// [CrudState]s. `S` is the Success State, and it must be a subtype of | ||||||
|   /// [CrudSuccess]. It the only type that you have to specify. |   /// [CrudSuccess]. It the only type that you have to specify. | ||||||
|   static CrudBuilder<CrudInitial, CrudLoading, CrudSuccess, CrudError> |   static CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError> | ||||||
|       typed<S extends CrudSuccess>({ |       typed<Bloc extends StateStreamable<CrudState>, | ||||||
|     required CrudState state, |               Success extends CrudSuccess>({ | ||||||
|     required Widget Function(BuildContext, S) builder, |     required Widget Function(BuildContext, Success) builder, | ||||||
|     required Widget Function(BuildContext, CrudInitial) initialBuilder, |     required Widget Function(BuildContext, CrudInitial) initialBuilder, | ||||||
|     required Widget Function(BuildContext, CrudLoading) loadingBuilder, |     required Widget Function(BuildContext, CrudLoading) loadingBuilder, | ||||||
|     required Widget Function(BuildContext, CrudError) errorBuilder, |     required Widget Function(BuildContext, CrudError) errorBuilder, | ||||||
|     Widget Function(BuildContext, Object)? unknownBuilder, |     Widget Function(BuildContext, CrudState)? unknownBuilder, | ||||||
|  |     BlocBuilderCondition<CrudState>? buildWhen, | ||||||
|   }) => |   }) => | ||||||
|           CrudBuilder<CrudInitial, CrudLoading, S, CrudError>( |           CrudBuilder<Bloc, CrudInitial, CrudLoading, Success, CrudError>( | ||||||
|             state: state, |  | ||||||
|             builder: builder, |             builder: builder, | ||||||
|             initialBuilder: initialBuilder, |             initialBuilder: initialBuilder, | ||||||
|             loadingBuilder: loadingBuilder, |             loadingBuilder: loadingBuilder, | ||||||
|             errorBuilder: errorBuilder, |             errorBuilder: errorBuilder, | ||||||
|             unknownBuilder: unknownBuilder, |             unknownBuilder: unknownBuilder, | ||||||
|  |             buildWhen: buildWhen, | ||||||
|           ); |           ); | ||||||
| 
 | 
 | ||||||
|   final Object state; |   /// {@macro crud_builder} | ||||||
|   final Widget Function(BuildContext context, S state) builder; |   /// | ||||||
|   final Widget Function(BuildContext context, I state) initialBuilder; |   /// This factory constructor is used to create a [CrudBuilder] wich reacts | ||||||
|   final Widget Function(BuildContext context, L state) loadingBuilder; |   /// only to [CrudLoading] states. | ||||||
|   final Widget Function(BuildContext context, E state) errorBuilder; |   static CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError> | ||||||
|   final Widget Function(BuildContext context, Object state)? unknownBuilder; |       onLoading<Bloc extends StateStreamable<CrudState>>({ | ||||||
|  |     required Widget? Function(BuildContext, CrudLoading) builder, | ||||||
|  |     Widget Function(BuildContext, CrudState)? otherBuilder, | ||||||
|  |     BlocBuilderCondition<CrudState>? buildWhen, | ||||||
|  |   }) => | ||||||
|  |           CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError>( | ||||||
|  |             loadingBuilder: (context, state) => | ||||||
|  |                 builder.call(context, state) ?? | ||||||
|  |                 otherBuilder?.call(context, state) ?? | ||||||
|  |                 const SizedBox.shrink(), | ||||||
|  |             builder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             initialBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             errorBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             unknownBuilder: otherBuilder, | ||||||
|  |             buildWhen: buildWhen, | ||||||
|  |           ); | ||||||
|  | 
 | ||||||
|  |   /// {@macro crud_builder} | ||||||
|  |   /// | ||||||
|  |   /// This factory constructor is used to create a [CrudBuilder] wich reacts | ||||||
|  |   /// only to [CrudInitial] states. | ||||||
|  |   static CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError> | ||||||
|  |       onInitial<Bloc extends StateStreamable<CrudState>>({ | ||||||
|  |     required Widget? Function(BuildContext, CrudInitial) builder, | ||||||
|  |     Widget Function(BuildContext, CrudState)? otherBuilder, | ||||||
|  |     BlocBuilderCondition<CrudState>? buildWhen, | ||||||
|  |   }) => | ||||||
|  |           CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError>( | ||||||
|  |             initialBuilder: (context, state) => | ||||||
|  |                 builder.call(context, state) ?? | ||||||
|  |                 otherBuilder?.call(context, state) ?? | ||||||
|  |                 const SizedBox.shrink(), | ||||||
|  |             builder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             loadingBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             errorBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             unknownBuilder: otherBuilder, | ||||||
|  |             buildWhen: buildWhen, | ||||||
|  |           ); | ||||||
|  | 
 | ||||||
|  |   /// {@macro crud_builder} | ||||||
|  |   /// | ||||||
|  |   /// This factory constructor is used to create a [CrudBuilder] wich reacts | ||||||
|  |   /// only to [CrudError] states. | ||||||
|  |   static CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError> | ||||||
|  |       onError<Bloc extends StateStreamable<CrudState>>({ | ||||||
|  |     required Widget? Function(BuildContext, CrudError) builder, | ||||||
|  |     Widget Function(BuildContext, CrudState)? otherBuilder, | ||||||
|  |     BlocBuilderCondition<CrudState>? buildWhen, | ||||||
|  |   }) => | ||||||
|  |           CrudBuilder<Bloc, CrudInitial, CrudLoading, CrudSuccess, CrudError>( | ||||||
|  |             errorBuilder: (context, state) => | ||||||
|  |                 builder.call(context, state) ?? | ||||||
|  |                 otherBuilder?.call(context, state) ?? | ||||||
|  |                 const SizedBox.shrink(), | ||||||
|  |             builder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             loadingBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             initialBuilder: (context, state) => | ||||||
|  |                 otherBuilder?.call(context, state) ?? const SizedBox.shrink(), | ||||||
|  |             unknownBuilder: otherBuilder, | ||||||
|  |             buildWhen: buildWhen, | ||||||
|  |           ); | ||||||
|  | 
 | ||||||
|  |   final BlocBuilderCondition<CrudState>? buildWhen; | ||||||
|  |   final Widget Function(BuildContext context, Success state) builder; | ||||||
|  |   final Widget Function(BuildContext context, Initial state) initialBuilder; | ||||||
|  |   final Widget Function(BuildContext context, Loading state) loadingBuilder; | ||||||
|  |   final Widget Function(BuildContext context, Error state) errorBuilder; | ||||||
|  |   final Widget Function(BuildContext context, CrudState state)? unknownBuilder; | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) => Builder( |   Widget build(BuildContext context) => BlocBuilder<Bloc, CrudState>( | ||||||
|         builder: (context) { |         buildWhen: buildWhen, | ||||||
|           if (state is S) { |         builder: (context, state) => switch (state) { | ||||||
|             return builder(context, state as S); |           Success() => builder(context, state), | ||||||
|           } else if (state is E) { |           Initial() => initialBuilder(context, state), | ||||||
|             return errorBuilder(context, state as E); |           Loading() => loadingBuilder(context, state), | ||||||
|           } else if (state is L) { |           Error() => errorBuilder(context, state), | ||||||
|             return loadingBuilder(context, state as L); |           _ => unknownBuilder?.call(context, state) ?? | ||||||
|           } else if (state is I) { |               Center( | ||||||
|             return initialBuilder(context, state as I); |                 child: Text( | ||||||
|           } else { |                   'Unknown state: $state', | ||||||
|             return unknownBuilder?.call(context, state) ?? |                 ), | ||||||
|                 Center( |               ), | ||||||
|                   child: Text( |  | ||||||
|                     'Unknown state: $state', |  | ||||||
|                   ), |  | ||||||
|                 ); |  | ||||||
|           } |  | ||||||
|         }, |         }, | ||||||
|       ); |       ); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user