【问题标题】:Dart Unhandled Exception: FormatException: Invalid radix-10 number (at character 1)Dart 未处理的异常:FormatException:无效的 radix-10 数字(在字符 1 处)
【发布时间】:2021-06-11 15:37:52
【问题描述】:

我正在尝试从互联网上获取一些数据。所以我为一个天气网站做了一个 API 请求。但我收到以下异常 - 未处理的异常:FormatException:无效的 radix-10 数字(在字符 1 处)。这是错误代码:

    [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<…>

这是与之相关的代码:

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

【问题讨论】:

  • 你在滥用Uri.https;它的第一个参数应该是主机名,而不是带有路径的主机名。你应该改用Uri.parse
  • 您还应该避免在小部件树的 build 方法中调用方法,因为每次重建小部件时,getData();将被调用。在 initState 中调用它
  • 谢谢jamesdlin!这帮助很大!
  • 也许我应该提到这是一个在线课程的任务......不过,谢谢!

标签: flutter dart unhandled-exception formatexception


【解决方案1】:

我遇到了这个问题,我解决了只是从 URL 地址中删除 https://

如果您出于某种原因需要在字符串中保留https://,请将Uri.https 替换为Uri.parse

您可以在此处查看完整示例:https://flutter.dev/docs/cookbook/networking/fetch-data

【讨论】:

  • 该死的兄弟,这对于更改 http 包来说太愚蠢了。谢谢!
【解决方案2】:

`在我的情况下,我正在尝试使用

解析 double [ amount = 12.34 ]
int.parse(amount)

所以,改成双倍对我有用`

double.parse(amount) 

【讨论】:

    【解决方案3】:

    该错误是 Dart 试图将 String 转换(解析)为 Integer,但 String 不是有效的以 10 (?) 为底的数字。

    例子:

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

    会扔

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

    应该可以。

    我猜Uri.https 正在尝试int.parse(),以防您提供的地址是 IP/IPv6 地址 (?) 并且它因提供的格式不正确而窒息,正如 jamesdin 在 cmets 中提到的那样。

    【讨论】:

      【解决方案4】:

      使用此代码:

      ...
      final uri = Uri.parse('your url here');
      
      http.Response response = await http.get(uri);
      ...
      

      解决了我的问题

      【讨论】:

        【解决方案5】:

        为了处理这种情况,我们可以使用 Dart 的 try-catch 块:

        try {
          var n = int.parse('n42');
          print(n);
        } on FormatException {
          print('Format error!');
        }
        // Format error!
        

        int class parse() 方法还为我们提供了一种处理带有onError 参数的FormatException 情况的方法。

        var num4 = int.parse("n42", onError: (source) => -1);
        // -1
        

        当抛出异常时,onError 将被调用,source 作为输入字符串。现在我们可以返回一个整数值或 null……在上面的示例中,只要 source 的整数字面值错误,该函数就会返回 -1

        【讨论】:

        【解决方案6】:

        我遇到了类似的问题,但这是因为我在网址末尾添加了“/”,例如 192.168.178.28:8080/,而我只是使用了 192.168.178.28:8080

        我正在使用这样的代码来获取开发或生产的适当 URL。

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

        【讨论】:

          【解决方案7】:

          对于Flutter,你需要两个参数,第一个你需要进入域,第二个是传递子路由

           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': 'pragna@domain.com', 'password': 'usersecretpwd'});
                print(response.body);
              } finally {
                client.close();
              }
            }
          

          【讨论】:

            猜你喜欢
            • 2021-04-07
            • 2021-05-30
            • 1970-01-01
            • 2022-11-14
            • 1970-01-01
            • 1970-01-01
            • 2020-03-07
            • 1970-01-01
            • 2022-11-07
            相关资源
            最近更新 更多