如何在Dart/Flutter中获取设备IP

36

我正在编写一个应用程序,用户需要知道他们的手机/平板电脑的IP地址。我该在哪里找到这些信息?

我只想知道本地IP地址,例如192.168.x.xxx,而不是路由器的公共IP地址。

到目前为止,我似乎只能找到InternetAddress.anyIPv4InternetAddress.loopbackIPv4。环回地址不是我想要的,因为它是127.0.0.1。

14个回答

48

我猜你指的是当前连接的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是否可用的示例


1
NetworkInterface.list 在 Android 上运行良好。我刚在三星Galaxy S20设备上测试过它。 - Boris
是的,NetworkInterface.list 在 Android 上也适用于我。 - DarkNeuron
在一些安卓设备上工作正常,但并非所有设备都能运行。 - Feu

19
这提供了所有接口的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应用程序中获取公共IP地址。是否可以直接获取,还是应该使用像https://www.ipify.org/这样的服务? - Mayur Dhurpate
1
如果您在设备和公共互联网之间使用路由器,则无法在没有外部服务的帮助下从设备获取此公共IP。这样的服务可以获取连接起源的信息并将其发送回来。 - Günter Zöchbauer

16
我在寻找获取Flutter中iOS和Android平台IP地址的方法。
FeuGünter Zöchbauer所述,以下内容仅适用于iOS平台。
NetworkInterface.list(....);

这个列出网络接口的功能不支持Android平台。

在长时间的搜索和尝试可能的解决方案后,为了在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地址。
#最终_这个有效:我几乎放弃了在Android上获取IP地址的搜索,并考虑通过Java代码为Android平台本地实现platform channel以提取IP。这个wifi包挽救了这一天,避免了很多麻烦。

有没有什么方法可以不要求用户提供特定的步骤来允许应用从IOS程序包中获取IP地址?这似乎会给用户带来负担。 - staminna

4

看起来Dart没有获取自己IP地址的解决方案。在寻找解决方法时,我发现了rest api https://ipify.org 可以获取我的公网地址。希望对你有所帮助。


3

在这里,你可以使用位于 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。 - Lars335

3
要获取设备连接的网络/WiFi IP,您可以使用network_info_plus包。
对于Android,请在AndroidManifest.xml文件中添加以下权限:ACCESS_COARSE_LOCATIONACCESS_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();

3

这里是另一种方式。

 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;
  }

1

最近我开发的应用需要获取用户的IP地址,然后我找到了这个有用的包。https://pub.dev/packages/get_ip

以下是我的使用方式。

_onLoginButtonPressed() async {
String ipAddress = await GetIp.ipAddress;
print(ipAddress); //192.168.232.2
}

1
get_ip套件已经停止维护。 - Sludge

1
你可以使用 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 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
        }
      },
    );

0
如果我们想要查找浏览器的公网 IP 地址,可以使用 dart_ipify。文档中的示例对我而言完美运行。 导入该包:
import 'package:dart_ipify/dart_ipify.dart';

将此代码添加到_incrementCounter()中:

final ipv4 = await Ipify.ipv4();
print(ipv4);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接