Hey There, i need a help to sync my aplication with my endpoint based in Laravel.
void enviarDetalhesParaAPI(
BuildContext context, Map<String, dynamic> data) async {
setState(() {
isSyncing = true;
});
try {
var dio = Dio();
dio.options.headers['Content-Type'] = 'multipart/form-data';
//ambiente de producao
// var addimageUrl = 'https://$link/api/sync';
//ambiente de desenvolvimento
var addimageUrl = 'http://$link/api/sync';
FormData formData = FormData();
formData.fields.addAll([
MapEntry('latitude', data['latitude'].toString()),
MapEntry('longitude', data['longitude'].toString()),
MapEntry('requerente', data['requerente'].toString()),
MapEntry('bairro', data['bairro'].toString()),
MapEntry('telefone', data['telefone'].toString()),
MapEntry('attold', data['attold'].toString()),
MapEntry('att', data['att'].toString()),
MapEntry('acpold', data['acpold'].toString()),
MapEntry('acp', data['acp'].toString()),
MapEntry('acpd', data['acpd'].toString()),
MapEntry('processnumber', data['processnumber'].toString()),
MapEntry('contribuinte', data['contribuinte'].toString()),
MapEntry('complemento', data['complemento'].toString()),
MapEntry('observacao', data['observacao'].toString()),
MapEntry('user_id', (await Usuario.get())?.id?.toString() ?? '0'),
MapEntry('createdatform', data['createdAt'].toString()),
]);
List<Map<String, dynamic>> fotosFachada =
await SQLHelperPhotos1.getAllPhotosForForm(data['id']);
List<MultipartFile> fotosFachadaFiles = [];
for (var foto in fotosFachada) {
File imageFile = File(foto['imagePath']);
fotosFachadaFiles.add(await MultipartFile.fromFile(
imageFile.path,
filename: basename(imageFile.path),
));
}
for (var file in fotosFachadaFiles) {
formData.files.add(MapEntry('fotosFachadaFiles[]', file));
}
List<Map<String, dynamic>> unidades =
await SQLHelper2.getAllDataForFather(data['id']);
List<Map<String, dynamic>> unidadesData = [];
for (var unidade in unidades) {
Map<String, dynamic> unidadeData = {
'lote': unidade['lote'].toString(),
'relevo': unidade['relevo'].toString(),
'uso': unidade['uso'].toString(),
'muro': unidade['muro'].toString(),
'conservacao': unidade['conservacao'].toString(),
'revestimento': unidade['revestimento'].toString(),
'estrutura': unidade['estrutura'].toString(),
'cobertura': unidade['cobertura'].toString(),
};
unidadesData.add(unidadeData);
List<Map<String, dynamic>> fotosUnidade =
await SQLHelperPhotos.getAllDataForForm(unidade['id']);
List<MultipartFile> fotosUnidadeFiles = [];
for (var foto in fotosUnidade) {
File imageFile = File(foto['imagePath']);
fotosUnidadeFiles.add(await MultipartFile.fromFile(
imageFile.path,
filename: basename(imageFile.path),
));
}
for (var file in fotosUnidadeFiles) {
formData.files.add(MapEntry('fotosUnidadeFiles[]', file));
}
}
String unidadesDataString = jsonEncode(unidadesData);
formData.fields.add(MapEntry('unidades', unidadesDataString));
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: Text('Sincronizando com o Servidor...'),
content: CircularProgressIndicator(),
),
);
var response = await dio.post(addimageUrl, data: formData);
print(unidadesData);
print(response.data);
print(response.headers);
if (response.statusCode == 200) {
print(response);
print('Dados enviados com sucesso para a API');
showSyncSuccessAlert(context);
// SQLHelper.deleteData(data['id']);
// SQLHelper2.deleteData(data['id']);
// SQLHelperPhotos1.deleteData(data['id']);
// SQLHelperPhotos.deleteData(data['id']);
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Sincronização Concluída'),
content: Text('Os dados foram sincronizados com sucesso.'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => HomeScreen(),
),
);
},
child: Text('OK'),
),
],
),
);
} else {
print(
'Erro ao enviar dados para a API. Código de status: ${response.statusCode}');
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Erro ao sincronizar com o servidor!'),
content: Text(
'Os não dados foram sincronizados, tente novamete mais tarde!'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => HomeScreen(),
),
);
},
child: Text('OK'),
),
],
),
);
}
} catch (e) {
print('Erro durante o envio dos dados para a API: $e');
}
}