Flutter - 检查 Internet 连接示例[Flutter专题14]

2021-12-07 15:09:57 浏览数 (1)

Flutter - 检查 Internet 连接示例

本教程为您提供了如何在 Flutter 中检查互联网连接的示例。

有时,您可能想要检查运行您的应用程序的设备的互联网连接。如果应用程序是使用 Flutter 开发的,您可以阅读本教程中的示例。

码字不易,点个赞,点亮再看,支持一下。

本实例flutter版本2.5.3,开启空安全

使用connectivity_plus

有一个来自 Flutter Community的connectivity_plus包,可以轻松获取当前网络状态。首先,将其添加为pubspec.yaml文件中的依赖项。

代码语言:javascript复制
  dependencies:
    connectivity_plus: ^1.0.6

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

要使用该包,您需要在要使用它的文件上添加下面的语句。

代码语言:javascript复制
  import 'package:connectivity_plus/connectivity_plus.dart';

获取 当前的连接状态

要获取当前的连接状态,您必须获取 Connectivity 的实例并调用其 checkConnectivity 方法。Connectivity 的构造函数已经返回了一个单例,所以你可以多次调用它,它会返回同一个实例。checkConnectivity 方法返回 ConnectivityResult 枚举,其值为:

  • wifi:通过 Wi-Fi 连接的设备。
  • mobile:连接到蜂窝网络的设备。
  • none: 设备未连接到任何网络.

下面是一个检查当前连接状态的函数。

代码语言:javascript复制
  ConnectivityResult? _connectivityResult;
 
  Future<void> _checkConnectivityState() async {
    final ConnectivityResult result = await Connectivity().checkConnectivity();
 
    if (result == ConnectivityResult.wifi) {
      print('Connected to a Wi-Fi network');
    } else if (result == ConnectivityResult.mobile) {
      print('Connected to a mobile network');
    } else {
      print('Not connected to any network');
    }
 
    setState(() {
      _connectivityResult = result;
    });
  }

监听连接状态变化

该软件包还提供了一种侦听连接状态更改事件的简单方法。为此,您需要使用 Connectivity 的 onConnectivityChanged 属性,其类型为 Stream。然后,调用 Stream 的 listen 方法并传递要在连接状态更改时调用的函数。该函数必须接受一个类型为 ConnectivityResult 的参数。在函数内部,您可以处理连接状态发生变化时要执行的操作。确保您在不再使用时取消订阅,这可以在 dispose 方法中完成。

代码语言:javascript复制
  ConnectivityResult? _connectivityResult;
  late StreamSubscription _connectivitySubscription;
 
  @override
  initState() {
    super.initState();
 
    _connectivitySubscription = Connectivity().onConnectivityChanged.listen((
        ConnectivityResult result
    ) {
      print('Current connectivity status: $result');
      _connectivityResult = result;
    });
  }
 
  @override
  dispose() {
    super.dispose();
 
    _connectivitySubscription.cancel();
  }

请记住,上述方法仅检查设备是否已连接到 Wi-Fi 或移动网络。它不会检查连接的网络是否可以访问 Internet。

使用 InternetAddress.lookup

为了检查设备是否可以访问互联网,您可以尝试执行地址查找。在 Flutter 中,可以通过使用 dart:io 包来完成。它具有 InternetAddress.lookup 方法,可用于执行地址查找。因此,您需要通过传递有效且可访问的主机来调用该方法。如果结果不为空且不出错,则表示查找成功,设备已连接到互联网

代码语言:javascript复制
  bool? _isConnectionSuccessful;
 
  Future<void> _tryConnection() async {
    try {
      final response = await InternetAddress.lookup('1');
 
      setState(() {
        _isConnectionSuccessful = response.isNotEmpty;
      });
    } on SocketException catch (e) {
      setState(() {
        _isConnectionSuccessful = false;
      });
    }
  }

如果设备未连接到互联网,您将收到以下错误。如果给定的地址无效,您也会得到同样的错误。

代码语言:javascript复制
SocketException: Failed host lookup: '1' (OS Error: No address associated with hostname, errno = 7)

完整代码

代码语言:javascript复制
import 'dart:async';
import 'dart:io';

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '坚果前端',
      home: ConnectivityStatusExample(),
    );
  }
}

extension ParseToString on ConnectivityResult {
  String toValue() {
    return this.toString().split('.').last;
  }
}

class ConnectivityStatusExample extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _ConnectivityStatusExampleState();
  }
}

class _ConnectivityStatusExampleState extends State<ConnectivityStatusExample> {
  static const TextStyle textStyle = const TextStyle(
    fontSize: 16,
  );

  ConnectivityResult? _connectivityResult;
  late StreamSubscription _connectivitySubscription;
  bool? _isConnectionSuccessful;

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

    _connectivitySubscription = Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) {
      print('Current connectivity status: $result');
      setState(() {
        _connectivityResult = result;
      });
    });
  }

  @override
  dispose() {
    super.dispose();

    _connectivitySubscription.cancel();
  }

  Future<void> _checkConnectivityState() async {
    final ConnectivityResult result = await Connectivity().checkConnectivity();

    if (result == ConnectivityResult.wifi) {
      print('Connected to a Wi-Fi network');
    } else if (result == ConnectivityResult.mobile) {
      print('Connected to a mobile network');
    } else {
      print('Not connected to any network');
    }

    setState(() {
      _connectivityResult = result;
    });
  }

  Future<void> _tryConnection() async {
    try {
      final response = await InternetAddress.lookup('www.baidu.com');

      setState(() {
        _isConnectionSuccessful = response.isNotEmpty;
      });
    } on SocketException catch (e) {
      print(e);
      setState(() {
        _isConnectionSuccessful = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: const Text('公众号:坚果前端'),
        centerTitle: true,
        backgroundColor: Colors.teal,
      ),
      body: SizedBox(
        width: double.infinity,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Connection status: ${_connectivityResult?.toValue()}',
              style: textStyle,
            ),
            Text(
              'Is connection success: $_isConnectionSuccessful',
              style: textStyle,
            ),
            OutlinedButton(
              child: const Text('Check internet connection'),
              onPressed: () => _checkConnectivityState(),
            ),
            OutlinedButton(
              child: const Text('Try connection'),
              onPressed: () => _tryConnection(),
            ),
          ],
        ),
      ),
    );
  }
}

概括

这就是如何使用 Flutter 检查设备的互联网连接。要检查设备是否已连接到 Wi-Fi 或移动网络,您可以使用该connectivity_plus包,它具有检查当前连接状态和监听连接状态变化的功能。如果您想检查设备是否可以访问互联网,您可以执行地址查找。

0 人点赞