我正在编写一个应用程序,用户需要知道他们的手机/平板电脑的IP地址。我该在哪里找到这些信息?
我只想知道本地IP地址,例如192.168.x.xxx,而不是路由器的公共IP地址。
到目前为止,我似乎只能找到InternetAddress.anyIPv4
和InternetAddress.loopbackIPv4
。环回地址不是我想要的,因为它是127.0.0.1。
我猜你指的是当前连接的Wifi网络的本地IP地址,对吗?
编辑
在这个回答中,我曾建议使用{{link1:'dart:io'}中的NetworkInterface},但是不是所有Android设备都支持 NetworkInterface.list (正如Mahesh指出的那样)。wifi软件包提供了这个功能,但后来被合并到flutter的
connectivity
插件中。2020年10月,这些方法从 connectivity
移动到了wifi_info_flutter插件中,2021年该软件包停止使用,转而采用network_info_plus。
因此,只需使用 network_info_plus
并调用 await NetworkInfo().getWifiIP()
即可。
顺便提一下,您可能还想使用connectivity_plus插件在flutter/plugins中检查Wifi是否可用。这里有一个如何检查wifi是否可用的示例。
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
NetworkInterface.list(....);
在长时间的搜索和尝试可能的解决方案后,为了在Android设备上获取IP,我发现了一个名为wifi的Flutter包。使用此包,我们可以在iOS和Android平台上获取设备IP地址。 获取设备IP地址的简单示例函数。
Future<InternetAddress> get selfIP async {
String ip = await Wifi.ip;
return InternetAddress(ip);
}
在这里,你可以使用位于 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
}
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();
这里是另一种方式。
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;
}
最近我开发的应用需要获取用户的IP地址,然后我找到了这个有用的包。https://pub.dev/packages/get_ip
以下是我的使用方式。
_onLoginButtonPressed() async {
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
}
import 'package:wifi/wifi.dart';
Future<String> getIp() async {
String ip = await Wifi.ip;
return ip;
}
你可以使用FutureBuilder将其显示在Text widget上:
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
}
},
);
import 'package:dart_ipify/dart_ipify.dart';
将此代码添加到_incrementCounter()
中:
final ipv4 = await Ipify.ipv4();
print(ipv4);
NetworkInterface.list
在 Android 上也适用于我。 - DarkNeuron