Flutter(Android平台)实现WiFi一键开关的方法?
Flutter 实现一键开关WiFi功能(替代无效的IOT包方案)
IOT包主打物联网设备交互,并非控制设备自身WiFi开关的工具,所以你用它没效果是方向错了。下面给出针对不同平台的可行实现方案:
平台权限限制说明
- Android API 29+(Android 10及以上):普通应用无法直接开启/关闭WiFi,系统限制只能引导用户到WiFi设置页面手动操作;API 28及以下可通过权限直接控制。
- iOS:所有版本均禁止应用直接控制WiFi,只能引导用户到系统WiFi设置界面。
方案1:Android低版本直接控制,高版本引导到设置
使用wifi_flutter插件实现状态检查与切换,自动适配版本:
步骤1:添加依赖
在pubspec.yaml中加入:
dependencies: wifi_flutter: ^0.0.1 permission_handler: ^10.2.0
执行flutter pub get安装依赖。
步骤2:配置Android权限
编辑android/app/src/main/AndroidManifest.xml,添加权限声明:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
步骤3:代码实现
import 'package:flutter/material.dart'; import 'package:wifi_flutter/wifi_flutter.dart'; import 'package:permission_handler/permission_handler.dart'; class WifiToggle extends StatefulWidget { const WifiToggle({super.key}); @override State<WifiToggle> createState() => _WifiToggleState(); } class _WifiToggleState extends State<WifiToggle> { bool _wifiEnabled = false; @override void initState() { super.initState(); _checkWifiStatus(); } Future<void> _checkWifiStatus() async { final status = await WifiFlutter.isWifiEnabled; setState(() => _wifiEnabled = status); } Future<void> _toggleWifi() async { // 申请位置权限(Android 6.0+必需) final permissionStatus = await Permission.location.request(); if (!permissionStatus.isGranted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('需要位置权限才能操作WiFi')), ); return; } try { // 尝试直接切换WiFi await WifiFlutter.toggleWifi(); await _checkWifiStatus(); } catch (_) { // 高版本系统切换失败,引导到设置页面 await WifiFlutter.openWifiSettings(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('WiFi开关')), body: Center( child: ElevatedButton( onPressed: _toggleWifi, child: Text(_wifiEnabled ? '关闭WiFi' : '开启WiFi'), ), ), ); } }
方案2:全平台通用(一键打开WiFi设置)
如果不需要直接控制,仅需引导用户到设置页面操作,用url_launcher实现:
步骤1:添加依赖
dependencies: url_launcher: ^6.1.10
步骤2:代码实现
import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; class WifiSettingsLauncher extends StatelessWidget { const WifiSettingsLauncher({super.key}); Future<void> _openWifiSettings() async { const androidUri = Uri.parse('android.settings.WIFI_SETTINGS'); const iosUri = Uri.parse('App-Prefs:root=WIFI'); if (await canLaunchUrl(androidUri)) { await launchUrl(androidUri); } else if (await canLaunchUrl(iosUri)) { await launchUrl(iosUri); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('无法打开WiFi设置页面')), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('WiFi设置')), body: Center( child: ElevatedButton( onPressed: _openWifiSettings, child: const Text('打开WiFi设置'), ), ), ); } }
注意事项
- Android 10+的WiFi控制限制是系统级的,任何普通应用都无法绕过,只能引导用户手动操作。
- iOS的URL Scheme
App-Prefs:root=WIFI在部分版本可能存在兼容性问题,若失效可改用url_launcher的openAppSettings()方法打开应用设置,再让用户手动进入WiFi设置。
内容的提问来源于stack exchange,提问作者Ahmed Jamil
相关产品推荐
相关产品推荐

