Флаттер: Как обработать исключение для пустого пути изображения / файла? - PullRequest
0 голосов
/ 04 марта 2020

введите описание изображения здесь Мой вызов API работает, когда все поля не пусты. Но я просто хочу обновить текстовые поля без обновления изображения. И когда я запускаю кнопку обновления. Он показывает: Необработанное исключение: NoSuchMethodError: Получатель 'path' был вызван для нуля. Получатель: ноль Пробный вызов: путь

Это мой POST в 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);
  }
});

}

Это мое обновление

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');
  });
}

}

Это моя функция получения изображения

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

}

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Таким образом, по сути, он говорит, что img имеет значение null, и вы пытаетесь получить доступ к методу .path () для нулевого объекта.

Так что, чтобы остановить это, вам нужно обернуть свои вещи нулевыми проверками. Есть более приятные способы сделать это в dart, например img?.path(), где он будет выполняться только path(), если img не равен нулю.

Однако самый простой способ заставить ваш код работать, это обернуть его в if for часть изображения.

Попробуйте это:

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);
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();
if(img != null)
{
    var mimeTypeData =
    lookupMimeType(img.path, headerBytes: [0xFF, 0xD8]).split('/');
    var file = await http.MultipartFile.fromPath('nric_front_copy', img.path,
    contentType: MediaType(mimeTypeData[0], mimeTypeData[1]));
    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);
  }
});
0 голосов
/ 04 марта 2020
    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);
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...