Flutter网络连接状态检测插件connectivity_widget的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter网络连接状态检测插件 connectivity_widget 的使用

connectivity_widget 是一个用于检测手机是否连接到互联网的Flutter插件。它不仅通过检查移动网络和/或Wi-Fi的状态来确定连接状态,还会通过ping远程服务器并验证其响应来确认网络连接。

使用 ConnectivityWidget

ConnectivityWidget 使用一个 builder 函数,该函数提供了一个 isOnline 标志,用于构建不同的离线或在线模式界面。

示例代码

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

void main() {
  /// 设置 Connectivity Utils
  ConnectivityUtils.instance
    ..serverToPing =
        "https://gist.githubusercontent.com/Vanethos/dccc4b4605fc5c5aa4b9153dacc7391c/raw/355ccc0e06d0f84fdbdc83f5b8106065539d9781/gistfile1.txt"
    ..verifyResponseCallback =
        (response) => response.contains("This is a test!");

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Connectivity Widget Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({required this.title, super.key});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ConnectivityWidget(
        onlineCallback: _incrementCounter,
        builder: (context, isOnline) => Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                isOnline ? 'Online' : 'Offline',
                style: TextStyle(
                    fontSize: 30, color: isOnline ? Colors.green : Colors.red),
              ),
              const SizedBox(
                height: 20,
              ),
              const Text(
                'Number of times we checked internet connection:',
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.displayLarge,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

参数配置

  • serverToPing: 指定要ping的服务器地址。
  • timeoutDuration: 设置请求超时时间。
  • debounceDuration: 设置防抖动时间。
  • verifyResponseCallback: 自定义回调函数,用于验证服务器响应。

更改要ping的服务器和响应验证

默认情况下,ConnectivityWidget 会检查是否连接到 http://www.google.com。如果需要检查自定义端点的可用性,可以设置新的端点并提供一个回调函数来验证响应。

ConnectivityUtils.instance.setCallback((response) => response.contains("This is a test!"));
ConnectivityUtils.instance.setServerToPing("https://gist.githubusercontent.com/Vanethos/dccc4b4605fc5c5aa4b9153dacc7391c/raw/355ccc0e06d0f84fdbdc83f5b8106065539d9781/gistfile1.txt");

使用 ConnectivityUtils 监听网络变化

该库还提供了对 ConnectivityUtils 类的访问,可以通过它来验证网络状态。

Stream<bool> ConnectivityUtils.instance.isPhoneConnectedStream // 获取当前网络状态
Future<bool> ConnectivityUtils.instance.isPhoneConnected() // 确定网络状态的未来

Web环境下的注意事项

虽然可以在Web环境下验证连接状态,但由于浏览器会对特定端点的请求进行缓存,因此无法确切地判断连接是否断开或正在使用缓存。

通过以上示例和说明,您可以轻松在Flutter项目中集成并使用 connectivity_widget 插件来检测网络连接状态。


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

1 回复

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


当然,以下是如何在Flutter项目中使用connectivity_widget插件来检测网络连接状态的代码案例。connectivity_widget是一个用于简化网络连接状态检测与UI更新的Flutter插件。不过需要注意的是,connectivity_widget这个具体的包名在Flutter的官方或常见社区库中并不常见,因此我将以一个类似的实现思路来展示,主要是使用connectivity包结合自定义Widget来实现网络连接状态检测。

首先,你需要添加connectivity包到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  connectivity: ^3.0.6  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,创建一个自定义Widget来检测网络连接状态,并更新UI。以下是一个完整的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Connectivity Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ConnectivityScreen(),
    );
  }
}

class ConnectivityScreen extends StatefulWidget {
  @override
  _ConnectivityScreenState createState() => _ConnectivityScreenState();
}

class _ConnectivityScreenState extends State<ConnectivityScreen> {
  final Connectivity _connectivity = Connectivity();
  ConnectivityResult _connectionStatus = ConnectivityResult.none;

  @override
  void initState() {
    super.initState();
    initConnectivity();

    // 监听网络连接变化
    _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
      setState(() {
        _connectionStatus = result;
      });
    });
  }

  // 检查网络连接状态
  Future<void> initConnectivity() async {
    String connectivityResult;

    try {
      final result = await _connectivity.checkConnectivity();
      connectivityResult = result.toString();
      setState(() {
        _connectionStatus = result;
      });
    } catch (e) {
      print("Error: $e");
      connectivityResult = 'Failed to get connectivity.';
    }

    if (!mounted) return;

    setState(() {
      // 更新UI
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('网络连接状态'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '当前网络连接状态: $_connectionStatus',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            if (_connectionStatus == ConnectivityResult.wifi ||
                _connectionStatus == ConnectivityResult.mobile)
              Text(
                '已连接',
                style: TextStyle(color: Colors.green, fontSize: 20),
              )
            else
              Text(
                '未连接',
                style: TextStyle(color: Colors.red, fontSize: 20),
              ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几步:

  1. pubspec.yaml中添加connectivity依赖。
  2. 创建一个MyApp应用,其首页是ConnectivityScreen
  3. ConnectivityScreen中,使用Connectivity类来检测网络连接状态。
  4. initState方法中调用initConnectivity来初始化网络连接状态,并设置监听器以在连接状态变化时更新UI。
  5. 根据当前的网络连接状态更新UI,显示“已连接”或“未连接”。

这个示例展示了如何在Flutter中检测网络连接状态并根据状态更新UI。如果你确实需要connectivity_widget这个特定插件(尽管它并不常见),请确保在pub.dev上查找正确的包名,并按照其文档进行集成。通常,自定义Widget和官方或社区提供的包可以灵活组合,以满足特定的需求。

回到顶部