Flutter Web 是 Flutter 框架的一个分支,它允许开发者使用 Flutter 构建跨平台的 Web 应用程序。Flutter Web 通过将 Flutter 的渲染引擎(基于 Skia 图形库)编译成 WebAssembly(Wasm),并在浏览器的 JavaScript 引擎中运行来实现这一点。
获取本地 IP 地址通常是指获取运行应用程序的计算机的本地网络接口的 IP 地址。这对于网络通信、多设备通信等场景非常有用。
获取本地 IP 地址的方法有多种,常见的包括:
获取本地 IP 地址的应用场景包括:
可以通过浏览器的 RTCPeerConnection
API 获取本地 IP 地址。以下是一个示例代码:
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;
}
}
可以通过 Flutter 的平台通道调用原生代码获取本地 IP 地址。以下是一个示例代码:
Dart 代码:
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
中添加以下代码:
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
中添加以下代码:
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()
}
}
原因:
解决方法:
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云