Search code examples
flutterdartnosuchmethoderror

Flutter: How to handle exception for image/file empty path?


enter image description hereMy API call works when all the fields are not empty.

But, I just want to update textfields without updating image. And when I trigger update button.

It shows:Unhandled Exception: NoSuchMethodError: The getter 'path' was called on null.
Receiver: null
Tried calling: path

This is my POST in API_CODE_FOLDER

void updateData(
BuildContext context,
int id,
int userID,
String name,
String nric,
String dob,
File img,
String mobileNo,
int gender,
String nationality,
int race,
int religion,
String occupation,
String maritalStatus,
String deleteAt,
String createAt,
String updateAt,)async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final mimeTypeData =
    lookupMimeType(img.path, headerBytes: [0xFF, 0xD8]).split('/');
final file = await http.MultipartFile.fromPath('nric_front_copy', img.path,
    contentType: MediaType(mimeTypeData[0], mimeTypeData[1]));
refreshTokenApi(context);
print('UPDATE MOU');
accessToken = prefs.getString('access_token');
String myUrl = "$_url/personal_info";
var url = Uri.parse(myUrl);
var request = new http.MultipartRequest("POST", url);
request.headers['Accept'] = 'application/json';
request.headers['Authorization'] = 'Bearer $accessToken';
request.fields['id'] = id.toString();
request.fields['user_id'] = id.toString();
request.fields['name'] = name.trim();
request.fields['nric'] = nric.trim();
request.fields['date_of_birth'] = dob.trim();
request.files..add(file);
request.fields['mobile_no'] = mobileNo.trim();
request.fields['gender'] = gender.toString();
request.fields['nationality'] = nationality.trim();
request.fields['race_id'] = race.toString();
request.fields['religion_id'] = religion.toString();
request.fields['occupation'] = occupation.toString();
request.fields['marital_status'] = maritalStatus.toString();
request.fields['deleted_at'] = '';
request.fields['created_at'] = '';
request.fields['updated_at'] = '';
request.fields['_method'] = 'PATCH';
request.send().then((response){
  print(response.statusCode);
  print(response);
     if (response.statusCode == 200) {
    Navigator.pushReplacementNamed(context, '/Dashboard');
    print("updated!");
  } else if (response.statusCode != 201) {
    print(response.statusCode);
  }
});

}

This is my update

void updateButton() async {
print('TAPPED Update Button');
final SharedPreferences prefs = await SharedPreferences.getInstance();
// IF id & user_id is not empty then UPDATE.
if (prefs.getInt('id') != null || prefs.getInt('user_id') != null) {
    setState((){
    _gender = genderCon.text.isEmpty ? 1 : int.parse(genderCon.text);
    race = raceCon.text.isEmpty ? 2 : int.parse(raceCon.text);
    religion = religionCon.text.isEmpty ? 3 : int.parse(religionCon.text);
    _nric = icCon.text;
    _dob = dobCon.text;
    _name = nameCon.text;
    print(nameCon.text);
    print(nameCon.text.trim());
    callApi.updateData(
        context,
        id,
        userID,
        _name,
        _nric,
        _dob,
        _image,
        phoneCon.text,
        _gender,
        nationality,
        race,
        religion,
        occupation,
        maritalStatus,
        deleteAt,
        createAt,
        updateAt);
    print('UPDATE');
  });
}

}

This is my get image function

 void getImage() async {
var image = await ImagePicker.pickImage(
    source: ImageSource.gallery, imageQuality: 100);
setState(() {
  _image = image;
  Navigator.of(context);
});

}


Solution

  •     void updateData(
        BuildContext context,
        int id,
        int userID,
        String name,
        String nric,
        String dob,
        File img,
        String mobileNo,
        int gender,
        String nationality,
        int race,
        int religion,
        String occupation,
        String maritalStatus,
        String deleteAt,
        String createAt,
        String updateAt,)async {
        final SharedPreferences prefs = await SharedPreferences.getInstance();
        refreshTokenApi(context);
        print('UPDATE MOU');
        accessToken = prefs.getString('access_token');
        String myUrl = "$_url/personal_info";
        var url = Uri.parse(myUrl);
        var request = new http.MultipartRequest("POST", url);
    
        if(img != null){
           final mimeTypeData =
                lookupMimeType(img.path, headerBytes: [0xFF, 0xD8]).split('/');
        final file = await http.MultipartFile.fromPath('nric_front_copy', img.path,
    
               contentType: MediaType(mimeTypeData[0], mimeTypeData[1]));
               request.files..add(file);
    
            }
    
        request.headers['Accept'] = 'application/json';
        request.headers['Authorization'] = 'Bearer $accessToken';
        request.fields['id'] = id.toString();
        request.fields['user_id'] = id.toString();
        request.fields['name'] = name.trim();
        request.fields['nric'] = nric.trim();
        request.fields['date_of_birth'] = dob.trim();
        request.fields['mobile_no'] = mobileNo.trim();
        request.fields['gender'] = gender.toString();
        request.fields['nationality'] = nationality.trim();
        request.fields['race_id'] = race.toString();
        request.fields['religion_id'] = religion.toString();
        request.fields['occupation'] = occupation.toString();
        request.fields['marital_status'] = maritalStatus.toString();
        request.fields['deleted_at'] = '';
        request.fields['created_at'] = '';
        request.fields['updated_at'] = '';
        request.fields['_method'] = 'PATCH';
        request.send().then((response){
          print(response.statusCode);
          print(response);
             if (response.statusCode == 200) {
            Navigator.pushReplacementNamed(context, '/Dashboard');
            print("updated!");
          } else if (response.statusCode != 201) {
            print(response.statusCode);
          }
        });