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

How to get device IP in Dart/Flutter

我目前正在编写一个应用程序,用户需要知道他们 phone/tablet 的 IP 地址。我在哪里可以找到这些信息?

我只想知道本地 IP 地址是什么,例如 192。168.x.xxx 而不是路由器的 public IP 地址。

到目前为止,我似乎只能找到InternetAddress.anyIPv4InternetAddress.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包了吗?

https://pub.dartlang.org/packages/device_info#-example-tab-

中有查询设备信息的例子

我在 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_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();

您可以使用 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);