首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter Web获取本地IP

基础概念

Flutter Web 是 Flutter 框架的一个分支,它允许开发者使用 Flutter 构建跨平台的 Web 应用程序。Flutter Web 通过将 Flutter 的渲染引擎(基于 Skia 图形库)编译成 WebAssembly(Wasm),并在浏览器的 JavaScript 引擎中运行来实现这一点。

获取本地 IP 地址通常是指获取运行应用程序的计算机的本地网络接口的 IP 地址。这对于网络通信、多设备通信等场景非常有用。

相关优势

  1. 跨平台:Flutter Web 允许开发者使用同一套代码库构建 Web、移动和桌面应用程序。
  2. 热重载:Flutter 提供了热重载功能,可以在不重新启动应用程序的情况下实时查看代码更改的效果。
  3. 丰富的组件库:Flutter 提供了丰富的 Material Design 和 Cupertino(iOS 风格)组件库,可以快速构建美观的用户界面。

类型

获取本地 IP 地址的方法有多种,常见的包括:

  1. 使用 JavaScript 获取:通过浏览器的 JavaScript API 获取本地 IP 地址。
  2. 使用原生代码获取:通过 Flutter 的平台通道(Platform Channels)调用原生代码获取本地 IP 地址。

应用场景

获取本地 IP 地址的应用场景包括:

  1. 局域网通信:在局域网内进行设备间的通信,如文件共享、游戏对战等。
  2. P2P 网络:构建点对点网络应用,如视频会议、文件传输等。
  3. 本地服务器:启动本地服务器,供其他设备访问。

获取本地 IP 地址的方法

使用 JavaScript 获取本地 IP 地址

可以通过浏览器的 RTCPeerConnection API 获取本地 IP 地址。以下是一个示例代码:

代码语言:txt
复制
import 'dart:async';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Get Local IP'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String localIP = await getLocalIP();
              print('Local IP: $localIP');
            },
            child: Text('Get Local IP'),
          ),
        ),
      ),
    );
  }

  Future<String> getLocalIP() async {
    final Completer<String> completer = Completer<String>();
    Timer.run(() {
      final RTCPeerConnection pc = RTCPeerConnection(
        iceServers: [],
      );
      pc.createDataChannel('');
      pc.createOffer().then((desc) {
        pc.setLocalDescription(desc);
      });
      pc.onicecandidate = (event) {
        if (event.candidate == null) {
          final addresses = pc.localDescription.sdp.matchAll(
            r'c=IN IP4 (\d+\.\d+\.\d+\.\d+)',
          );
          addresses.forEach((match) {
            completer.complete(match.group(1));
          });
        }
      };
    });
    return completer.future;
  }
}

使用原生代码获取本地 IP 地址

可以通过 Flutter 的平台通道调用原生代码获取本地 IP 地址。以下是一个示例代码:

Dart 代码:

代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Get Local IP'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String localIP = await getLocalIP();
              print('Local IP: $localIP');
            },
            child: Text('Get Local IP'),
          ),
        ),
      ),
    );
  }

  Future<String> getLocalIP() async {
    const platform = MethodChannel('com.example/local_ip');
    try {
      final String ip = await platform.invokeMethod('getLocalIP');
      return ip;
    } on PlatformException catch (e) {
      print("Failed to get local IP: ${e.message}");
      return null;
    }
  }
}

原生代码(Android):

MainActivity.java 中添加以下代码:

代码语言:txt
复制
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkCapabilities;
import android.os.Build;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "com.example/local_ip";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler((call, result) -> {
                if (call.method.equals("getLocalIP")) {
                    result.success(getLocalIPAddress(this));
                } else {
                    result.notImplemented();
                }
            });
    }

    private String getLocalIPAddress(Context context) {
        try {
            final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    final NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetworkInfo.getConnection());
                    if (networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        return getWifiIPAddress(context);
                    } else if (networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                        return getCellularIPAddress(context);
                    }
                } else {
                    return getWifiIPAddress(context);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String getWifiIPAddress(Context context) {
        final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        final int ip = wifiManager.getConnectionInfo().getIpAddress();
        return String.format("%d.%d.%d.%d", (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));
    }

    private String getCellularIPAddress(Context context) {
        // This method is more complex and may require additional permissions
        // For simplicity, this example does not include it
        return null;
    }
}

原生代码(iOS):

AppDelegate.swift 中添加以下代码:

代码语言:txt
复制
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  private let channel = "com.example/local_ip"

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let methodChannel = FlutterMethodChannel(name: channel, binaryMessenger: controller.binaryMessenger)
    methodChannel.setMethodCallHandler({
      [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
      if call.method == "getLocalIP" {
        self?.getLocalIP(result: result)
      } else {
        result(FlutterMethodNotImplemented)
      }
    })
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  private func getLocalIP(result: @escaping FlutterResult<String>) {
    let task = URLSession.shared.dataTask(with: URL(string: "https://api.ipify.org?format=json")!) { data, response, error in
      if let data = data, let ip = String(data: data, encoding: .utf8)?.split(separator: ":").first {
        result(ip)
      } else {
        result(nil)
      }
    }
    task.resume()
  }
}

