<%_ const baseName = context.baseName; const entityInstance = context.entityInstance; const entityFileName = context.entityFileName; const entityClassPlural = context.entityClassPlural; const entityClassPluralLowered = context.entityClassPluralLowered; const entityClass = context.entityClass; const entityClassCamelCase = context.entityClassCamelCase; const entityClassKebabCase = context.entityClassKebabCase; const entityClassKebabCasePlural = context.entityClassKebabCasePlural; const camelizedUpperFirstBaseName = context.camelizedUpperFirstBaseName; const fields = context.fields; const relationships = context.relationships; const primaryKeyType = context.primaryKeyType; const enableTranslation = context.enableTranslation; const hasDateTime = context.hasDateTime; _%> <%_ if(hasDateTime) { _%> import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:intl/intl.dart'; <%_ } _%> import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:<%= baseName %>/entities/<%= entityFileName %>/bloc/<%= entityFileName %>_bloc.dart'; <%_ if(enableTranslation) { _%> import 'package:<%= baseName %>/generated/l10n.dart'; <%_ } _%> import 'package:flutter/material.dart'; import 'package:formz/formz.dart'; import 'package:<%= baseName %>/shared/repository/http_utils.dart'; import 'package:<%= baseName %>/entities/<%= entityFileName %>/<%= entityFileName %>_model.dart'; import '<%= entityFileName %>_route.dart'; class <%= entityClass %>UpdateScreen extends StatelessWidget { <%= entityClass %>UpdateScreen({Key key}) : super(key: <%= entityClass %>Routes.editScreenKey); @override Widget build(BuildContext context) { return BlocListener<<%= entityClass %>Bloc, <%= entityClass %>State>( listener: (context, state) { if(state.formStatus.isSubmissionSuccess){ Navigator.pushNamed(context, <%= entityClass %>Routes.list); } }, child: Scaffold( appBar: AppBar( centerTitle: true, title: BlocBuilder<<%= entityClass %>Bloc, <%= entityClass %>State>( buildWhen: (previous, current) => previous.editMode != current.editMode, builder: (context, state) { String title = state.editMode == true ? <%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %>UpdateTitle<%_ } else { _%>'Edit <%= entityClassPlural %>'<%_ } _%>: <%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %>CreateTitle<%_ } else { _%>'Create <%=entityClassPlural%>'<%_ } _%>; return Text(title); } ), ), body: SingleChildScrollView( padding: const EdgeInsets.all(15.0), child: Column(children: [settingsForm(context)]), ), ), ); } Widget settingsForm(BuildContext context) { return Form( child: Wrap(runSpacing: 15, children: [ <%_ fields.forEach(field => { _%> <%= field.fieldName %>Field(), <%_ }); _%> validationZone(), submit(context) ]), ); } <%_ fields.forEach(field => { _%> <%_ if(field.fieldType === 'DateTime') { _%> Widget <%= field.fieldName %>Field() { return BlocBuilder<<%= entityClass %>Bloc, <%= entityClass %>State>( buildWhen: (previous, current) => previous.<%= field.fieldName %> != current.<%= field.fieldName %>, builder: (context, state) { return DateTimeField( controller: context.bloc<<%= entityClass %>Bloc>().<%= field.fieldName %>Controller, onChanged: (value) { context.bloc<<%= entityClass %>Bloc>().add(<%= field.fieldNameCapitalized %>Changed(<%= field.fieldName %>: value)); }, format: DateFormat.yMMMMd(<%_ if(enableTranslation) { _%>S.of(context).locale<%_ } else { _%>'en'<%_ } _%>), keyboardType: TextInputType.datetime, decoration: InputDecoration(labelText: <%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %><%= field.fieldNameCapitalized %>Field<%_ } else { _%>'<%= field.fieldName %>'<%_ } _%>,), onShowPicker: (context, currentValue) { return showDatePicker( locale: Locale(<%_ if(enableTranslation) { _%>S.of(context).locale<%_ } else { _%>'en'<%_ } _%>), context: context, firstDate: DateTime(1950), initialDate: currentValue ?? DateTime.now(), lastDate: DateTime(2050)); }, ); } ); } <%_ } else if (field.fieldIsEnum) {_%> Widget <%= field.fieldName %>Field() { return BlocBuilder<<%= entityClass %>Bloc,<%= entityClass %>State>( buildWhen: (previous, current) => previous.<%= field.fieldName %> != current.<%= field.fieldName %>, builder: (context, state) { return Padding( padding: const EdgeInsets.only(left: 3.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(<%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %><%= field.fieldNameCapitalized %>Field<%_ } else { _%>'<%= field.fieldName %>'<%_ } _%>, style: Theme.of(context).textTheme.bodyText1,), DropdownButton<<%= field.fieldType %>>( value: state.<%= field.fieldName %>.value, onChanged: (value) { context.bloc<<%= entityClass %>Bloc>().add(<%= field.fieldNameCapitalized %>Changed(<%= field.fieldName %>: value)); }, items: createDropdown<%= field.fieldType %>Items(<%= field.fieldType %>.values)), ], ), ); }); } <%_ } else if (field.fieldType === 'bool') {_%> Widget <%= field.fieldName %>Field() { return BlocBuilder<<%= entityClass %>Bloc,<%= entityClass %>State>( buildWhen: (previous, current) => previous.<%= field.fieldName %> != current.<%= field.fieldName %>, builder: (context, state) { return Padding( padding: const EdgeInsets.only(left: 3.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(<%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %><%= field.fieldNameCapitalized %>Field<%_ } else { _%>'<%= field.fieldName %>'<%_ } _%>, style: Theme.of(context).textTheme.bodyText1,), Switch( value: state.<%= field.fieldName %>.value, onChanged: (value) { context.bloc<<%= entityClass %>Bloc>().add(<%= field.fieldNameCapitalized %>Changed(<%= field.fieldName %>: value)); }, activeColor: Theme.of(context).primaryColor,), ], ), ); }); } <%_ } else {_%> Widget <%= field.fieldName %>Field() { return BlocBuilder<<%= entityClass %>Bloc, <%= entityClass %>State>( buildWhen: (previous, current) => previous.<%= field.fieldName %> != current.<%= field.fieldName %>, builder: (context, state) { return TextFormField( controller: context.bloc<<%= entityClass %>Bloc>().<%= field.fieldName %>Controller, onChanged: (value) { context.bloc<<%= entityClass %>Bloc>() .add(<%= field.fieldNameCapitalized %>Changed(<%= field.fieldName %>: <%_ if(field.fieldType === 'int') { _%> int.parse(value) <%_ } else { _%> value <%_ } _%>)); }, keyboardType: <%_ if(field.fieldType === 'int') { _%> TextInputType.number,<%_ } else { _%> TextInputType.text,<%_ } _%> decoration: InputDecoration( labelText: <%_ if(enableTranslation) { _%>S.of(context).pageEntities<%= entityClass %><%= field.fieldNameCapitalized %>Field<%_ } else { _%>'<%= field.fieldName %>'<%_ } _%>)); } ); } <%_ } _%> <%_ }); _%> <%_ fields.forEach(field => { _%> <%_ if(field.fieldIsEnum) { _%> List>> createDropdown<%= field.fieldType %>Items(List<<%= field.fieldType %>> <%= field.fieldName %>s) { List>> <%= field.fieldName %>DropDown = []; for (<%= field.fieldType %> <%= field.fieldName %> in <%= field.fieldName %>s) { DropdownMenuItem<<%= field.fieldType %>> dropdown = DropdownMenuItem<<%= field.fieldType %>>( value: <%= field.fieldName %>, child: Text(<%= field.fieldName %>.toString())); <%= field.fieldName %>DropDown.add(dropdown); } return <%= field.fieldName %>DropDown; } <%_ } _%> <%_ }); _%> Widget validationZone() { return BlocBuilder<<%= entityClass %>Bloc, <%= entityClass %>State>( buildWhen:(previous, current) => previous.formStatus != current.formStatus, builder: (context, state) { return Visibility( visible: state.formStatus.isSubmissionFailure || state.formStatus.isSubmissionSuccess, child: Center( child: generateNotificationText(state, context), )); }); } Widget generateNotificationText(<%= entityClass %>State state, BuildContext context) { String notificationTranslated = ''; MaterialColor notificationColors; if (state.generalNotificationKey.toString().compareTo(HttpUtils.errorServerKey) == 0) { notificationTranslated = <%_ if(enableTranslation) { _%>S.of(context).genericErrorServer<%_ } else { _%>'Something wrong when calling the server, please try again'<%_ } _%>; notificationColors = Theme.of(context).errorColor; } else if (state.generalNotificationKey.toString().compareTo(HttpUtils.badRequestServerKey) == 0) { notificationTranslated = <%_ if(enableTranslation) { _%>S.of(context).genericErrorBadRequest<%_ } else { _%>'Something wrong happened with the received data'<%_ } _%>; notificationColors = Theme.of(context).errorColor; } return Text( notificationTranslated, textAlign: TextAlign.center, style: TextStyle(fontSize: Theme.of(context).textTheme.bodyText1.fontSize, color: notificationColors), ); } submit(BuildContext context) { return BlocBuilder<<%= entityClass %>Bloc, <%= entityClass %>State>( buildWhen: (previous, current) => previous.formStatus != current.formStatus, builder: (context, state) { String buttonLabel = state.editMode == true ? <%_ if(enableTranslation) { _%>S.of(context).entityActionEdit.toUpperCase()<%_ } else { _%>'Edit'<%_ } _%> : <%_ if(enableTranslation) { _%>S.of(context).entityActionCreate.toUpperCase()<%_ } else { _%>'Create'<%_ } _%>; return RaisedButton( child: Container( width: MediaQuery.of(context).size.width, child: Center( child: Visibility( replacement: CircularProgressIndicator(value: null), visible: !state.formStatus.isSubmissionInProgress, child: Text(buttonLabel), ), )), onPressed: state.formStatus.isValidated ? () => context.bloc<<%= entityClass %>Bloc>().add(<%= entityClass %>FormSubmitted()) : null, ); } ); } }