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

Posted

技术标签:

【中文标题】如何在 Dart/Flutter 中获取设备 IP【英文标题】:How to get device IP in Dart/Flutter 【发布时间】:2019-02-23 22:36:05 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我猜你是指当前连接的 Wifi 网络的本地 IP,对吧?

已编辑

在这个答案中,我曾经建议使用NetworkInterface in 'dart:io',但是android 不支持NetworkInterface.list(正如Mahesh 所指出的那样)。 wifi 包提供了这一点,但后来它被合并到了颤振的 connectivity 插件中。 2020 年 10 月,相关方法从 connectivity 移至 wifi_info_flutter 插件。

因此,只需拨打wifi_info_flutter 并致电await WifiFlutter().getWifiIP()


顺便说一句,您可能还想使用flutter/plugins 中的connectivity 插件检查Wifi 是否可用。这是how to check if wifi is available 的示例。

【讨论】:

NetworkInterface.list 在 Android 中运行良好。我刚刚在三星 Galaxy S20 设备上测试过。 显然这个限制是由这个PR 解决的。我会做一些测试并更新答案。【参考方案2】:

我正在为 ios 和 android 平台寻找获取 IP 地址。

Feu 和 Günter Zöchbauer 的回答如下仅适用于 iOS 平台

NetworkInterface.list(....);

这个listing of network interfaces is not supported for android platform.

经过长时间的搜索和可能的解决方案的挣扎,为了在 android 设备上获取 IP,我遇到了一个名为 wifi 的颤振包,通过这个包我们可以在 iOS 和 android 平台上获取设备 IP 地址。 获取设备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 以从 android 平台的 java 代码中本地获取 IP [因为接口列表适用于iOS]。这个 wifi 包省了很多麻烦。

【讨论】:

有什么办法不让用户提供具体的步骤来允许应用从IOS上的这个包中获取IP地址?这对用户来说似乎是一种负担【参考方案3】:

这提供了所有接口的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 App 中获取面向公众的 IP 地址。是否也可以直接获取,或者我应该使用ipify.org之类的服务? 如果您在设备和公共互联网之间使用路由器,如果没有外部服务的帮助,就无法从您的设备获取此公共 IP。这样的服务会获取连接来源的信息,并可以将其发回。【参考方案4】:

Dart 似乎没有解决方案来获取您自己的 ip 地址。在寻找解决方案时,我遇到了 rest api https://ipify.org 来获取我的公共地址。希望对您有所帮助。

【讨论】:

【参考方案5】:

这是另一种方式。

 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;
  

【讨论】:

【参考方案6】:

在这里,您可以使用 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。【参考方案7】:

要获取设备连接的网络/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();

【讨论】:

【参考方案8】:

在我最近的应用程序中,我需要获取用户的 IP 地址,然后我发现这个包很有用。 https://pub.dev/packages/get_ip

这是我的使用方法。

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

【讨论】:

get_ip 包已停产【参考方案9】:

您可以使用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 小部件上显示它:

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
        
      ,
    );

【讨论】:

【参考方案10】:

你试过 device_info 包吗?

https://pub.dartlang.org/packages/device_info#-example-tab-中有查询设备信息的例子

【讨论】:

device_info 有很多信息,但没有任何 IP 地址。【参考方案11】:

您可以使用network_info_plus插件获取有关wifi连接的各种信息

例如:

import 'package:network_info_plus/network_info_plus.dart';

final NetworkInfo _networkInfo = NetworkInfo();

wifiIPv4Addr = await _networkInfo.getWifiIP();

更多参考可以参考官方page下给出的例子

【讨论】:

【参考方案12】:

您可以使用以下包: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 不支持此包。

【讨论】:

【参考方案13】:

如果我们想找到浏览器的面向公众的 IP 地址,我们可以使用 dart_ipify 文档中的示例对我来说非常有效。

导入包:

import 'package:dart_ipify/dart_ipify.dart';

将此代码添加到_incrementCounter():

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

【讨论】:

以上是关于如何在 Dart/Flutter 中获取设备 IP的主要内容,如果未能解决你的问题,请参考以下文章

Dart Flutter - 使用 Chopper 获取 WordPress 自定义帖子类型

如何在 Dart (Flutter) 中获取每个可迭代值的索引号

如何在 Dart Flutter 的字典数组中获取某些键的值?

如何使用 dart/flutter 中的共享首选项保存和获取列表列表

如何使用 dart/flutter 从 API 获取数据?

如何获取某些值的值作为类型<String>,它位于 Dart/Flutter 中 List 内的 Map 内?