前言
NetworkInterface
提供了查询设备网络接口的能力,包括获取与特定网络接口相关的 IP 地址。
NetworkInterface的常用属性
|-----------|---------------------------------------------------|
| addresses | 与该接口关联的 IP 地址的列表,返回一个包含多个 InternetAddress
对象的列表 |
| name | 网络接口的名称,例如 eth0
或 en0
|
| index | 该网络接口的索引编号(某些操作系统使用此编号来标识网络接口) |
InternetAddress的常用属性
|-----------|----------------------------------------|
| addresses | 返回 InternetAddress
的 IP 地址或主机名,作为字符串 |
| host | 返回此地址的主机名(如果有)或与该地址相关联的 IP 地址 |
| type | 返回地址的类型,可以是 IPv4
或 IPv6
|
NetworkInterface的常用方法
NetworkInterface.list({bool includeLoopback = false, bool includeLinkLocal = false, InternetAddressType? type})
- 该方法用于获取设备的所有网络接口,并返回一个包含所有网络接口的列表。
includeLoopback
: 是否包含本地回环接口,例如127.0.0.1
。includeLinkLocal
: 是否包含链路本地地址(例如在局域网内自配置的 IP 地址)。type
: 可以指定要获取的 IP 类型,如 IPv4 或 IPv6。
Flutter获取手机的IP地址示例代码
//获取所有的地址
Future<Map<String, dynamic>> _getLocalIpAddress() async {
try {
//获取设备上的网络信息接口
List<NetworkInterface> interfaces = await NetworkInterface.list();
bool isPrivate = false;
String address = '';
for (var i = 0; i < interfaces.length; i++) {
NetworkInterface interface2 = interfaces[i];
for (var j = 0; j < interface2.addresses.length; j++) {
InternetAddress internetAddress = interface2.addresses[j];
String ipAddress = interface2.addresses[j].address;
//判断Address是否是私有地址
if (internetAddress.type == InternetAddressType.IPv4 &&
isPrivateIPAddress(ipAddress)) {
isPrivate = true;
address = ipAddress;
break;
}
}
if (isPrivate) {
break;
}
}
return {"isPrivate": isPrivate, "address": address};
} catch (e) {
print('Failed to get local IP address: $e');
return {"isPrivate": false, "address": ''};
}
}