You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Flutter调用ViaCEP API时的‘Failed host lookup’错误

解决Flutter调用ViaCEP API时的"Failed host lookup: 'viacep.com.br'"错误

问题描述

调用ViaCEP API时出现域名解析失败错误,报错栈如下:

_NativeSocket.lookup.<anonymous closure> (dart:io-patch/socket_patch.dart:520)
<asynchronous gap> (Unknown Source:0)
_NativeSocket.staggeredLookup.<anonymous closure>.lookupAddresses.<anonymous closure> (dart:io-patch/socket_patch.dart:0)
<asynchronous gap> (Unknown Source:0)

已在AndroidManifest.xml中添加INTERNET权限,API本身可正常访问,代码基于基础Flutter项目,通过悬浮按钮发起请求:

import 'package:flutter/material.dart';
import 'package:http/http.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Título',
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          var response = await get(Uri.parse("https://viacep.com.br/ws/01001000/json/"));
          print(response.body);
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

解决方法

  • 确认权限放置位置正确
    INTERNET权限必须放在AndroidManifest.xml的<manifest>根标签下,不能嵌套在<application>标签内。正确示例:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.your_app_package">
    
        <!-- 权限在此处声明 -->
        <uses-permission android:name="android.permission.INTERNET"/>
    
        <application
            android:label="your_app_name"
            android:icon="@mipmap/ic_launcher">
            ...
        </application>
    </manifest>
    
  • 清理项目缓存并重启
    执行以下命令清理缓存,然后重启开发环境和设备:

    flutter clean
    flutter pub get
    

    重新运行项目,避免Flutter缓存导致权限未生效。

  • 验证设备/模拟器网络连接
    在设备的浏览器中直接访问https://viacep.com.br/ws/01001000/json/,确认能正常返回JSON数据。如果浏览器也无法访问,排查设备网络问题(如代理、防火墙、Wi-Fi连接异常)。

  • 检查代理设置
    如果开发环境使用了代理,Flutter可能未同步代理配置导致域名解析失败。尝试关闭代理后重新测试,或在Flutter运行时添加代理参数:

    flutter run --dart-define=HTTP_PROXY=http://your-proxy:port
    
  • iOS环境额外检查
    若在iOS设备/模拟器上测试,确保Info.plist中未限制HTTPS请求。默认情况下iOS允许HTTPS,但若有自定义配置,需确认:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
    </dict>
    

    若需允许特定域名,可添加NSExceptionDomains配置,但ViaCEP的HTTPS请求无需额外配置。

内容的提问来源于stack exchange,提问作者Leonarda Saad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:25:36