如何在 Dart/Flutter 中获取设备 IP
How to get device IP in Dart/Flutter
我目前正在编写一个应用程序,用户需要知道他们 phone/tablet 的 IP 地址。我在哪里可以找到这些信息?
我只想知道本地 IP 地址是什么,例如 192。168.x.xxx 而不是路由器的 public IP 地址。
到目前为止,我似乎只能找到InternetAddress.anyIPv4
和InternetAddress.loopbackIPv4
。环回地址不是我想要的,因为它是 127.0.0.1.
这提供了所有接口的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
我猜你说的是当前连接的Wifi网络的本地IP吧?
已编辑
在这个答案中,我曾经建议使用 NetworkInterface in 'dart:io', however NetworkInterface.list
is not supported in Android (as pointed out by Mahesh). The wifi package provides that, but later this was incorporated to the flutter's connectivity
plugin. In Oct/2020 the methods for that were moved from the connectivity
to the wifi_info_flutter plugin, and in 2021 that package was discontinued in favor of network_info_plus。
所以只需前往 network_info_plus
并致电 await NetworkInfo().getWifiIP()
。
顺便说一句,您可能还想使用 connectivity plugin in flutter/plugins. Here's an example of 检查 Wifi 是否可用。
你试过device_info包了吗?
中有查询设备信息的例子
我在 flutter 中搜索 iOS 和 android 平台的 IP 地址。
and 的回答如下 仅适用于 iOS 平台
NetworkInterface.list(....);
这个listing of network interfaces is not supported for android platform.
经过长时间的搜索和努力寻找可能的解决方案,为了在 android 设备上也获取 IP,我遇到了一个名为 wifi 的 flutter 包,使用这个包我们可以获取设备 IP 地址iOS 和 android 平台。
获取设备 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 来获取IP 本机来自 java 代码 android 平台 [因为接口列表适用于 iOS]。这个 wifi 包挽救了这一天,也解决了很多令人头疼的问题。
在我最近的应用程序中,我需要获取用户的 IP 地址,然后我发现这个包很有用。 https://pub.dev/packages/get_ip
这是我的使用方法。
_onLoginButtonPressed() async {
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
}
Dart 好像没有办法获取自己的ip 地址。在寻找解决方案时,我遇到了 api https://ipify.org 以获取我的 public 地址。希望对你有帮助。
您可以使用 wifi 包获取本地 IP 地址(例如 192.168.x.x)。 (因为 NetworkInterface.list(来自 dart:io)不再支持 7.0 及更高版本的 Android。
使用 wifi 包:
import 'package:wifi/wifi.dart';
您可以像这样检索 IP 地址:
Future<String> getIp() async {
String ip = await Wifi.ip;
return ip;
}
您可以使用 FutureBuilder 在文本小部件上显示它:
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
}
},
);
这是另一种方法。
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;
}
在这里,您可以使用 https://pub.dev/packages/dart_ipify 在 pub.dev、
上可用的软件包
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
}
要连接设备 network/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();
您可以使用 network_info_plus 插件获取有关 wifi 连接的各种信息
例如:
import 'package:network_info_plus/network_info_plus.dart';
final NetworkInfo _networkInfo = NetworkInfo();
wifiIPv4Addr = await _networkInfo.getWifiIP();
进一步参考可以参考官方下给出的例子page
您可以使用以下包: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 不支持此包。
如果我们想找到 public 面向浏览器的 IP 地址,我们可以使用 dart_ipify 文档中的示例非常适合我。
导入包:
import 'package:dart_ipify/dart_ipify.dart';
将此代码添加到 _incrementCounter()
:
final ipv4 = await Ipify.ipv4();
print(ipv4);
我目前正在编写一个应用程序,用户需要知道他们 phone/tablet 的 IP 地址。我在哪里可以找到这些信息?
我只想知道本地 IP 地址是什么,例如 192。168.x.xxx 而不是路由器的 public IP 地址。
到目前为止,我似乎只能找到InternetAddress.anyIPv4
和InternetAddress.loopbackIPv4
。环回地址不是我想要的,因为它是 127.0.0.1.
这提供了所有接口的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
我猜你说的是当前连接的Wifi网络的本地IP吧?
已编辑
在这个答案中,我曾经建议使用 NetworkInterface in 'dart:io', however NetworkInterface.list
is not supported in Android (as pointed out by Mahesh). The wifi package provides that, but later this was incorporated to the flutter's connectivity
plugin. In Oct/2020 the methods for that were moved from the connectivity
to the wifi_info_flutter plugin, and in 2021 that package was discontinued in favor of network_info_plus。
所以只需前往 network_info_plus
并致电 await NetworkInfo().getWifiIP()
。
顺便说一句,您可能还想使用 connectivity plugin in flutter/plugins. Here's an example of
你试过device_info包了吗?
中有查询设备信息的例子我在 flutter 中搜索 iOS 和 android 平台的 IP 地址。
NetworkInterface.list(....);
这个listing of network interfaces is not supported for android platform.
经过长时间的搜索和努力寻找可能的解决方案,为了在 android 设备上也获取 IP,我遇到了一个名为 wifi 的 flutter 包,使用这个包我们可以获取设备 IP 地址iOS 和 android 平台。 获取设备 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 来获取IP 本机来自 java 代码 android 平台 [因为接口列表适用于 iOS]。这个 wifi 包挽救了这一天,也解决了很多令人头疼的问题。
在我最近的应用程序中,我需要获取用户的 IP 地址,然后我发现这个包很有用。 https://pub.dev/packages/get_ip
这是我的使用方法。
_onLoginButtonPressed() async {
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
}
Dart 好像没有办法获取自己的ip 地址。在寻找解决方案时,我遇到了 api https://ipify.org 以获取我的 public 地址。希望对你有帮助。
您可以使用 wifi 包获取本地 IP 地址(例如 192.168.x.x)。 (因为 NetworkInterface.list(来自 dart:io)不再支持 7.0 及更高版本的 Android。
使用 wifi 包:
import 'package:wifi/wifi.dart';
您可以像这样检索 IP 地址:
Future<String> getIp() async {
String ip = await Wifi.ip;
return ip;
}
您可以使用 FutureBuilder 在文本小部件上显示它:
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
}
},
);
这是另一种方法。
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;
}
在这里,您可以使用 https://pub.dev/packages/dart_ipify 在 pub.dev、
上可用的软件包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
}
要连接设备 network/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
然后你可以通过执行
获取当前IPString? wifiIP = await NetworkInfo().getWifiIP();
您可以使用 network_info_plus 插件获取有关 wifi 连接的各种信息
例如:
import 'package:network_info_plus/network_info_plus.dart';
final NetworkInfo _networkInfo = NetworkInfo();
wifiIPv4Addr = await _networkInfo.getWifiIP();
进一步参考可以参考官方下给出的例子page
您可以使用以下包: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 不支持此包。
如果我们想找到 public 面向浏览器的 IP 地址,我们可以使用 dart_ipify 文档中的示例非常适合我。
导入包:
import 'package:dart_ipify/dart_ipify.dart';
将此代码添加到 _incrementCounter()
:
final ipv4 = await Ipify.ipv4();
print(ipv4);