Flutter无线网络状态检测插件wifi_state的使用

Flutter无线网络状态检测插件wifi_state的使用

wifi_state 插件用于检查Android设备上的Wi-Fi是否开启或关闭。此外,你还可以使用该插件启用或打开Wi-Fi。

  • 在Android Q及更高版本上,直接启用Wi-Fi会启动Wi-Fi设置页面。
  • 在Android Q之前的版本上,可以直接启用Wi-Fi。

以下是使用 wifi_state 插件的完整示例代码:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:wifi_state/wifi_state.dart';

class Example extends StatefulWidget {
  const Example({super.key});

  [@override](/user/override)
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> with WidgetsBindingObserver {
  bool? isWifiOn;

  // 获取Wi-Fi状态
  fetchWifiState() {
    SchedulerBinding.instance.addPostFrameCallback((_) async {
      isWifiOn = await WifiState.isOn();
      if (mounted) {
        setState(() {});
      }
    });
  }

  // Wi-Fi开关按钮
  Widget wifiToggleButton() {
    return Switch(
      value: isWifiOn!,
      activeTrackColor: Colors.green,
      thumbIcon: WidgetStateProperty.resolveWith(
        (a) {
          return isWifiOn! ? Icon(Icons.wifi) : Icon(Icons.wifi_off);
        },
      ),
      onChanged: (val) async {
        if (!isWifiOn!) {
          /// 在Android Q及更高版本上,直接启用Wi-Fi会启动Wi-Fi设置页面
          /// 在Android Q之前的版本上,可以直接启用Wi-Fi
          await WifiState.open();
        } else {
          snack(
            context,
            '你可以在设置中关闭它。',
          );
        }
      },
    );
  }

  // 应用生命周期状态变化时触发
  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      fetchWifiState();
    }
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    fetchWifiState();
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Wi-Fi状态'),
        actions: [
          isWifiOn == null ? CupertinoActivityIndicator() : wifiToggleButton(),
        ],
      ),
    );
  }
}

// 显示提示信息
void snack(BuildContext context, String msg) {
  ScaffoldMessenger.of(context).removeCurrentSnackBar();
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(
        msg,
        textAlign: TextAlign.center,
        style: const TextStyle(
          color: Colors.white,
          fontWeight: FontWeight.bold,
        ),
      ),
    ),
  );
}

示例说明

  1. 导入必要的包

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/scheduler.dart';
    import 'package:wifi_state/wifi_state.dart';
    
  2. 定义一个状态类 _ExampleState,并实现 WidgetsBindingObserver 接口以便监听应用生命周期的变化。

    class _ExampleState extends State<Example> with WidgetsBindingObserver {
    
  3. 定义一个布尔变量 isWifiOn 来存储Wi-Fi的状态

    bool? isWifiOn;
    
  4. 定义一个方法 fetchWifiState 来获取Wi-Fi的状态

    fetchWifiState() {
      SchedulerBinding.instance.addPostFrameCallback((_) async {
        isWifiOn = await WifiState.isOn();
        if (mounted) {
          setState(() {});
        }
      });
    }
    
  5. 定义一个方法 wifiToggleButton 来创建一个开关按钮

    Widget wifiToggleButton() {
      return Switch(
        value: isWifiOn!,
        activeTrackColor: Colors.green,
        thumbIcon: WidgetStateProperty.resolveWith(
          (a) {
            return isWifiOn! ? Icon(Icons.wifi) : Icon(Icons.wifi_off);
          },
        ),
        onChanged: (val) async {
          if (!isWifiOn!) {
            await WifiState.open();
          } else {
            snack(
              context,
              '你可以在设置中关闭它。',
            );
          }
        },
      );
    }
    
  6. 在应用恢复时重新获取Wi-Fi状态

    [@override](/user/override)
    void didChangeAppLifecycleState(AppLifecycleState state) {
      if (state == AppLifecycleState.resumed) {
        fetchWifiState();
      }
    }
    
  7. initState 方法中添加观察者并在 dispose 方法中移除观察者

    [@override](/user/override)
    void initState() {
      super.initState();
      WidgetsBinding.instance.addObserver(this);
      fetchWifiState();
    }
    
    [@override](/user/override)
    void dispose() {
      WidgetsBinding.instance.removeObserver(this);
      super.dispose();
    }
    
  8. build 方法中构建UI

    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: const Text('Wi-Fi状态'),
          actions: [
            isWifiOn == null ? CupertinoActivityIndicator() : wifiToggleButton(),
          ],
        ),
      );
    }
    
  9. 定义一个方法 snack 来显示提示信息

    void snack(BuildContext context, String msg) {
      ScaffoldMessenger.of(context).removeCurrentSnackBar();
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(
            msg,
            textAlign: TextAlign.center,
            style: const TextStyle(
              color: Colors.white,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
      );
    }
    

更多关于Flutter无线网络状态检测插件wifi_state的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter无线网络状态检测插件wifi_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,wifi_state 是一个用于检测当前设备 Wi-Fi 连接状态的插件。它可以让你获取 Wi-Fi 的开关状态、SSID(网络名称)、BSSID(基本服务集标识符)等信息。以下是 wifi_state 插件的使用步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 wifi_state 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  wifi_state: ^0.0.1

然后运行 flutter pub get 来获取依赖包。

2. 导入插件

在你的 Dart 文件中导入 wifi_state 插件:

import 'package:wifi_state/wifi_state.dart';

3. 检测 Wi-Fi 状态

你可以使用 WifiState 类来检测 Wi-Fi 的状态。以下是一个简单的示例,展示如何获取当前 Wi-Fi 的开关状态和 SSID:

import 'package:flutter/material.dart';
import 'package:wifi_state/wifi_state.dart';

class WifiStateScreen extends StatefulWidget {
  @override
  _WifiStateScreenState createState() => _WifiStateScreenState();
}

class _WifiStateScreenState extends State<WifiStateScreen> {
  String _wifiState = 'Unknown';
  String _wifiSSID = 'Unknown';

  @override
  void initState() {
    super.initState();
    _checkWifiState();
  }

  Future<void> _checkWifiState() async {
    try {
      // 获取 Wi-Fi 状态
      bool isWifiEnabled = await WifiState.isWifiEnabled();
      setState(() {
        _wifiState = isWifiEnabled ? 'Enabled' : 'Disabled';
      });

      // 如果 Wi-Fi 是开启状态,获取 SSID
      if (isWifiEnabled) {
        String ssid = await WifiState.getWifiSSID();
        setState(() {
          _wifiSSID = ssid;
        });
      }
    } catch (e) {
      print('Error: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Wi-Fi State Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Wi-Fi State: $_wifiState'),
            SizedBox(height: 20),
            Text('Wi-Fi SSID: $_wifiSSID'),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: WifiStateScreen(),
));

4. 处理权限

在 Android 和 iOS 上,获取 Wi-Fi 信息可能需要特定的权限。

Android

AndroidManifest.xml 中添加以下权限:

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

iOS

在 iOS 上,你需要添加 Privacy - Location When In Use Usage DescriptionInfo.plist 文件中,因为获取 Wi-Fi 信息需要位置权限。

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need access to your location to get Wi-Fi information.</string>
回到顶部