首页/文章/flutter

Flutter 连接真实手机设备时无法使用localhost

2023-03-16
8013 分钟
...

在使用Flutter编写手机app时,开发过程中想要通过调用本地的后台服务来获取数据,但是每次都会报错:

SocketException: OS Error: Connection refused, errno = 111, address = localhost, port = 38396

这里调用时的api请求路径:http:localhost:10086/auth

之前因为忙于开发,查了下资料都没有解决问题,时间紧,任务重,就直接将后台api部署到云环境,通过调用云函数来获取数据。但是这样做,每次修改api都得部署到云环境上,app才能正确获取数据,很麻烦,但是当时也没有其他的办法和时间,所以将就了。

现在开发阶段已经结束了,趁着有时间,再回过头来调查,经过测试,已完美解决该问题,能够通过调用本地后台api获取数据。深层次的原因还没调查到,待日后调查到根本原因后再记录,这里只记录一下解决方案。

1.首先,我们访问本地后台api时的http请求不能使用 http:localhost:10086/auth 这样的URL,或者 http:127.0.0.1:10086/auth 这样的也不行,需要将这里的 localhost 或 127.0.0.1 替换成 本机的真实 IPv4 地址,例如 192.166.1.12 (获取本机ip地址方式可以参考:Linux获取本机ip 或 Windows获取本机ip),替换后的请求地址就变成了  http:192.166.1.12:10086/auth

2.找到 android/app/src/main/AndroidManifest.xml 这个文件,如果没有就自己创建一个,然后添加如下内容:

1.  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2.      package="com.example.my_app"> 
3.     <application
4.          android:label="my_app"
5.          android:icon="@mipmap/ic_launcher"  
6.          android:usesCleartextTraffic="true"  
7.          >  
8.          <activity   
9.              android:name=".MainActivity"   
10.             android:launchMode="singleTop"   
11.             android:theme="@style/LaunchTheme"  
12.             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" 
13.             android:hardwareAccelerated="true" 
14.             android:windowSoftInputMode="adjustResize">
15.             <!-- Specifies an Android theme to apply to this Activity as soon as
16.  the Android process has started. This theme is visible to the user   
17.  while the Flutter UI initializes. After that, this theme continues
18.  to determine the Window background behind the Flutter UI. -->  
19.             <meta-data 
20.               android:name="io.flutter.embedding.android.NormalTheme"  
21.               android:resource="@style/NormalTheme"  
22.               />
23.             <!-- Displays an Android View that continues showing the launch screen  
24.  Drawable until Flutter paints its first frame, then this splash 
25.  screen fades out. A splash screen is useful to avoid any visual
26.  gap between the end of Android's launch screen and the painting of  
27.  Flutter's first frame. -->  
28.             <meta-data  
29.               android:name="io.flutter.embedding.android.SplashScreenDrawable" 
30.               android:resource="@drawable/launch_background" 
31.               />  
32.             <intent-filter> 
33.                 <action android:name="android.intent.action.MAIN"/> 
34.                 <category android:name="android.intent.category.LAUNCHER"/>  
35.             </intent-filter>  
36.         </activity>  
37.         <!-- Don't delete the meta-data below.  
38.  This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
39.         <meta-data  
40.             android:name="flutterEmbedding" 
41.             android:value="2" /> 
42.     </application>  
43.     <uses-permission android:name="android.permission.INTERNET" />
44. </manifest>

其中重要的是

添加后就像这样:

如果是IOS,需要将下面这段添加到 ios/Runner/info.plist文件中

1.  <key>NSAppTransportSecurity</key>   
2.  <dict>  
3.          <key>NSAllowsArbitraryLoads</key>
4.          <true/> 
5.  </dict>

再次编译运行,成功。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
flutter2026-07-01
Dart 入门回顾
1\. Dart 是什么 Dart 是一门类型安全、支持面向对象、支持异步编程的语言。它的语法和 JavaScript、TypeScript、Java、C# 都有一些相似之处。 Dart 常见使用场景: Flutter 跨平台应用开发 命令行工具 Web 应用 服务端接口或脚本 作为学习现代类型语言的入口 Dart 的几个核心特点: 静态类型:变量、函数返回值、参数都有类型。 类型推断:很多时候可以用 ,让 Dart 自动推断类型。 空...
学习
flutter2026-07-01
Flutter 常用 Widget 入门
Flutter 的核心思想是:一切皆 Widget。文字、图片、按钮、页面结构、布局、间距、滚动、动画、手势,几乎都由 Widget 组合出来。 1\. Widget 先分成几类理解 | 类别 | 常用 Widget | 解决什么问题 | | | | | | 应用入口 | 、 | 搭建应用外壳、主题、路由 | | 页面骨架 | 、 、 | 标准页面结构 | | 基础显示 | 、 、 | 显示文字、图标、图片 | | 布局容器 | 、 、...
学习
flutter2024-11-21
在 Flutter 中使用 webview_flutter 4.0
1. 2. ,已入选 3. 4. 本文是第 4 篇,定位是新手入门,介绍和演示 webview 的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。 环境准备已经在 说过了,不再赘述。既然是新手入门,就会本着详尽的原则,而且会多配示例。 获取页面信息 获取页面 title 核心方法:controller.getTitle 完整示例,放在 main.dart 就能运行。运行示例,点击获取 title 的按...
学习
flutter2024-11-06
flutter android端运行报错Namespace not specified. Specify a namespace in the module‘s build file
在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始强制要求 namespace 配置,不仅仅是主工程,也包括第三方库都强制要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关配置,这也就导致了我们会出现标题错误: 出现这个问题,我们可能会通过去找到本地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失...
学习
flutter2024-11-03
Flutter中如何实现APP升级功能背景
背景 每个App应用中一定会包含的功能 ,App的运行平台不同实现升级功能的方式也就不同,基本分类如下所示。本文主要聚焦在使用Flutter框架开发的应用在安卓系统内如何更新,以及所涉及要点梳理。 IOS系统 Andriod系统 官网下载 各类应用市场 (本文聚焦点) 功能清单(按步骤) UpgradeCard组件(展示升级内容) 进行新旧版本对比判断是否需要更新 下载更新然后安装应用 UpgradeCard组件 组件需要包含基本标题、...
学习
flutter2024-11-03
Flutter应用内更新App版本使用flutter_downloader而非ota_update
做当前App应用内更新的前提:用户可以在App更新的时候还可以使用软件,不能让他一直等待下载,关闭下载组件后,打开组件还能继续看到他的进度,并且用户锁屏或者短暂退出APP后需要保证任务不能总是挂掉,这里没有用到保活,而是需要用到生命周期去让他暂停和恢复,所以当前app还要有一个全局管理类保存任务id。UI图在最后 (插件文档说明可以通知栏显示,但是我用的这个版本在100%下完后总是failed,而不是complete,就不会很友好,后面...
学习

评论

请登录后发表评论

去登录
加载评论中...