flutter如何获取wifi列表

在Flutter中如何获取当前可用的WiFi列表?我尝试了一些插件但效果不理想,有些无法获取完整信息。请问有没有稳定可靠的方法或推荐使用的插件?最好能支持Android和iOS平台,并获取到SSID、信号强度等详细信息。

2 回复

在Flutter中,使用 wifi_scan 插件获取WiFi列表。首先添加依赖,然后请求位置权限,最后调用 getScannedResults() 获取扫描结果。示例代码:

List<WiFiAccessPoint> networks = await WiFiScan.instance.getScannedResults();

更多关于flutter如何获取wifi列表的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中获取WiFi列表需要使用平台通道(Platform Channels)调用原生代码,因为Flutter本身没有直接访问WiFi信息的API。以下是实现步骤:

1. 添加权限(Android)

android/app/src/main/AndroidManifest.xml 中添加权限:

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

注意:Android 10+ 需要位置权限才能获取WiFi列表。

2. 创建平台通道方法

在Flutter中调用原生代码:

Flutter端代码

import 'package:flutter/services.dart';

class WifiList {
  static const platform = MethodChannel('wifi_list');

  static Future<List<dynamic>> getWifiList() async {
    try {
      final List<dynamic> result = await platform.invokeMethod('getWifiList');
      return result;
    } on PlatformException catch (e) {
      print("Failed to get WiFi list: '${e.message}'");
      return [];
    }
  }
}

Android端代码(Java): 在 MainActivity.java 中添加:

import android.content.Context;
import android.net.wifi.WifiManager;
import android.net.wifi.ScanResult;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class MainActivity extends FlutterActivity {
  private static final String CHANNEL = "wifi_list";

  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
        .setMethodCallHandler(
          (call, result) -> {
            if (call.method.equals("getWifiList")) {
                List<Map<String, String>> wifiList = getWifiList();
                result.success(wifiList);
            } else {
                result.notImplemented();
            }
          }
        );
  }

  private List<Map<String, String>> getWifiList() {
    List<Map<String, String>> wifiList = new ArrayList<>();
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    
    if (wifiManager != null && wifiManager.startScan()) {
        List<ScanResult> results = wifiManager.getScanResults();
        for (ScanResult scanResult : results) {
            Map<String, String> wifiInfo = new HashMap<>();
            wifiInfo.put("ssid", scanResult.SSID);
            wifiInfo.put("bssid", scanResult.BSSID);
            wifiInfo.put("level", String.valueOf(scanResult.level));
            wifiList.add(wifiInfo);
        }
    }
    return wifiList;
  }
}

3. 使用示例

// 在Flutter页面中使用
List<dynamic> wifiList = await WifiList.getWifiList();
for (var wifi in wifiList) {
  print('SSID: ${wifi['ssid']}, Signal: ${wifi['level']}dBm');
}

注意事项:

  1. iOS限制:iOS无法直接获取WiFi列表,需要特定的企业证书或使用NEHotspotConfiguration管理已知网络
  2. 权限处理:需要动态请求位置权限
  3. 性能:扫描可能需要几秒钟时间

建议使用第三方插件如 wifi_scanwifi_info_flutter 来简化实现过程。

回到顶部