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

时间:2018-09-19 17:19:07

标签: dart ip flutter

我当前正在编写一个应用程序,用户需要在其中了解其手机/平板电脑的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。

9 个答案:

答案 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地址。

FeuGü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
}