iProgram
iProgram

Reputation: 6577

How to get device IP in Dart/Flutter

I am currently writing an app where the user needs to know the IP address of their phone/tablet. Where would I find this information?

I only want to know what the local IP address is, such as, 192.168.x.xxx and NOT the public IP address of the router.

So far, I can only seem to find InternetAddress.anyIPv4 and InternetAddress.loopbackIPv4. The loopback address is not what I want as it is 127.0.0.1.

Upvotes: 40

Views: 90763

Answers (14)

Feu
Feu

Reputation: 5790

I guess you mean the local IP of the currently connected Wifi network, right?

EDITED

In this answer, I used to suggest using the NetworkInterface in 'dart:io', however NetworkInterface.list is not supported in all Android devices (as pointed out by Mahesh). The wifi package provides that, but later this was incorporated into 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.

So just go for network_info_plus and call await NetworkInfo().getWifiIP().


By the way, you may also want to check if Wifi is available using the connectivity_plus plugin in flutter/plugins. Here's an example of how to check if wifi is available.

FLUTTER WEB

Such functionality is incompatible with flutter web, as it runs in a browser. However, you can use a server side helper to get that.

Upvotes: 56

Ruchit
Ruchit

Reputation: 2770

here, you can use this package https://pub.dev/packages/dart_ipify available on 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
}

Note: this answer provides info about public ip, not local ip.

Upvotes: 4

PrimeTimeTran
PrimeTimeTran

Reputation: 2157

If we want to find the public facing IP address of a browser we can use dart_ipify The example in the documentation worked perfectly for me.

Import the package:

import 'package:dart_ipify/dart_ipify.dart';

Add this code to _incrementCounter():

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

Upvotes: 0

The flutter network_info_plus package provides access to Wifi information such as Wifi IP and name, but the problem is that it doesn't work when the phone HotSpot is on and the phone gets its IP from its own HotSpot.

The code below works for any condition and returns local IP whether it comes from phone HotSpot or another router:

import 'package:flutter/services.dart';

MethodChannel _channel = const MethodChannel('get_ip');
String ip = await _channel.invokeMethod('getIpAdress');

Node that in case you got No implementation found for method error, you should add get_ip package. I hope it helps.

Upvotes: 1

Lyle February
Lyle February

Reputation: 161

You can use the following package: https://pub.dev/packages/network_info_plus

And here is the page giving more detail about how to use the package https://plus.fluttercommunity.dev/docs/network_info_plus/usage/#using-network-info-plus

Essentially...if you have the package installed, you would use something like

import 'package:network_info_plus/network_info_plus.dart';

final info = NetworkInfo();

var wifiIP = await info.getWifiIP(); 

This package comes with some additional methods that could prove quite useful ;)

NOTE: This package is not supported on flutter web.

Upvotes: 0

Vignesh Nandakumar
Vignesh Nandakumar

Reputation: 119

You can use the network_info_plus plugin to get various info about the wifi connection

Eg:

import 'package:network_info_plus/network_info_plus.dart';

final NetworkInfo _networkInfo = NetworkInfo();

wifiIPv4Addr = await _networkInfo.getWifiIP();

For further refernce you can refer to the examples given under the official page

Upvotes: 0

Guy Luz
Guy Luz

Reputation: 4039

To get device connected network/WiFi IP you can use network_info_plus package.

For android add the following permissions ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION in the AndroidManifest.xml file

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

IOS permissions are a little more complicated so please read what is requested in the library.

Add package to pubspec.yaml

dependencies:
  network_info_plus: ^1.0.2

Than you can get the current IP by executing

String? wifiIP = await NetworkInfo().getWifiIP();

Upvotes: 4

spekary
spekary

Reputation: 438

Here is another way.

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

Upvotes: 4

Aqeel
Aqeel

Reputation: 971

You can use the wifi package for getting the local IP Address (for eg. 192.168.x.x). (as The NetworkInterface.list (from dart:io) is no longer supporting Android from 7.0 and above).

Use the wifi package :

import 'package:wifi/wifi.dart';

You can retrieve the IP Address like this:

Future<String> getIp() async {
  String ip = await Wifi.ip;
  return ip;
}

You can display it on a Text widget using 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
        }
      },
    );

Upvotes: 2

rdnobrega
rdnobrega

Reputation: 789

It seems that Dart doesn't have a solution to get your own ip address. Searching for a solution I came across the rest api https://ipify.org to get my public address. Hope it helps.

Upvotes: 4

G&#252;nter Z&#246;chbauer
G&#252;nter Z&#246;chbauer

Reputation: 658067

This provides the IP addresses of all interfaces

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

See also https://api.dartlang.org/stable/2.0.0/dart-io/NetworkInterface-class.html

Upvotes: 25

Jiten Basnet
Jiten Basnet

Reputation: 1820

In my recent app I have a requirement to get user's Ip address and then I found this packgage useful. https://pub.dev/packages/get_ip

Here is How I use it.

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

Upvotes: 1

Mahesh
Mahesh

Reputation: 161

I was searching for getting IP address in flutter for both the iOS and android platforms.

As answered by Feu and Günter Zöchbauer following works on only iOS platform

NetworkInterface.list(....);

this listing of network interfaces is not supported for android platform.

After too long search and struggling with possible solutions, for getting IP also on android device, I came across a flutter package called wifi, with this package we can get device IP address on both iOS and android platforms. Simple sample function to get device IP address

Future<InternetAddress> get selfIP async {
    String ip = await Wifi.ip;
    return InternetAddress(ip);
}

I have tested this on android using wifi and also from mobile network. And also tested on iOS device.

Though from name it looks only for wifi network, but it has also given me correct IP address on mobile data network [tested on 4G network].

#finally_this_works : I have almost given up searching for getting IP address on android and was thinking of implementing platform channel to fetch IP natively from java code for android platform [as interface list was working for iOS]. This wifi package saved the day and lots of headache.

Upvotes: 16

Arsene Lupin
Arsene Lupin

Reputation: 343

Have you tried the device_info package?

There is an example on querying device information in https://pub.dartlang.org/packages/device_info#-example-tab-

Upvotes: 0

Related Questions