connectivity 0.4.8+6

  • Readme
  • Changelog
  • Example
  • Installing
  • 100

connectivity #

该插件允许Flutter应用发现网络连接并进行相应配置. 它可以区分蜂窝连接和WiFi连接. 该插件适用于iOS和Android.

请注意,在Android上,这不保证可以连接到Internet. 例如,该应用程序可能具有wifi访问功能,但可能是VPN或无法访问的酒店WiFi.

请为connectivity: '>=0.4.y+x <2.0.0'设置约束connectivity: '>=0.4.y+x <2.0.0'

Backward compatible 1.0.0 version is coming #

该插件已达到稳定的API,我们保证1.0.0版将向后兼容0.4.y+z . 请使用connectivity: '>=0.4.y+x <2.0.0'作为依赖项约束,以允许更顺畅的生态系统迁移. 有关更多详细信息,请参见: https : //github.com/flutter/flutter/wiki/Package-migration-to-1.0.0

Usage #

用于检查当前状态的样本用法:

import 'package:connectivity/connectivity.dart';

var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
  // I am connected to a mobile network.
} else if (connectivityResult == ConnectivityResult.wifi) {
  // I am connected to a wifi network.
}

请注意,不应使用当前的网络状态来确定是否可以可靠地建立网络连接. 始终保护您的应用程序代码免受网络层可能造成的超时和错误的影响.

您还可以通过订阅连接插件公开的流来侦听网络状态更改:

import 'package:connectivity/connectivity.dart';

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

  subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
    // Got a new connectivity status!
  })
}

// Be sure to cancel subscription after you are done
@override
dispose() {
  super.dispose();

  subscription.cancel();
}

请注意,从Android O开始,连接更改将不再在后台传达给Android应用.恢复应用后,您应始终检查连接状态. 仅当您的应用程序位于前台时,广播才有用.

您可以使用以下方法获取与wi-fi相关的信息:

import 'package:connectivity/connectivity.dart';

var wifiBSSID = await (Connectivity().getWifiBSSID());
var wifiIP = await (Connectivity().getWifiIP());network
var wifiName = await (Connectivity().getWifiName());wifi network

iOS 12 #

要在iOS> = 12上使用.getWifiBSSID().getWifiName() ,必须启用XCode中的Access WiFi information capability . 否则,这两种方法都将返回null.

iOS 13 #

方法.getWifiBSSID().getWifiName()利用iOS上的CNCopyCurrentNetworkInfo函数.

从iOS 13开始,Apple宣布这些API将不再返回有效信息. 与iOS 12或更早版本关联的应用会收到伪值,例如:

  • SSID:" Wi-Fi"或" WLAN"(对于中国SKU,将返回" WLAN").

  • BSSID:" 00:00:00:00:00:00"

与iOS 13或更高版本链接的应用程序会收到null .

CNCopyCurrentNetworkInfo将适用于以下应用程序:

  • 该应用程序使用"核心位置",并获得用户使用位置信息的授权.

  • 该应用程序使用NEHotspotConfiguration API配置当前的Wi-Fi网络.

  • 该应用程序已安装了活动的VPN配置.

如果您的应用程序属于最后两类,它将按原样运行. 如果您的应用程序不属于最后两类,并且您仍然需要访问wifi信息,则应请求用户授权才能使用位置信息.

此插件中提供了一个帮助程序方法来请求位置授权: requestLocationServiceAuthorization . 要请求位置授权,请确保将以下密钥添加到位于<project root>/ios/Runner/Info.plist Info.plist文件中:

  • NSLocationAlwaysAndWhenInUseUsageDescription描述为什么应用程序NSLocationAlwaysAndWhenInUseUsageDescription需要访问用户的位置信息(前景和背景). 在可视编辑器中,这称为" 隐私-始终定位和使用时使用情况说明 ".
  • NSLocationWhenInUseUsageDescription描述当应用程序在前台运行时,为什么应用程序需要访问用户的位置信息. 在视觉编辑器中,这称为" 隐私-使用中的位置用法说明 ".

Getting Started #

要获得Flutter入门方面的帮助,请查看我们的在线文档 .

有关编辑插件代码的帮助,请参阅文档 .

0.4.8+6 #

  • 将dart依赖关系的下限更新为2.1.0.

0.4.8+5 #

0.4.8+4 #

  • 将最低Flutter版本提升到1.12.13 + hotfix.5.
  • 清除框架v1.12之后不再需要的各种Android解决方法.
  • 完整的v2嵌入支持.
  • 修复CocoaPods podspec棉绒警告.

0.4.8+3 #

  • 替换Android上已弃用的getFlutterEngine调用.

0.4.8+2 #

  • 删除示例应用程序的硬编码ios工作区设置.

