Flutter调用API连接失败:Swagger正常但移动端报网络不可达错误
解决Flutter移动端调用API报"Network is unreachable (errno=101)"的问题
排查与解决步骤
1. 确认设备与API服务器的网络连通性
你用的是局域网IP 192.168.18.2,先检查移动端设备(手机/模拟器)和API服务器是否在同一WiFi网段:
- 真机:直接看手机连接的WiFi是否和服务器一致;
- Android模拟器:部分模拟器默认网络可能和主机局域网隔离,尝试切换模拟器的网络模式为“桥接”,或者用主机的局域网IP直接访问;
- iOS模拟器:直接使用局域网IP即可,无需特殊配置。
2. 配置Android网络权限与明文HTTP允许
- 先在
android/app/src/main/AndroidManifest.xml中添加基础网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - Android 9及以上默认禁止明文HTTP请求,需配置网络安全策略:
在android/app/src/main/res/xml下新建network_security_config.xml,内容如下:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>AndroidManifest.xml的<application>标签中引用该配置:<application ... android:networkSecurityConfig="@xml/network_security_config">
3. 配置iOS的HTTP请求权限
iOS 10及以上默认限制明文HTTP请求,需在ios/Runner/Info.plist中添加配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
如果想更严格,也可以只允许指定IP的明文请求:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>192.168.18.2</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
4. 检查API服务器的防火墙与端口
确认服务器的防火墙没有拦截移动端设备的IP访问1111端口,也可以在移动端浏览器直接访问http://192.168.18.2:1111/predict,验证网络是否能连通。
5. 代码辅助排查
可以在请求前添加日志,确认网络状态和请求地址:
import 'package:connectivity_plus/connectivity_plus.dart'; // 在try块前添加 var connectivityResult = await (Connectivity().checkConnectivity()); print('当前网络状态: $connectivityResult'); print('请求地址: $uri');
内容的提问来源于stack exchange,提问作者amad durrani
相关产品推荐
相关产品推荐

