Flutter中Android真机如何连接本地Web服务器并调用API
解决Flutter Android真机连接本地Web服务器的问题
核心原因
10.0.2.2是Android模拟器专属的本机映射地址,真机无法识别这个地址——因为真机和你的电脑是同一局域网内的独立设备,必须用电脑的局域网IP地址才能访问本地服务器。
具体解决步骤
替换API地址中的IP
先找到你电脑的局域网IPv4地址:- Windows:打开命令提示符,输入
ipconfig,找到当前网络(WiFi/以太网)的IPv4地址(比如192.168.3.105) - Mac/Linux:打开终端,输入
ifconfig或ip addr,找到本地网卡的inet地址
把代码中的API地址替换成对应IP:
Uri.parse("http://192.168.3.105:8000/api/login") // 替换成你的电脑局域网IP- Windows:打开命令提示符,输入
确保设备在同一局域网
Android真机和电脑必须连接同一个WiFi网络;如果用USB调试,也可以开启电脑的USB网络共享功能,让真机通过USB共享电脑网络。关闭电脑防火墙(或添加端口规则)
电脑防火墙可能拦截真机的请求,先暂时关闭防火墙测试连接。如果不想关闭防火墙,可以在防火墙设置中添加入站规则,允许8000端口的TCP连接。配置本地服务器监听所有网卡
很多本地服务器默认只监听localhost(127.0.0.1),只有本机能访问,需要修改配置让它监听0.0.0.0:- Django:启动命令改为
python manage.py runserver 0.0.0.0:8000 - Node.js:将监听地址从
localhost改为0.0.0.0,比如app.listen(8000, '0.0.0.0') - PHP内置服务器:启动命令改为
php -S 0.0.0.0:8000
- Django:启动命令改为
检查Android网络权限
确保项目的android/app/src/main/AndroidManifest.xml中添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />Flutter新项目默认包含这个权限,但旧项目可能需要手动添加。
修改后的示例代码
Future login(email, password) async { LoginResponseModel? loginResponseModel; Map<String, String> body = { "email": email, "password": password, }; var response = await myhttp.post( Uri.parse( "http://192.168.3.105:8000/api/login", // 替换为你的电脑局域网IP ), body: body, // headers: headers, ); if (response.statusCode == 401) { ScaffoldMessenger.of(context) ..hideCurrentMaterialBanner() ..showMaterialBanner(materialBanner); } else { loginResponseModel = LoginResponseModel.fromJson( json.decode(response.body), ); saveUser(loginResponseModel.data.token, loginResponseModel.data.name); // print("result:" + response.body); } }
内容的提问来源于stack exchange,提问作者ZAB
相关产品推荐
相关产品推荐

