Compare commits

..

No commits in common. "08383ec03bcb7b7458c6cc368fe72edc283e6eb9" and "f05f2230e9ea15df2598a3df17b9dfd68a256c07" have entirely different histories.

6 changed files with 25 additions and 31 deletions

View File

@ -39,7 +39,7 @@ class _NameInput extends StatelessWidget {
return InputBuilderTextController<SimpleCustomFormCubit, String?, Metadata>( return InputBuilderTextController<SimpleCustomFormCubit, String?, Metadata>(
field: formFieldName, field: formFieldName,
builder: builder:
(context, cubit, state, field, input, controller, metadata) { (context, cubit, state, field, inputValid, controller, metadata) {
final meta = state.form.metadataOf<Metadata>(field).extra; final meta = state.form.metadataOf<Metadata>(field).extra;
final color = computeColor(meta); final color = computeColor(meta);
return Row( return Row(
@ -65,7 +65,7 @@ class _NameInput extends StatelessWidget {
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'name', labelText: 'name',
helperText: '', helperText: '',
errorText: input.validator.invalid ? 'invalid name' : null, errorText: !inputValid ? 'invalid name' : null,
), ),
), ),
) )
@ -81,7 +81,7 @@ class _PhoneInput extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InputBuilderMetadata<SimpleCustomFormCubit, Metadata>( return InputBuilderMetadata<SimpleCustomFormCubit, Metadata>(
field: formFieldPhone, field: formFieldPhone,
builder: (context, cubit, state, field, input, metadata) { builder: (context, cubit, state, field, inputValid, metadata) {
final meta = state.form.metadataOf<Metadata>(field).extra; final meta = state.form.metadataOf<Metadata>(field).extra;
final color = computeColor(meta); final color = computeColor(meta);
return Row( return Row(
@ -106,7 +106,7 @@ class _PhoneInput extends StatelessWidget {
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'phone', labelText: 'phone',
helperText: '', helperText: '',
errorText: input.validator.invalid ? 'invalid phone' : null, errorText: !inputValid ? 'invalid phone' : null,
), ),
), ),
) )
@ -122,13 +122,13 @@ class _EmailInput extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InputBuilder<SimpleCustomFormCubit>( return InputBuilder<SimpleCustomFormCubit>(
field: formFieldEmail, field: formFieldEmail,
builder: (context, cubit, state, field, input) => TextField( builder: (context, cubit, state, field, inputValid) => TextField(
onChanged: (value) => cubit.dataChanged(field, Email.dirty(value)), onChanged: (value) => cubit.dataChanged(field, Email.dirty(value)),
keyboardType: TextInputType.emailAddress, keyboardType: TextInputType.emailAddress,
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'email', labelText: 'email',
helperText: '', helperText: '',
errorText: input.validator.invalid ? 'invalid email' : null, errorText: !inputValid ? 'invalid email' : null,
), ),
), ),
); );

View File

@ -25,7 +25,8 @@ class _NameInput extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InputBuilderTextController<SimpleCustomFormCubit, String?, Metadata>( return InputBuilderTextController<SimpleCustomFormCubit, String?, Metadata>(
field: formFieldName, field: formFieldName,
builder: (context, cubit, state, field, input, controller, metadata) { builder:
(context, cubit, state, field, inputValid, controller, metadata) {
return TextField( return TextField(
controller: controller, controller: controller,
onChanged: (value) => cubit.dataChanged(field, Name.dirty(value)), onChanged: (value) => cubit.dataChanged(field, Name.dirty(value)),
@ -33,7 +34,7 @@ class _NameInput extends StatelessWidget {
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'name', labelText: 'name',
helperText: '', helperText: '',
errorText: input.validator.invalid ? 'invalid name' : null, errorText: !inputValid ? 'invalid name' : null,
), ),
); );
}, },

View File

@ -28,16 +28,16 @@ class InputBuilder<Cubit extends FormDataCubit> extends StatelessWidget {
Cubit cubit, Cubit cubit,
FormDataState state, FormDataState state,
String field, String field,
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, dynamic> bool inputValid,
input,
) builder; ) builder;
@override @override
Widget build(BuildContext context) => BlocBuilder<Cubit, FormDataState>( Widget build(BuildContext context) =>
BlocBuilder<Cubit, FormDataState>(
builder: (context, state) { builder: (context, state) {
final cubit = context.watch<Cubit>(); final cubit = context.watch<Cubit>();
final input = state.form.inputOf(field); final inputValid = state.form.validatorOf(field).valid;
return builder.call(context, cubit, state, field, input); return builder.call(context, cubit, state, field, inputValid);
}, },
); );
} }

