如何修复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:portiOS环境额外检查
若在iOS设备/模拟器上测试,确保Info.plist中未限制HTTPS请求。默认情况下iOS允许HTTPS,但若有自定义配置,需确认:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> </dict>若需允许特定域名,可添加
NSExceptionDomains配置,但ViaCEP的HTTPS请求无需额外配置。
内容的提问来源于stack exchange,提问作者Leonarda Saad
相关产品推荐
相关产品推荐

