I am trying to fetch some Data from the internet. So I made a API Request for a weather website. But I am getting the following exception- Unhandled Exception: FormatException: Invalid radix-10 number (at character 1). This is the error Code:

    [VERBOSE-2:shell.cc(242)] Dart Unhandled Exception: FormatException: Invalid radix-10 number (at character 1)
//uri.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=4659036c3236...
^
, stack trace: #0      int._throwFormatException (dart:core-patch/integers_patch.dart:131:5)
#1      int._parseRadix (dart:core-patch/integers_patch.dart:157:16)
#2      int._parse (dart:core-patch/integers_patch.dart:100:12)
#3      int.parse (dart:core-patch/integers_patch.dart:63:12)
#4      _Uri._makeHttpUri (dart:core/uri.dart:1591:49)
#5      new _Uri.https (dart:core/uri.dart:1462:12)
#6      _LoadingScreenState.getData (package:clima/screens/loading_screen.dart:25:49)
#7      _LoadingScreenState.build (package:clima/screens/loading_screen.dart:37:5)
#8      StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4495:15)
#10     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4<…>

This is the code that goes with that:

import 'package:flutter/material.dart';
import 'package:clima/services/location.dart';
import 'package:http/http.dart' as http;

class LoadingScreen extends StatefulWidget {
  @override
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {
  @override
  void initState() {
    super.initState();
    getLocation();
  }

  void getLocation() async {
    Location location = Location();
    await location.getCurrentLocation();
    print(location.latitude);
    print(location.longitude);
  }

  void getData() async {
    http.Response response = await http.get(Uri.https(
        'https://uri.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=4659036c323608514eb865c174726965',
        'albums/1'));

    if (response.statusCode == 200) {
      String data = response.body;
      print(data);
    } else {}
  }

  @override
  Widget build(BuildContext context) {
    getData();
    return Scaffold();
  }
}


Solution 1: Baker

That error is Dart attempting to convert (parse) a String into an Integer, but the String isn't a valid base 10 (?) number.

Example:

print(int.parse('//ten'));

will throw

print(int.parse('10'));

should work.

I guess that Uri.https is trying an int.parse() in case the address you've supplied is an IP/IPv6 address (?) and its choking on the incorrect supplied format, as mentioned by jamesdin in the comments.


Solution 2: Ângelo Polotto

I faced this problem and I solved just removing the https:// from the URL address.

If you need keep the https:// in your string for some reason, replace Uri.https to Uri.parse

You can see a complete example here: https://flutter.dev/docs/cookbook/networking/fetch-data


Solution 3: Ketan Ramani

`In my case I'm trying to parse double [ amount = 12.34 ] using

int.parse(amount)

So, Changing to double works for me`

double.parse(amount) 


Solution 4: M. Massula

Use this code:

...
final uri = Uri.parse('your url here');

http.Response response = await http.get(uri);
...

Solved the issue to me


Solution 5: biniam

I had a similar issue but this is because I added '/' at the end of the url like 192.168.178.28:8080/ and I just used 192.168.178.28:8080.

I am using a code like this to get the appropriate URL for Development or Production.

  static const String ENV = 'DEV'; // 'PROD';
  static const String API_URL_PROD = "myapi.herokuapp.com";
  static const String API_URL_DEV = "192.168.178.98:8080";

  Uri getUrlForEnv(String endpoint) {

     var url;

     if (Constant.ENV == 'PROD') {
        url = Uri.https(Constant.API_URL_PROD, endpoint);
     } else {
        url = Uri.http(Constant.API_URL_DEV, endpoint);
     }
     return url;
  }


Solution 6: Developer

for Flutter, you need two parameters, in first you need to enter domain, and in second pass the subroute

 void loginUser() async {
  //  Dialogs.showProgressDialog(context: context);
    var client = http.Client();
    try {
      var response = await client.post(
          Uri.https(ApiUrls.BASE_URL,"/user/loginUser"),
          body: {'email': '[email protected]', 'password': 'usersecretpwd'});
      print(response.body);
    } finally {
      client.close();
    }
  }


Solution 7: Amoo Faruk

int.parse(amount);

Change it to

int.parse(amount != null ? amount : '0');


Solution 8: Abraams gtr

You can check that a number is less than 1 with this code

value.numericOnly().characters.first == "0"

Hope this will be helpful :).


Solution 9: Hamza Allane

if you found yourself here and the problem wasn't about uri and you're trying to cast a number just change int.parse into double.parse .