View File

@ -16,10 +16,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:wyatt_form_bloc/src/core/enums/validation_error.dart';
import 'package:wyatt_form_bloc/src/domain/entities/form_input.dart';
import 'package:wyatt_form_bloc/src/domain/entities/form_input_metadata.dart'; import 'package:wyatt_form_bloc/src/domain/entities/form_input_metadata.dart';
import 'package:wyatt_form_bloc/src/domain/input_validators/form_input_validator.dart';
import 'package:wyatt_form_bloc/src/presentation/presentation.dart'; import 'package:wyatt_form_bloc/src/presentation/presentation.dart';
class InputBuilderMetadata<Cubit extends FormDataCubit, Extra> class InputBuilderMetadata<Cubit extends FormDataCubit, Extra>
@ -37,23 +34,22 @@ class InputBuilderMetadata<Cubit extends FormDataCubit, Extra>
Cubit cubit, Cubit cubit,
FormDataState state, FormDataState state,
String field, String field,
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, dynamic> bool inputValid,
input,
FormInputMetadata<Extra>? metadata, FormInputMetadata<Extra>? metadata,
) builder; ) builder;
@override @override
Widget build(BuildContext context) => BlocBuilder<Cubit, FormDataState>( Widget build(BuildContext context) => BlocBuilder<Cubit, FormDataState>(
builder: (context, state) { builder: (context, state) {
final cubit = context.watch<Cubit>(); final cubit = context.read<Cubit>();
final input = state.form.inputOf(field); final inputValid = state.form.validatorOf(field).valid;
final metadata = input.metadata as FormInputMetadata<Extra>?; final metadata = state.form.metadataOf<Extra>(field);
return builder.call( return builder.call(
context, context,
cubit, cubit,
state, state,
field, field,
input, inputValid,
metadata, metadata,
); );
}, },

View File

@ -16,10 +16,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:wyatt_form_bloc/src/core/enums/validation_error.dart';
import 'package:wyatt_form_bloc/src/domain/entities/form_input.dart';
import 'package:wyatt_form_bloc/src/domain/entities/form_input_metadata.dart'; import 'package:wyatt_form_bloc/src/domain/entities/form_input_metadata.dart';
import 'package:wyatt_form_bloc/src/domain/input_validators/form_input_validator.dart';
import 'package:wyatt_form_bloc/src/domain/repositories/form_repository.dart'; import 'package:wyatt_form_bloc/src/domain/repositories/form_repository.dart';
import 'package:wyatt_form_bloc/src/presentation/features/form_data/form_data_cubit.dart'; import 'package:wyatt_form_bloc/src/presentation/features/form_data/form_data_cubit.dart';
@ -38,8 +35,7 @@ class InputBuilderTextController<Cubit extends FormDataCubit, S extends String?,
Cubit cubit, Cubit cubit,
FormDataState state, FormDataState state,
String field, String field,
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>, dynamic> bool inputValid,
input,
TextEditingController textEditingController, TextEditingController textEditingController,
FormInputMetadata<Extra>? metadata, FormInputMetadata<Extra>? metadata,
) builder; ) builder;
@ -61,15 +57,15 @@ class InputBuilderTextController<Cubit extends FormDataCubit, S extends String?,
return BlocBuilder<Cubit, FormDataState>( return BlocBuilder<Cubit, FormDataState>(
builder: (context, state) { builder: (context, state) {
final cubit = context.watch<Cubit>(); final cubit = context.read<Cubit>();
final input = state.form.inputOf(field); final inputValid = state.form.validatorOf(field).valid;
final metadata = input.metadata as FormInputMetadata<Extra>?; final metadata = state.form.metadataOf<Extra>(field);
return builder.call( return builder.call(
context, context,
cubit, cubit,
state, state,
field, field,
input, inputValid,
_controller, _controller,
metadata, metadata,
); );

View File

@ -27,6 +27,7 @@ class SubmitBuilder<Cubit extends FormDataCubit> extends StatelessWidget {
@override @override
Widget build(BuildContext context) => BlocBuilder<Cubit, FormDataState>( Widget build(BuildContext context) => BlocBuilder<Cubit, FormDataState>(
buildWhen: (previous, current) => previous.status != current.status,
builder: (context, state) => builder.call( builder: (context, state) => builder.call(
context, context,
context.read<Cubit>(), context.read<Cubit>(),