0.4.8+1 #

  • 使学究的dev_dependency明确.

0.4.8 #

  • 将macOS添加为认可的平台.

0.4.7 #

  • 迁移插件以使用在Connectivity_platform_interface包中定义的ConnectivityPlatform.instance.

0.4.6+2 #

  • 将不推荐使用的BinaryMessages迁移到ServicesBinding.instance.defaultBinaryMessenger.
  • 将Flutter SDK颠簸到1.12.13 + hotfix.5或更高版本(电流稳定).

0.4.6+1 #

  • 从pubspec.yaml中删除不推荐使用的author:字段
  • 将插件迁移到pubspec平台清单.
  • 需要Flutter SDK 1.10.0或更高版本.

0.4.6 #

  • 添加macOS支持.

0.4.5+8 #

  • 更新文档以解释何时在Android上收到连接性更新.

0.4.5+7 #

  • 在示例应用程序和测试中修复未等待的期货.

0.4.5+6 #

  • 修复iOS上的单例可到达性问题.

0.4.5+5 #

  • 添加分析器检查以获取公共文档.

0.4.5+4 #

  • 稳定性和可维护性:更新文档.

0.4.5+3 #

  • 删除AndroidX警告.

0.4.5+2 #

  • 将生命周期依赖项包含为Android上的compileOnly,以解决与其他传递库的潜在版本冲突.

0.4.5+1 #

  • Android:在build.gradle使用android.arch.lifecycle而不是androidx.lifecycle:lifecycle来支持尚未迁移到AndroidX的应用程序.

0.4.5 #

  • 支持Android v2嵌入器.

0.4.4+1 #

  • 更新和迁移iOS示例项目.
  • 定义iOS的clang模块.

0.4.4 #

  • 添加requestLocationServiceAuthorization以在iOS上请求位置授权.
  • 添加getLocationServiceAuthorization以获取iOS上的位置授权状态.
  • 更新自述文件:使用CNCopyCurrentNetworkInfo添加有关iOS 13更新的更多信息.

0.4.3+7 #

  • 使用有关iOS 13上CNCopyCurrentNetworkInfo的更新信息来更新README.

0.4.3+6 #

  • [Android]修复了无效的抑制检查(应为"不赞成使用"而不是"不赞成使用").

0.4.3+5 #

  • [Android]添加了对check() API 29支持.
  • [Android]禁止使用已弃用的API的警告.

0.4.3+4 #

  • [Android]更新了检索网络信息的逻辑.

0.4.3+3 #

  • 在Android上支持TYPE_MOBILE_HIPRI.

0.4.3+2 #

  • 将缺少的模板类型参数添加到invokeMethod调用中.

0.4.3+1 #

  • 访问Wifi服务时,通过使用getApplicationContext()修复lint错误.

0.4.3 #

  • 添加getWifiBSSID以获取当前wifi网络的BSSID.

0.4.2+2 #

  • 添加集成测试.

0.4.2+1 #

  • 将Flutter的最低版本提高到1.2.0.
  • 将模板类型参数添加到invokeMethod调用.

0.4.2 #

  • 添加getWifiIP()以获得当前的wifi网络的IP.

0.4.1 #

  • 添加单元测试.

0.4.0+2 #

  • 在构建时记录有关先前AndroidX迁移的更详细的警告.

0.4.0+1 #

  • Connectivity更新为单例.

0.4.0 #

  • 零钱 . 从已弃用的原始Android支持库迁移到AndroidX. 这不应该导致任何功能上的变化,但是如果使用原始插件的Android应用程序也必须迁移 ,因此它们也必须进行迁移 .

0.3.2 #

  • 添加getWifiName()以获得当前wifi网络的SSID.

0.3.1 #

  • 更新了Gradle工具以匹配Android Studio 3.1.2.

0.3.0 #

  • 零钱 . 设置SDK约束以匹配Flutter beta版本.

0.2.1 #

  • 修复了来自Dart 2.0分析仪的警告.
  • 将Android项目模板简化并升级到Android SDK 27.
  • 更新了程序包描述.

0.2.0 #

  • 零钱 . 升级到Gradle 4.1和Android Studio Gradle插件3.0.1. 较早的Flutter项目也需要升级其Gradle设置才能使用此版本的插件. 说明可以在这里找到.

0.1.1 #

  • 将FLT前缀添加到iOS类型.

0.1.0 #

  • 重大的API更改:拥有一个连通性类而不是顶层函数
  • 引入监听网络状态变化的能力

0.0.1 #

  • 初始发行

example/lib/main.dart

// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'dart:async';
import 'dart:io';

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

