310 lines
13 KiB
Dart
310 lines
13 KiB
Dart
import 'dart:developer';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/appbar.dart';
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/custom_datepicker.dart';
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/custom_input.dart';
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/custom_select.dart';
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/media_upload_button.dart';
|
|
import 'package:hub/components/atomic_components/shared_components_atoms/tabview.dart';
|
|
|
|
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
|
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
|
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
|
import 'package:hub/flutter_flow/internationalization.dart';
|
|
import 'package:hub/flutter_flow/nav/nav.dart';
|
|
import 'package:hub/flutter_flow/upload_data.dart';
|
|
|
|
import 'package:hub/pages/pets_page/pets_page_model.dart';
|
|
|
|
class PetsPageWidget extends StatefulWidget {
|
|
PetsPageWidget({super.key});
|
|
|
|
@override
|
|
State<PetsPageWidget> createState() => _PetsPageWidgetState();
|
|
}
|
|
|
|
class _PetsPageWidgetState extends State<PetsPageWidget>
|
|
with SingleTickerProviderStateMixin {
|
|
late PetsPageModel _model;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_model = PetsPageModel();
|
|
_model.tabBarController = TabController(length: 2, vsync: this);
|
|
|
|
_model.textControllerName ??= TextEditingController();
|
|
_model.textFieldFocusName ??= FocusNode();
|
|
|
|
_model.textControllerSpecies ??= TextEditingController();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_model.tabBarController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void _onTextChanged() {
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: appBarPets(context),
|
|
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
|
body: tabViewPets(
|
|
context, _model, _model.tabBarController, safeSetState, setState));
|
|
}
|
|
}
|
|
|
|
PreferredSizeWidget appBarPets(BuildContext context) {
|
|
return AppBarUtil(title: 'Pets', onBackButtonPressed: () => context.pop());
|
|
}
|
|
|
|
Widget tabViewPets(BuildContext context, PetsPageModel _model, controller,
|
|
Function safeSetState, Function setState) {
|
|
return TabViewUtil(
|
|
context: context,
|
|
model: _model,
|
|
labelTab1: 'Cadastrar',
|
|
labelTab2: 'Consultar',
|
|
controller: controller,
|
|
widget1: formAddPets(context, _model, safeSetState, setState),
|
|
widget2: Center(child: Text('Consultar')),
|
|
);
|
|
}
|
|
|
|
Widget formAddPets(BuildContext context, PetsPageModel _model,
|
|
Function safeSetState, Function setState) {
|
|
bool _isFormValid(BuildContext context) {
|
|
log('Validando Formulário');
|
|
if (_model.uploadedLocalFile.bytes?.isEmpty ?? true) {
|
|
return false;
|
|
}
|
|
if (_model.textControllerName.text.isEmpty) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
final _formKey = GlobalKey<FormState>();
|
|
return SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Align(
|
|
alignment: const AlignmentDirectional(-1.0, 0.0),
|
|
child: Padding(
|
|
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 20, 0.0, 15),
|
|
child: Text(
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Preencha o formulário com os dados do seu Pet',
|
|
enText: 'Fill out the form with your Pet\'s data',
|
|
),
|
|
textAlign: TextAlign.start,
|
|
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
|
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
|
letterSpacing: 0.0,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(
|
|
FlutterFlowTheme.of(context).bodyMediumFamily),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Form(
|
|
key: _formKey,
|
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 10, 0, 20),
|
|
child: MediaUploadButtonUtil(
|
|
uploadedFile: _model.uploadedLocalFile,
|
|
isUploading: _model.isDataUploading,
|
|
labelText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Clique para adicionar a foto de seu Pet',
|
|
enText: 'Click to add your Pet\'s photo'),
|
|
),
|
|
),
|
|
CustomInputUtil(
|
|
controller: _model.textControllerName,
|
|
validator:
|
|
_model.textControllerNameValidator.asValidator(context),
|
|
labelText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Nome', enText: 'Name'),
|
|
hintText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Nome', enText: 'Name'),
|
|
suffixIcon: Icons.person,
|
|
haveMaxLength: true,
|
|
maxLength: 80,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomInputUtil(
|
|
controller: _model.textControllerSpecies,
|
|
labelText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Espécie', enText: 'Species'),
|
|
hintText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Espécie', enText: 'Species'),
|
|
suffixIcon: Icons.pest_control,
|
|
haveMaxLength: false,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomInputUtil(
|
|
controller: _model.textControllerRace,
|
|
labelText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Raça', enText: 'Race'),
|
|
hintText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Raça', enText: 'Race'),
|
|
suffixIcon: Icons.pets,
|
|
haveMaxLength: false,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomInputUtil(
|
|
controller: _model.textControllerColor,
|
|
labelText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Cor', enText: 'Color'),
|
|
hintText: FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Cor', enText: 'Color'),
|
|
suffixIcon: Icons.invert_colors,
|
|
haveMaxLength: false,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomDatePickerUtil(
|
|
controller: _model.textControllerData,
|
|
focusNode: _model.textFieldFocusData,
|
|
hintText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Data de Nascimento', enText: 'Birth Date'),
|
|
dateFormat: 'dd/MM/yyyy HH:mm:ss',
|
|
locale: FFLocalizations.of(context).languageCode,
|
|
firstDate: DateTime(2000),
|
|
lastDate: DateTime.now(),
|
|
timePicker: false,
|
|
validator: (value) {
|
|
if (value == null || value.isEmpty) {
|
|
return 'Por favor, selecione uma data';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
),
|
|
Align(
|
|
alignment: const AlignmentDirectional(-1.0, 0.0),
|
|
child: Padding(
|
|
padding: const EdgeInsetsDirectional.fromSTEB(
|
|
24.0, 0, 0.0, 15),
|
|
child: Text(
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Selecione as opções disponíveis',
|
|
enText: 'Select the available options',
|
|
),
|
|
textAlign: TextAlign.start,
|
|
style: FlutterFlowTheme.of(context).bodySmall.override(
|
|
fontFamily:
|
|
FlutterFlowTheme.of(context).bodySmallFamily,
|
|
letterSpacing: 0.0,
|
|
fontWeight: FontWeight.w600,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(
|
|
FlutterFlowTheme.of(context)
|
|
.bodyMediumFamily),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomSelect(
|
|
options: const ['MAC', 'FEM'],
|
|
controller: _model.dropDownValueController1,
|
|
optionsLabel: [
|
|
FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Macho', enText: 'Male'),
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Fêmea', enText: 'Female')
|
|
],
|
|
hintText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Selecione o gênero do Pet',
|
|
enText: 'Select the gender of the Pet')),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 15),
|
|
child: CustomSelect(
|
|
options: const ['MIN', 'PEQ', 'MED', 'GRA', 'GIG'],
|
|
controller: _model.dropDownValueController1,
|
|
optionsLabel: [
|
|
FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Mini', enText: 'Mini'),
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Pequeno', enText: 'Small'),
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Médio', enText: 'Medium'),
|
|
FFLocalizations.of(context)
|
|
.getVariableText(ptText: 'Grande', enText: 'Big'),
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Gigante', enText: 'Giant'),
|
|
],
|
|
hintText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Selecione o porte do Pet',
|
|
enText: 'Select the size of the Pet')),
|
|
),
|
|
Align(
|
|
alignment: const AlignmentDirectional(-1.0, 0.0),
|
|
child: Padding(
|
|
padding: const EdgeInsetsDirectional.fromSTEB(
|
|
24.0, 0, 0.0, 15),
|
|
child: Text(
|
|
FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Você tem alguma observação sobre o seu Pet?',
|
|
enText:
|
|
'Do you have any observations about your Pet?',
|
|
),
|
|
textAlign: TextAlign.start,
|
|
style: FlutterFlowTheme.of(context).bodySmall.override(
|
|
fontFamily:
|
|
FlutterFlowTheme.of(context).bodySmallFamily,
|
|
letterSpacing: 0.0,
|
|
fontWeight: FontWeight.w600,
|
|
useGoogleFonts: GoogleFonts.asMap().containsKey(
|
|
FlutterFlowTheme.of(context)
|
|
.bodyMediumFamily),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
CustomInputUtil(
|
|
controller: _model.textControllerObservation,
|
|
labelText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Escreva as suas observações aqui...',
|
|
enText: 'Write your observations here...'),
|
|
hintText: FFLocalizations.of(context).getVariableText(
|
|
ptText: 'Escreva as suas observações aqui...',
|
|
enText: 'Write your observations here...'),
|
|
suffixIcon: Icons.text_fields,
|
|
haveMaxLength: true,
|
|
maxLength: 80,
|
|
),
|
|
ElevatedButton(
|
|
onPressed: _isFormValid(context) ? () {} : () {},
|
|
child: Text('Cadastrar')),
|
|
])),
|
|
],
|
|
),
|
|
);
|
|
}
|