Flutter网络连接检测插件ac_connectivity的使用
Flutter网络连接检测插件ac_connectivity的使用
标题
Flutter网络连接检测插件ac_connectivity的使用
内容
-
connectivity_plus extended with Internet Connectivity
- 这个包扩展了
connectivity_plus
插件:- 带有互联网连接状态(可按需访问或通过变更流访问),
- 解决了Android应用从后台恢复时刷新连接的问题,
- 具有两种状态:
connectivity_plus
和互联网连接状态(有一些限制,见下文重要说明)。
- 这个包扩展了
-
Usage
-
Access to the original connectivity_plus members
-
checkConnectivity
final ConnectivityPlusState state = await Connectivity().checkConnectivityPlusState(); print(state); // ConnectivityPlusState.none, .mobile, .ethernet, etc.
-
onConnectivityChanged stream
Connectivity().getConnectivityPlusStream().listen((state) { // It is guaranteed that two successive events have different values. print(result); });
-
-
Internet connectivity
- 对于互联网连接,此包使用
ac_inet_connectivity_checker
并推荐配置根域名服务器的IPv4和IPv6地址。final state = Connectivity().lastInetConnectivityState; if (state == InetConnectivityState.disconnected) { // disconnected (same as ConnectivityResult.none) } else if (state == InetConnectivityState.connected) { // connected to a network without Internet access. } else if (state == InetConnectivityState.internet) { // connected to Internet. }
- 对于互联网连接,此包使用
-
On-demand fresh value
- 相对于网络连接测试,互联网连接测试允许定义超时。如果自己处理超时,则可以使用可取消的操作。注意,如果没有指定超时,可能会使用默认操作系统超时,通常是120秒。
final cancelableOperation = Connectivity().checkInetConnectivityState( timeout: const Duration(seconds: 3), ); final state = await cancelableOperation.value;
- 相对于网络连接测试,互联网连接测试允许定义超时。如果自己处理超时,则可以使用可取消的操作。注意,如果没有指定超时,可能会使用默认操作系统超时,通常是120秒。
-
Stream
-
Important note on Internet Connectivity Stream
- 检测互联网连接变化需要持续背景测试,以确保当应用程序重新上线时能够快速通知。
- 如果设备更改网络配置(例如,从4G网络切换到Wi-Fi网络),互联网检测几乎会立即发生。
- 而如果设备连接到具有无互联网访问的路由器的Wi-Fi网络,则可能需要指定
backgroundChecksInterval
配置中的时间(默认为0秒)来检测丢失连接。 - 当
Connectivity().lastInetConnectivityState == InetConnectivityState.internet
时,该包选择不进行常量背景互联网检查。相反,它提供了一个notifyChange
方法,您必须在HTTP请求错误时调用。即使不确定也可以调用它。
import 'package:http/http.dart' as http; try { var response = await http.get(Uri.https('google.com')); } on SocketException { Connectivity().notifyChange(); rethrow; } catch(error) { print(error); }
- 如果真的想实现常量背景互联网检查,可以参考以下示例:
CancelableTimer? connectivityChecker;
Connectivity().listen((state) { if (state == InetConnectivityState.internet) { connectivityChecker = CancelableTimer.periodic( const Duration(seconds: 60), (_) => Connectivity().checkInetConnectivityState(), wait: true, ); } else { connectivityChecker?.cancel(); connectivityChecker = null; } })
-
-
示例代码
// SPDX-FileCopyrightText: © 223 - 2024 Anthony Champagne <dev@anthonychampagne.fr>
//
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:async';
import 'package:ac_connectivity/ac_connectivity.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ConnectivityPlusState? _lastConnectivityPlusState;
InetConnectivityState? _lastInetConnectivityState;
StreamSubscription? _inetConnectivityStreamSubscription;
StreamSubscription? _connectivityPlusStreamSubscription;
[@override](/user/override)
void initState() {
super.initState();
_lastConnectivityPlusState = Connectivity().lastConnectivityPlusState;
_lastInetConnectivityState = Connectivity().lastInetConnectivityState;
_connectivityPlusStreamSubscription =
Connectivity().getConnectivityPlusStream().listen((state) {
setState(() {
_lastConnectivityPlusState = state;
});
});
_inetConnectivityStreamSubscription = Connectivity().listen((state) {
setState(() {
_lastInetConnectivityState = state;
});
});
}
[@override](/user/override)
void dispose() {
_inetConnectivityStreamSubscription?.cancel();
_connectivityPlusStreamSubscription?.cancel();
super.dispose();
}
void _notifyConnectivityChange() {
Connectivity().notifyChange();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('Last connectivity_plus state:'),
Text(
'$_lastConnectivityPlusState',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
const Text('Last Internet connectivity state:'),
Text(
'$_lastInetConnectivityState',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _notifyConnectivityChange,
tooltip: 'Notify connectivity change',
child: const Icon(Icons.refresh),
),
);
}
}
更多关于Flutter网络连接检测插件ac_connectivity的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html