我写了一个类来处理网络连接。我需要,因为我的应用程序只能在特定环境中运行,所以我想检查 wifi SSID。
我用这个connectivity
包来检查我是否连接到 WIFI。
我想使用network_info_plus
包来读取wifi SSID名称,但是它抛出了这个异常:
MissingPluginException(MissingPluginException(在通道 dev.fluttercommunity.plus/network_info 上找不到方法 getLocationServiceAuthorization 的实现))
我的代码如下:
import 'dart:async';
import 'package:network_info_plus/network_info_plus.dart' as info;
import 'package:connectivity/connectivity.dart';
import 'package:flutter/services.dart';
enum ConnectivityStatus { Connected, NotConnected }
class ConnectivityService {
// Create our public controller
StreamController<ConnectivityStatus> connectionStatusController =
StreamController<ConnectivityStatus>();
ConnectivityService() {
// Subscribe to the connectivity Chanaged Steam
Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
// Use Connectivity() here to gather more info if you need t
connectionStatusController.add(_getStatusFromResult(result));
});
}
// Convert from the third part enum to our own enum
ConnectivityStatus _getStatusFromResult(ConnectivityResult result) {
switch (result) {
case ConnectivityResult.mobile:
return ConnectivityStatus.NotConnected;
case ConnectivityResult.wifi:
_initNetworkInfo();
return ConnectivityStatus.Connected;
case ConnectivityResult.none:
return ConnectivityStatus.NotConnected;
default:
return ConnectivityStatus.NotConnected;
}
}
}
Future<String?> _initNetworkInfo() async {
String? wifiName;
final _networkInfo = info.NetworkInfo();
try {
var status = await _networkInfo.getLocationServiceAuthorization();
if (status == info.LocationAuthorizationStatus.notDetermined) {
status = await _networkInfo.requestLocationServiceAuthorization();
}
if (status == info.LocationAuthorizationStatus.authorizedAlways ||
status == info.LocationAuthorizationStatus.authorizedWhenInUse) {
wifiName = await _networkInfo.getWifiName();
} else {
wifiName = await _networkInfo.getWifiName();
}
} on PlatformException catch (e) {
print(e.toString());
wifiName = 'Failed to get Wifi Name';
}
return wifiName;
}
编辑:我决定创建一个类来处理 wifi 名称的检索:
...
case ConnectivityResult.wifi:
if (NetworkInfo().wifiName == 'WIFI_SSID_NAME') // !!! HANDLE ASYNC
return ConnectivityStatus.Connected;
else
return ConnectivityStatus.NotConnected;
...
class NetworkInfo {
String? wifiName;
NetworkInfo() {
_initNetworkInfo();
}
Future<void> _initNetworkInfo() async {
String? wifiName;
final _networkInfo = info.NetworkInfo();
try {
var status = await _networkInfo.getLocationServiceAuthorization();
if (status == info.LocationAuthorizationStatus.notDetermined) {
status = await _networkInfo.requestLocationServiceAuthorization();
}
if (status == info.LocationAuthorizationStatus.authorizedAlways ||
status == info.LocationAuthorizationStatus.authorizedWhenInUse) {
wifiName = await _networkInfo.getWifiName();
} else {
wifiName = await _networkInfo.getWifiName();
}
} on PlatformException catch (e) {
print(e.toString());
wifiName = 'Failed to get Wifi Name';
}
this.wifiName = wifiName;
}
}