如何在 Dart/Flutter 中获取设备 IP
Posted
技术标签:
【中文标题】如何在 Dart/Flutter 中获取设备 IP【英文标题】:How to get device IP in Dart/Flutter 【发布时间】:2019-02-23 22:36:05 【问题描述】:我目前正在编写一个应用程序,用户需要知道他们的手机/平板电脑的 IP 地址。我在哪里可以找到这些信息?
我只想知道本地IP地址是什么,比如192.168.x.xxx,而不是路由器的公网IP地址。
到目前为止,我似乎只能找到InternetAddress.anyIPv4
和InternetAddress.loopbackIPv4
。环回地址不是我想要的,因为它是 127.0.0.1。
【问题讨论】:
【参考方案1】:我猜你是指当前连接的 Wifi 网络的本地 IP,对吧?
已编辑
在这个答案中,我曾经建议使用NetworkInterface in 'dart:io',但是android 不支持NetworkInterface.list
(正如Mahesh 所指出的那样)。 wifi 包提供了这一点,但后来它被合并到了颤振的 connectivity
插件中。 2020 年 10 月,相关方法从 connectivity
移至 wifi_info_flutter 插件。
因此,只需拨打wifi_info_flutter
并致电await WifiFlutter().getWifiIP()
。
顺便说一句,您可能还想使用flutter/plugins 中的connectivity 插件检查Wifi 是否可用。这是how to check if wifi is available 的示例。
【讨论】:
NetworkInterface.list 在 Android 中运行良好。我刚刚在三星 Galaxy S20 设备上测试过。 显然这个限制是由这个PR 解决的。我会做一些测试并更新答案。【参考方案2】:我正在为 ios 和 android 平台寻找获取 IP 地址。
Feu 和 Günter Zöchbauer 的回答如下仅适用于 iOS 平台
NetworkInterface.list(....);
这个listing of network interfaces is not supported for android platform.
经过长时间的搜索和可能的解决方案的挣扎,为了在 android 设备上获取 IP,我遇到了一个名为 wifi 的颤振包,通过这个包我们可以在 iOS 和 android 平台上获取设备 IP 地址。 获取设备IP地址的简单示例函数
Future<InternetAddress> get selfIP async
String ip = await Wifi.ip;
return InternetAddress(ip);
我已经在 android 上使用 wifi 和移动网络对此进行了测试。 并且还在 iOS 设备上进行了测试。
虽然从名称上看它只查找 wifi 网络,但它也为我提供了移动数据网络上的正确 IP 地址 [在 4G 网络上测试]。
#finally_this_works:我几乎已经放弃在 android 上搜索获取 IP 地址,并正在考虑实现 platform channel 以从 android 平台的 java 代码中本地获取 IP [因为接口列表适用于iOS]。这个 wifi 包省了很多麻烦。
【讨论】:
有什么办法不让用户提供具体的步骤来允许应用从IOS上的这个包中获取IP地址?这对用户来说似乎是一种负担【参考方案3】:这提供了所有接口的IP地址
import 'dart:io';
...
Future printIps() async
for (var interface in await NetworkInterface.list())
print('== Interface: $interface.name ==');
for (var addr in interface.addresses)
print(
'$addr.address $addr.host $addr.isLoopback $addr.rawAddress $addr.type.name');
另请参阅 https://api.dartlang.org/stable/2.0.0/dart-io/NetworkInterface-class.html
【讨论】:
精彩的答案。我想在 Flutter App 中获取面向公众的 IP 地址。是否也可以直接获取,或者我应该使用ipify.org之类的服务? 如果您在设备和公共互联网之间使用路由器,如果没有外部服务的帮助,就无法从您的设备获取此公共 IP。这样的服务会获取连接来源的信息,并可以将其发回。【参考方案4】:Dart 似乎没有解决方案来获取您自己的 ip 地址。在寻找解决方案时,我遇到了 rest api https://ipify.org 来获取我的公共地址。希望对您有所帮助。
【讨论】:
【参考方案5】:这是另一种方式。
Future<InternetAddress> _retrieveIPAddress() async
InternetAddress result;
int code = Random().nextInt(255);
var dgSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
dgSocket.readEventsEnabled = true;
dgSocket.broadcastEnabled = true;
Future<InternetAddress> ret =
dgSocket.timeout(Duration(milliseconds: 100), onTimeout: (sink)
sink.close();
).expand<InternetAddress>((event)
if (event == RawSocketEvent.read)
Datagram dg = dgSocket.receive();
if (dg != null && dg.data.length == 1 && dg.data[0] == code)
dgSocket.close();
return [dg.address];
return [];
).firstWhere((InternetAddress a) => a != null);
dgSocket.send([code], InternetAddress("255.255.255.255"), dgSocket.port);
return ret;
【讨论】:
【参考方案6】:在这里,您可以使用 pub.dev 上提供的这个包 https://pub.dev/packages/dart_ipify,
import 'package:dart_ipify/dart_ipify.dart';
void main() async
final ipv4 = await Ipify.ipv4();
print(ipv4); // 98.207.254.136
final ipv6 = await Ipify.ipv64();
print(ipv6); // 98.207.254.136 or 2a00:1450:400f:80d::200e
final ipv4json = await Ipify.ipv64(format: Format.JSON);
print(ipv4json); //"ip":"98.207.254.136" or "ip":"2a00:1450:400f:80d::200e"
// The response type can be text, json or jsonp
【讨论】:
OP 询问如何获取本地设备 IP 地址,而不是公共 IP。【参考方案7】:要获取设备连接的网络/WiFi IP,您可以使用network_info_plus 包。
对于 android,在 AndroidManifest.xml 文件中添加以下权限 ACCESS_COARSE_LOCATION
和 ACCESS_FINE_LOCATION
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
IOS 权限有点复杂,所以请阅读库中要求的内容。
将包添加到pubspec.yaml
dependencies:
network_info_plus: ^1.0.2
比你可以通过执行得到当前IP
String? wifiIP = await NetworkInfo().getWifiIP();
【讨论】:
【参考方案8】:在我最近的应用程序中,我需要获取用户的 IP 地址,然后我发现这个包很有用。 https://pub.dev/packages/get_ip
这是我的使用方法。
_onLoginButtonPressed() async
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
【讨论】:
get_ip 包已停产【参考方案9】:您可以使用wifi 包获取本地IP 地址(例如192.168.x.x)。 (因为 NetworkInterface.list(来自 dart:io)不再支持 Android 7.0 及更高版本)。
使用wifi 包:
import 'package:wifi/wifi.dart';
您可以这样检索 IP 地址:
Future<String> getIp() async
String ip = await Wifi.ip;
return ip;
您可以使用 FutureBuilder 在 Text 小部件上显示它:
FutureBuilder<String>(
future: getIp(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot)
if (snapshot.connectionState == ConnectionState.waiting)
return Center(child: CircularProgressIndicator());
else
if (snapshot.hasError)
return Center(child: Text('Error: $snapshot.error'));
else
return Center(child: Text('IP Address is : $snapshot.data')); //IP Address
,
);
【讨论】:
【参考方案10】:你试过 device_info 包吗?
https://pub.dartlang.org/packages/device_info#-example-tab-中有查询设备信息的例子
【讨论】:
device_info 有很多信息,但没有任何 IP 地址。【参考方案11】:您可以使用network_info_plus插件获取有关wifi连接的各种信息
例如:
import 'package:network_info_plus/network_info_plus.dart';
final NetworkInfo _networkInfo = NetworkInfo();
wifiIPv4Addr = await _networkInfo.getWifiIP();
更多参考可以参考官方page下给出的例子
【讨论】:
【参考方案12】:您可以使用以下包:https://pub.dev/packages/network_info_plus
这里是详细介绍如何使用包https://plus.fluttercommunity.dev/docs/network_info_plus/usage/#using-network-info-plus的页面
基本上......如果你安装了这个包,你会使用类似的东西
import 'package:network_info_plus/network_info_plus.dart';
final info = NetworkInfo();
var wifiIP = await info.getWifiIP();
这个包附带了一些额外的方法,这些方法可能非常有用;)
注意:flutter web 不支持此包。
【讨论】:
【参考方案13】:如果我们想找到浏览器的面向公众的 IP 地址,我们可以使用 dart_ipify 文档中的示例对我来说非常有效。
导入包:
import 'package:dart_ipify/dart_ipify.dart';
将此代码添加到_incrementCounter()
:
final ipv4 = await Ipify.ipv4();
print(ipv4);
【讨论】:
以上是关于如何在 Dart/Flutter 中获取设备 IP的主要内容,如果未能解决你的问题,请参考以下文章
Dart Flutter - 使用 Chopper 获取 WordPress 自定义帖子类型
如何在 Dart (Flutter) 中获取每个可迭代值的索引号
如何在 Dart Flutter 的字典数组中获取某些键的值?