我当前正在编写一个应用程序,用户需要在其中了解其手机/平板电脑的IP地址。我在哪里可以找到这些信息?
我只想知道本地IP地址是什么,例如192.168.x.xxx,而不是路由器的公共IP地址。
到目前为止,我似乎只能找到 <form class="form" action="<?php echo 'update_personnes.php?ID_personne='.$id ?>" role="form" method="post" enctype="multipart/form-data">
和InternetAddress.anyIPv4
。回送地址不是我想要的,因为它是127.0.0.1。
答案 0 :(得分:4)
我猜你是说当前连接的Wifi网络的本地IP,对吧?
选中NetworkInterface in 'dart:io'。
编辑:Android不支持NetworkInterface.list,稍后由Mahesh指出。除了wifi package中建议的his answer之外,还有一个PR可以将其带到连接性插件中。
您可能还想使用connectivity中的flutter/plugins插件检查Wifi是否可用。
下面是一个使用NetworkInferface的简单示例。顺便说一下,here's an example of how to check if wifi is available。
import 'dart:io';
import 'package:flutter/material.dart';
main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Network Interface example",
home: new NetworkInterfaceWidget(),
);
}
}
class NetworkInterfaceWidget extends StatefulWidget {
@override
_NetworkInterfaceState createState() => new _NetworkInterfaceState();
}
class _NetworkInterfaceState extends State<NetworkInterfaceWidget> {
String _networkInterface;
@override
initState() {
super.initState();
NetworkInterface.list(includeLoopback: false, type: InternetAddressType.any)
.then((List<NetworkInterface> interfaces) {
setState( () {
_networkInterface = "";
interfaces.forEach((interface) {
_networkInterface += "### name: ${interface.name}\n";
int i = 0;
interface.addresses.forEach((address) {
_networkInterface += "${i++}) ${address.address}\n";
});
});
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("NetworkInterface"),
),
body: Container(
padding: EdgeInsets.all(10.0),
child: Text("Only in iOS.. :(\n\nNetworkInterface:\n $_networkInterface"),
),
);
}
}
答案 1 :(得分:4)
我一直在为iOS和android平台搜索IP地址。
由Feu和Günter Zöchbauer回答,跟随仅在iOS平台上工作
NetworkInterface.list(....);
此listing of network interfaces is not supported for android platform.
经过长时间的搜索并努力寻找可能的解决方案,为了在Android设备上也获得IP,我遇到了一个名为wifi的Flutter软件包,通过该软件包,我们可以在iOS和Android平台上获得设备IP地址。 简单的示例函数即可获取设备IP地址
Future<InternetAddress> get selfIP async {
String ip = await Wifi.ip;
return InternetAddress(ip);
}
我已经在wifi和移动网络上使用android进行了测试。 并且也在iOS设备上进行了测试。
尽管从名称上看它仅用于wifi网络,但它也为我提供了在4G网络上测试过的移动数据网络上正确的IP地址。
#finally_this_works :我几乎放弃了在android上搜索获取IP地址的工作,并考虑实现platform channel以从android平台的Java代码中本地获取IP [因为接口列表是适用于iOS]。此wifi程序包节省了一天的时间,也让很多人头疼。
答案 2 :(得分:2)
似乎Dart没有解决方案来获取您自己的IP地址。在寻找解决方案时,我遇到了其他api https://ipify.org,以获取我的公开地址。希望对您有所帮助。
答案 3 :(得分:1)
在我最近的应用程序中,我要求获取用户的IP地址,然后我发现此包装非常有用。 https://pub.dev/packages/get_ip
这是我的用法。
_onLoginButtonPressed() async {
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
}
答案 4 :(得分:0)
这应该提供您要求的信息
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
答案 5 :(得分:0)
您是否尝试过device_info软件包?
在https://pub.dartlang.org/packages/device_info#-example-tab-中有一个关于查询设备信息的示例
答案 6 :(得分:0)
您可以使用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
}
},
);
答案 7 :(得分:0)
这是另一种方式。
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;
}
答案 8 :(得分:0)
在这里,您可以使用 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
}