// Sets a platform override for desktop to avoid exceptions. See
// https://flutter.dev/desktop#target-platform-override for more info.
void _enablePlatformOverrideForDesktop() {
  if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) {
    debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  }
}

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _connectionStatus = 'Unknown';
  final Connectivity _connectivity = Connectivity();
  StreamSubscription<ConnectivityResult> _connectivitySubscription;

  @override
  void initState() {
    super.initState();
    initConnectivity();
    _connectivitySubscription =
        _connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
  }

  @override
  void dispose() {
    _connectivitySubscription.cancel();
    super.dispose();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initConnectivity() async {
    ConnectivityResult result;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      result = await _connectivity.checkConnectivity();
    } on PlatformException catch (e) {
      print(e.toString());
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) {
      return Future.value(null);
    }

    return _updateConnectionStatus(result);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: Center(child: Text('Connection Status: $_connectionStatus')),
    );
  }

  Future<void> _updateConnectionStatus(ConnectivityResult result) async {
    switch (result) {
      case ConnectivityResult.wifi:
        String wifiName, wifiBSSID, wifiIP;

        try {
          if (Platform.isIOS) {
            LocationAuthorizationStatus status =
                await _connectivity.getLocationServiceAuthorization();
            if (status == LocationAuthorizationStatus.notDetermined) {
              status =
                  await _connectivity.requestLocationServiceAuthorization();
            }
            if (status == LocationAuthorizationStatus.authorizedAlways ||
                status == LocationAuthorizationStatus.authorizedWhenInUse) {
              wifiName = await _connectivity.getWifiName();
            } else {
              wifiName = await _connectivity.getWifiName();
            }
          } else {
            wifiName = await _connectivity.getWifiName();
          }
        } on PlatformException catch (e) {
          print(e.toString());
          wifiName = "Failed to get Wifi Name";
        }

        try {
          if (Platform.isIOS) {
            LocationAuthorizationStatus status =
                await _connectivity.getLocationServiceAuthorization();
            if (status == LocationAuthorizationStatus.notDetermined) {
              status =
                  await _connectivity.requestLocationServiceAuthorization();
            }
            if (status == LocationAuthorizationStatus.authorizedAlways ||
                status == LocationAuthorizationStatus.authorizedWhenInUse) {
              wifiBSSID = await _connectivity.getWifiBSSID();
            } else {
              wifiBSSID = await _connectivity.getWifiBSSID();
            }
          } else {
            wifiBSSID = await _connectivity.getWifiBSSID();
          }
        } on PlatformException catch (e) {
          print(e.toString());
          wifiBSSID = "Failed to get Wifi BSSID";
        }

        try {
          wifiIP = await _connectivity.getWifiIP();
        } on PlatformException catch (e) {
          print(e.toString());
          wifiIP = "Failed to get Wifi IP";
        }

        setState(() {
          _connectionStatus = '$result\n'
              'Wifi Name: $wifiName\n'
              'Wifi BSSID: $wifiBSSID\n'
              'Wifi IP: $wifiIP\n';
        });
        break;
      case ConnectivityResult.mobile:
      case ConnectivityResult.none:
        setState(() => _connectionStatus = result.toString());
        break;
      default:
        setState(() => _connectionStatus = 'Failed to get connectivity.');
        break;
    }
  }
}

Use this package as a library

1. Depend on it

将此添加到包的pubspec.yaml文件中:


dependencies:
  connectivity: ^0.4.8+6

2. Install it

您可以从命令行安装软件包:

使用Flutter:


$ flutter pub get

另外,您的编辑器可能支持flutter pub get . 查看您的编辑器文档以了解更多信息.

3. Import it

现在,在Dart代码中,您可以使用:


import 'package:connectivity/connectivity.dart';
  
Popularity:
描述该程序包相对于其他程序包的受欢迎程度. [更多]
99
Health:
从静态分析得出的代码运行状况. [更多]
100
Maintenance:
反映出软件包的整洁和最新状态. [更多]
100
Overall:
以上的加权分数. [更多]
100
了解有关得分的更多信息.

我们在2020年5月23日分析了此软件包,并在下面提供了得分,详细信息和建议. using: 分析已完成,状态使用以下命令 :

  • 飞镖:2.8.1
  • 直到:0.13.8-dev
  • 颤振:1.17.0

Dependencies

Package Constraint Resolved Available
直接依赖
Dart SDK > = 2.1.0 <3.0.0
connectivity_macos ^0.1.0 0.1.0+3
connectivity_platform_interface ^1.0.2 1.0.6
flutter 0.0.0
meta ^1.0.5 1.1.8
传递依存关系
collection 1.14.12
sky_engine 0.0.99
typed_data 1.1.6
vector_math 2.0.8
开发依赖
e2e ^0.2.0
flutter_driver
flutter_test
mockito ^4.1.1
pedantic ^1.8.0
plugin_platform_interface ^1.0.0 1.0.2
test any

by  ICOPY.SITE