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