遇到的问题及解决方法

问题:无法获取本地 IP 地址

原因:

  1. 权限问题:在某些平台上,获取本地 IP 地址可能需要特定的权限。
  2. 网络连接问题:如果设备没有连接到网络,可能无法获取本地 IP 地址。
  3. 浏览器限制:某些浏览器可能限制了获取本地 IP 地址的 API。

解决方法:

  1. 检查权限:确保应用程序具有获取本地 IP 地址所需的权限。
  2. 检查网络连接:确保设备已连接到网络。
  3. 使用备用方法:如果一种方法失败,可以尝试使用其他方法获取本地 IP 地址。

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 获取云服务器外网IP本地电脑出口IP

    注意:有代理的情况下,不同方式获取IP可能不同 比如我这台北京办公电脑,有不同的海外代理IP powershell里,一直获取到海外出口代理IP而不是我北京运营商IP 浏览器里,whatismyipaddress.com...cip.cc 或 www.ipplus360.com 【通过公网浏览器获取机器外网IP】 查询本机的上网出口IP 1)代理出口IP查询地址:www.ip138.com 或 www.ipshudi.com...或 ipchaxun.com 或 cip.cc 或 www.ipplus360.com 2)访问海外出口IP查询地址: whatismyipaddress.com 【通过powershell获取机器外网...ip.gs curl cip.cc 【通过linux curl获取公网IP归属地】 curl cip.cc/后面跟公网IP,这种显示结果是中文 curl ipinfo.io/后面跟公网IP,这种显示结果是英文...curl ipinfo.io/115.159.148.149 curl ipinfo.io/47.102.104.60 curl ipinfo.io/119.45.62.115 【通过腾讯云服务器内网获取

    3.3K21

    Linux下编程获取本地IP地址的常见方法

    方法一:ioctl()获取本地IP地址 Linux 下 可以使用ioctl()函数以及结构体 struct ifreq和结构体struct ifconf来获取网络接口的各种信息。...IP地址 如果建立TCP连接的情况下,可以通过getsockname和getpeername函数来获取本地和对端的IP和端口号。...(peeraddr.sin_port)<<endl; return 1; } } ---- 下面两种方法,都是通过主机名称来获取主机的IP地址,在获取本地IP地址时,一般都是回环地址,但可以有效的根据主机名称获取网络中的主机的...方法三:getaddrinfo()获取本地IP地址 注意,getaddrinfo()可以完成网络主机中主机名和服务名到地址的映射,但是一般不能用来获取本地IP地址,当它用来获取本地IP地址时,返回的一般是...但是要想获取本地IP地址的时候,一般获取的是回环地址127.0.0.1。

    7.8K20

    如何伪装本地IP

    一般网上的的黑客都是通过代理IP非法获取个人信息数据来达到获取自己的利益。...网络爬虫怎样才能安全上网,隐藏本地IP获取数据,这时候就需要用到高匿爬虫代理加强版,高匿爬虫代理可以通过使用代理服务器替换自己的本地IP,通过代理信息来获取数据,隐藏自己的本地IP,保证本地IP的安全。...真实IP地址能否被查到,取决于用户使用的代理IP的质量。如果在采集数据中想要安全可靠的采集,且不泄露个人信息的网络爬虫,建议可以使用高匿爬虫代理加强版。...隐藏本地IP方案: const http = require("http"); const url = require("url"); // 要访问的目标页面 const targetUrl = "http...://httpbin.org/ip"; const urlParsed = url.parse(targetUrl); // 代理服务器(产品官网 www.16yun.cn) const proxyHost

    2.3K10

    Flutter中的本地存储

    好吧,还是回归今天的主题,我们还是来看下Flutter中的本地存储吧 Flutter本地存储 ---- 和Android、Ios类似,Flutter也支持Preferences(Shared Preferences...文件存储 ---- 和SharedPreferences操作一样,Flutter内部并没有提供对本地文件的支持,但是官方给我们提供了第三方的支持库哦。...首先我们先获取存储目录 然后在本地建立文件(不存在这个名字的自动创建并返回,存在则直接返回这个文件对象),名字就叫做 nameFile吧。...然后就是存储输入框内的内容了 我们使用上面获取到的文件直接直接调用writeAsString即可,当然它会把这个文件对象返回给你,你可以存储下这个文件对象在下次使用 最后,我们来读取本地的文件 我们直接调用...^笔芯^ 小结 ---- 可以在https://pub.dartlang.org/flutter获取第三发插件 在pubspec.yaml引入或者更新第三发插件 SharedPreferences、文件

    4.9K30
    领券