You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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设置'),
        ),
      ),
    );
  }
}

注意事项

  1. Android 10+的WiFi控制限制是系统级的,任何普通应用都无法绕过,只能引导用户手动操作。
  2. iOS的URL Scheme App-Prefs:root=WIFI在部分版本可能存在兼容性问题,若失效可改用url_launcher的openAppSettings()方法打开应用设置,再让用户手动进入WiFi设置。

内容的提问来源于stack exchange,提问作者Ahmed Jamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:56