0

I am trying to see if a username already exist in the database or not, using the following code:

  Future<bool> checkUsername(userName) async {
    try {
      final response = await http.post(
        Uri.parse('http://10.0.2.2:3000/username'),
        headers: {'Content-Type': 'application/json'},
        body: json.encode({'user_name': userName}),
      );

      print('response ${response.body}'); // this prints out "response null"

      if (response.body.isEmpty || response.body == null) {
        print('eee here0');
        return false;
      } else if (json.decode(response.body)['user_id'] == userId) {
        print('eee here1');
        return false;
      } else {
        print('eee here2');
        return true;
      }
    } catch (e) {
      print('some error happenede checking username  $e');
      throw (e);
    }
  }

But it seems the conditions doesn't work and the following exception arises:

Exception has occurred.
NoSuchMethodError (NoSuchMethodError: The method '[]' was called on null.
Receiver: null
Tried calling: []("user_id"))

Even when the result for print('response ${response.body}'); is response null it seems the if statement can't catch it before throwing the exception!

Hasani
  • 3,543
  • 14
  • 65
  • 125

4 Answers4

0

I modified the code like following and now it works as expected:

  var decodedResponse = json.decode(response.body);

  if ( decodedResponse == null) {
    print('eee here0');
    return false;
  } else if (decodedResponse['user_id'] == userId) {
    print('eee here1');
    return false;
  } else {
    print('eee here2');
    return true;
  }
} catch (e) {
  print('some error happenede checking username  $e');
  throw (e);
}
  
Hasani
  • 3,543
  • 14
  • 65
  • 125
0

The issue is related to the order of conditions in your if statement. In Dart, null is considered an empty value. Therefore, response.body.isEmpty will throw a NoSuchMethodError if response.body is null.

You should check if response.body is null before calling any method on it. Your revised condition should look like this:

  if (response.body == null || response.body.isEmpty) {
     print('eee here0');
     return false;
  }

After modifying this, your code should correctly handle cases where response.body is null. If the response.body is null or empty, it will print "eee here0" and return false.

Also, just to ensure, add a null check before decoding the JSON:

  } else if (response.body != null && json.decode(response.body)['user_id'] == userId) {
     print('eee here1');
     return false;

}

This change ensures that the code doesn't attempt to decode null values.

rblcb
  • 1
  • 1
0

You're misunderstanding your problem. response.body is not the value null but instead is the String "null". This is evident because if response.body were null, then response.body.isEmpty would have thrown a null pointer exception. (Response.body is non-nullable anyway.)

What you should do is:

      if (response.body.isEmpty) {
        print('eee here0');
        return false;
      }

      var responseJson = json.decode(response.body);
      if (responseJson == null) {
        return false;
      } else if (responseJson['user_id'] == userId) {
        print('eee here1');
        return false;
      } else {
        ...
      }
jamesdlin
  • 81,374
  • 13
  • 159
  • 204
-1

use the null-aware operator

  } else if (json.decode(response.body)?['user_id'] == userId) {
Franklin Diaz
  • 309
  • 1
  • 5
  • json.decode(response.body) never returns null at least in the "dart:convert" library, but I assume you're using other library else that does return null. – Franklin Diaz Jul 02 '23 at 22:56