Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Public IP in Flutter?

Tags:

flutter

dart

In my case, i need public IP Address. But, after research almost all documentary related to Local IP like: Get_IP, I want something like 202.xxx not 192.168.xxx. Can someone give some advice?

like image 672
Nanda Z Avatar asked Dec 03 '22 17:12

Nanda Z


2 Answers

As far as I'm aware, there's no way to get the public IP of a device from within that device. This is because the vast majority of the time, the device doesn't know it's own public IP. The public IP is assigned to the device from the ISP, and your device is usually separated from the ISP through any number of modems, routers, switches, etc.

You need to query some external resource or API (such as ipify.org) that will then tell you what your public IP is. You can do this with a simple HTTP request.

import 'package:http/http.dart';

Future<String> getPublicIP() async {
  try {
    const url = 'https://api.ipify.org';
    var response = await http.get(url);
    if (response.statusCode == 200) {
      // The response body is the IP in plain text, so just
      // return it as-is.
      return response.body;
    } else {
      // The request failed with a non-200 code
      // The ipify.org API has a lot of guaranteed uptime 
      // promises, so this shouldn't ever actually happen.
      print(response.statusCode);
      print(response.body);
      return null;
    }
  } catch (e) {
    // Request failed due to an error, most likely because 
    // the phone isn't connected to the internet.
    print(e);
    return null;
  }
}

EDIT: There is now a Dart package for getting public IP information from the IPify service. You can use this package in place of the above manual solution:

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
}
like image 151
Abion47 Avatar answered Feb 23 '23 07:02

Abion47


I recently came across this package dart_ipify that can do this work. https://pub.dev/packages/dart_ipify

Here is an example:

import 'package:dart_ipify/dart_ipify.dart';

void main() async {
  final ipv6 = await Ipify.ipv64();
  print(ipv6); // 98.207.254.136 or 2a00:1450:400f:80d::200e
}
like image 29
Ashim Bhadra Avatar answered Feb 23 '23 07:02

Ashim Bhadra