Flutter connection to a local api

27 Views Asked by At

m hosting a c# api locally on my machine , while trying to connect to it from my flutter app i kept getting a timeout . This is not my first time trying to connect to a local api so i know that i have to use my private ip address instead of localhost . Tried to shutdown my firewall but when shutting my public network firewall i started to get a connection refused exception(No idea why).The api is working since i tested it with postman.Any help is appreciated and thank u.

This is my screen code:

import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:geolocator/geolocator.dart';
import 'package:image_picker/image_picker.dart';
import 'package:orange_app/models/pointage_model.dart';
import 'package:orange_app/services/pointage_api.dart';
import 'package:orange_app/ui/views/vente_affiche.dart';
import 'package:orange_app/ui/views/vente_add.dart';
import 'package:orange_app/view_models/pointage_view_model.dart';

class AddPointage extends StatefulWidget {
  const AddPointage({Key? key});

  @override
  State<AddPointage> createState() => _AddVenteState();
}

class _AddVenteState extends State<AddPointage> {
  late final GlobalKey<FormState> _formKey ;
  late final TextEditingController _nom;
  late final TextEditingController _prenom;
  late final TextEditingController _idUserTerrain;
  late double? latitude ;

  late DateTime Date_pointage;
  late double? longitude;

  File? faceImage;

  Position? position;


  @override
  void initState() {
    super.initState();
    _formKey= GlobalKey<FormState>();
    _nom=TextEditingController();
    _prenom=TextEditingController();
    _idUserTerrain=TextEditingController();
    Date_pointage=DateTime.now();
  }
  @override
  void dispose(){
    _nom.dispose();
    _prenom.dispose();
    _idUserTerrain.dispose();
    super.dispose();
  }

  @override
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('New Pointage'),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              Form(
                key: _formKey,
                  child: Column(
                children: [
                  TextFormField(
              validator: (value) {
                          if (value == null || value.isEmpty ) {
                          return 'Please enter some text';
                          }
                          if (RegExp(r'\d').hasMatch(value)) {
                          return 'name should not contain numeric characters';
                          }
                          return null;
                          },
          controller: _nom
                    ,
                    decoration: const InputDecoration(
                      labelText: 'Name',
                      hintText: 'Enter Your Name',
                    ),
                  ),
                  TextFormField(
                    validator: (value) {
                      if (value == null || value.isEmpty ) {
                        return 'Please enter some text';
                      }
                      if (RegExp(r'\d').hasMatch(value)) {
                        return 'last name should not contain numeric characters';
                      }
                      return null;
                    },
                    controller: _prenom,
                    decoration: const InputDecoration(
                      labelText: 'Last Name',
                      hintText: 'Enter Your Last Name',
                    ),
                  ),
                  TextFormField(
    validator: (value) {
    if (value == null || value.isEmpty ) {
    return 'Please enter some text';
    }
    if (RegExp(r'[a-zA-Z]').hasMatch(value)) {
      return 'id should not contain alphabetic characters';
    }return null;},
                    controller: _idUserTerrain,
                    decoration: const InputDecoration(
                      labelText: 'idUserTerrain',
                      hintText: 'Enter idUserTerrain',
                    ),
                  ),
                  ElevatedButton(
                    child: Text('Save'),
                    onPressed: () async {
                      if(_formKey.currentState!.validate())
                      {
                        PointageViewModel.determinePosition().then((value) {
                          setState(() {
                            position = value;
                          });
                        });

                        if (position != null) {
                          var model=PointageModel(nom: _nom.text.trim(), prenom: _prenom.text.trim(), idUserTerrain: int.parse(_idUserTerrain.text.trim()), longitude: position!.longitude, latitude: position!.latitude, datePointage: DateTime.now());
                          bool res=await PointageViewModel.createResponse(model);
                          if(res)
                          {Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => AddVente()),
                          );}
                          else{
                            showDialog(
                              context: context,
                              builder: (BuildContext context) {
                                return AlertDialog(
                                  title: Text('Error'),
                                  content: Text("An error has occured"),
                                  actions: [
                                    TextButton(
                                      onPressed: () {
                                        Navigator.of(context).pop();
                                      },
                                      child: Text("OK"),
                                    ),
                                  ],
                                );
                              },
                            );
                          }
                        } else {
                          showDialog(
                            context: context,
                            builder: (BuildContext context) {
                              return AlertDialog(
                                title: Text('Error'),
                                content: Text("Unable to get current position."),
                                actions: [
                                  TextButton(
                                    onPressed: () {
                                      Navigator.of(context).pop();
                                    },
                                    child: Text("OK"),
                                  ),
                                ],
                              );
                            },
                          );
                        }
                      }
                    },
                  ),
                ],
              )),

// Boutons pour choisir les images
              MaterialButton(
                child: Text('Choose Face Image'),
                onPressed: () async {
                  XFile? xFile = await ImagePicker()
                      .pickImage(source: ImageSource.gallery);
                  if (xFile != null) {
                    setState(() {
                      faceImage = File(xFile.path);
                    });
                  }
                },
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Text('Pointer'),
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => AddVente()));
        },
      ),
    );
  }
}

And this is method where m calling the api:

import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;
import 'package:orange_app/models/pointage_model.dart';
import 'package:orange_app/models/vente_model.dart';

import '../global/config/api_connection.dart';

class PointageApi {

  static Future<http.Response> createPointage(PointageModel model) async {
    var url =Uri.http(Api.apiUrl,Api.baseUrl+Api.addPointage);
    var request = http.MultipartRequest('POST', url);

    // ... (autres parties du code sont inchangées)
    request.fields['nom'] = model.nom;
    request.fields['prénom'] = model.prenom;
    request.fields['IdUserTerrain'] = model.idUserTerrain.toString();
    request.fields['longitude'] = model.longitude.toString();
    request.fields['latitude'] = model.latitude.toString();
    request.fields['date_Pointage'] = model.datePointage.toIso8601String();
    // Ajout des images
    if (model.faceImage!= null) {
      var faceImageBytes = await model.faceImage!.readAsBytes();
      request.files.add(http.MultipartFile.fromBytes(
        'FaceImage',
        faceImageBytes,
        filename: 'faceImage'
      ));
    }

    // Vérifier si aucune image n'est enregistrée
    if (model.faceImage == null) {
      print('Image not uploaded');
    }
    print(request.fields);
    var response = await http.Response.fromStream(await request.send());
    return response;
  }
}

And finally this is the error(or part of it):

E/flutter ( 9791): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: ClientException with SocketException: Connection timed out (OS Error: Connection timed out, errno = 110), address = 192.168.100.59, port = 45756, uri=http://192.168.100.59:5187/api/Vente/AddPointage E/flutter ( 9791): #0 IOClient.send (package:http/src/io_client.dart:154:7) E/flutter ( 9791): E/flutter ( 9791): #1 BaseRequest.send (package:http/src/base_request.dart:133:22) E/flutter ( 9791): E/flutter ( 9791): #2 PointageApi.createPointage (package:orange_app/services/pointage_api.dart:38:51) E/flutter ( 9791): E/flutter ( 9791): #3 PointageViewModel.createResponse (package:orange_app/view_models/pointage_view_model.dart:9:25) E/flutter ( 9791): E/flutter ( 9791): #4 _AddVenteState.build. (package:orange_app/ui/views/pointage.dart:129:36) E/flutter ( 9791): E/flutter ( 9791):

0

There are 0 best solutions below