我如何使用肘节检查连接性?

2024-03-27

我需要使用连接库检查应用程序内每个页面的连接性, 所以我将在提供者内部使用一肘。问题是何时关闭流以便在用户关闭应用程序时可以处理它?

像这样:

import 'package:connectivity/connectivity.dart';
@override
dispose() {
  super.dispose();
  subscription.cancel();
}

 

1.确保已经导入flutter_bloc and connectivity_plus在你的pubspec.yaml.

2. 创建 InternetCubit 文件:

  • internet_cubit.dart
  • 互联网状态.dart

3.internet_state.dart:

在这里,我们为肘节和肘节状态创建带有连接类型的枚举:

part of 'internet_cubit.dart';

enum ConnectionType {
  wifi,
  mobile,
}

@immutable
abstract class InternetState {}

class InternetLoading extends InternetState {}

class InternetConnected extends InternetState {
  final ConnectionType connectionType;

  InternetConnected({@required this.connectionType});
}

class InternetDisconnected extends InternetState {}

4.internet_cubit.dart:

Cubit 依赖于连接插件,因此我们导入它并创建一个流订阅,以便能够对连接更改做出反应。

我们还定义了两个方法emitInternetConnected and emitInternetDisconnected这将改变实际的肘状态。

确保正确处理流订阅。

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:meta/meta.dart';

part 'internet_state.dart';

class InternetCubit extends Cubit<InternetState> {
  final Connectivity connectivity;
  StreamSubscription connectivityStreamSubscription;
  InternetCubit({@required this.connectivity})
      : assert(connectivity != null),
        super(InternetLoading()) {
    connectivityStreamSubscription =
        connectivity.onConnectivityChanged.listen((connectivityResult) {
      if (connectivityResult == ConnectivityResult.wifi) {
        emitInternetConnected(ConnectionType.wifi);
      } else if (connectivityResult == ConnectivityResult.mobile) {
        emitInternetConnected(ConnectionType.mobile);
      } else if (connectivityResult == ConnectivityResult.none) {
        emitInternetDisconnected();
      }
    });
  }

  void emitInternetConnected(ConnectionType _connectionType) =>
      emit(InternetConnected(connectionType: _connectionType));

  void emitInternetDisconnected() => emit(InternetDisconnected());

  @override
  Future<void> close() {
    connectivityStreamSubscription.cancel();
    return super.close();
  }
}

5. 在您的应用程序主文件中创建一个实例Connectivity插件并将其传递给您的BlocProvider。根据您的需求设置集体消费:

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:flutter_application_4/cubit/internet_cubit.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

void main() => runApp(MyApp(connectivity: Connectivity()));

class MyApp extends StatelessWidget {
  final Connectivity connectivity;

  const MyApp({Key key, this.connectivity}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => InternetCubit(connectivity: connectivity),
      child: MaterialApp(
        title: 'Connectivity cubit',
        home: Scaffold(
          appBar: AppBar(
            title: Text('Connectivity cubit spotlight'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                BlocBuilder<InternetCubit, InternetState>(
                  builder: (context, state) {
                    if (state is InternetConnected &&
                        state.connectionType == ConnectionType.wifi) {
                      return Text(
                        'Wifi',
                        style: TextStyle(color: Colors.green, fontSize: 30),
                      );
                    } else if (state is InternetConnected &&
                        state.connectionType == ConnectionType.mobile) {
                      return Text(
                        'Mobile',
                        style: TextStyle(color: Colors.yellow, fontSize: 30),
                      );
                    } else if (state is InternetDisconnected) {
                      return Text(
                        'Disconnected',
                        style: TextStyle(color: Colors.red, fontSize: 30),
                      );
                    }
                    return CircularProgressIndicator();
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何使用肘节检查连接性? 的相关文章

随机推荐

  • C#:存储百分比,50 还是 0.50?

    当在变量中保存百分比值时 会优先将它们保存为整数还是分数 也就是说 变量应该保存 0 到 100 之间的数字还是 0 00 到 1 00 之间的数字 在任何一种情况下 保存值的变量都是十进制类型 我正在交互的数据库恰好将它们存储为 0 到
  • Ionic 项目中的 GSAP

    如何将 GSAP 库导入到 Ionic 项目中 只是使用npm 安装 gsap当我通过导入时不起作用 import TweenMax TimelineMax from gsap 我使用打字稿 谢谢 你不需要打字 我在几个项目中使用过它 所有
  • 克服 Windows 用户对象句柄限制

    我正在寻找在构建重量级 Windows 界面时处理用户对象句柄限制的高级策略 请解释您如何使用 SWT 或直接 Windows GUI API 克服或绕过此问题 我唯一不感兴趣的是优化小部件使用的策略 因为我已经广泛地这样做了 但它并没有解
  • 为什么 RefCell:borrow_mut 在短路布尔 AND (&&) 两侧使用时会导致 BorrowMutError?

    我为 leetcode 编写了这段代码同一棵树问题 https leetcode com problems same tree use std cell RefCell use std rc Rc Definition for a bina
  • 读取文本文件 - fopen 与 ifstream

    谷歌搜索文件输入我发现了两种从文件输入文本的方法 fopen 和 ifstream 下面是两个片段 我有一个文本文件 其中包含一行 其中包含一个我需要读入的整数 我应该使用 fopen 还是 ifstream 片段 1 FOPEN FILE
  • meld - gi.glib.GError:主题中不存在图标“meld-change-apply-right”。安装有什么问题吗?

    我已经成功安装了 meld 3 14 2 和所有依赖包 通过从源代码编译每个包 并且所有包都安装在 NFS 共享上 prefix meld对于融合工具 prefix meld deps对于依赖项 最后 我调用了该工具 我可以看到 GUI 但
  • 隐藏水平滚动条

    我的水平滚动条有问题 我不想让它出现 实际上它只显示在 Chrome 中 而不会显示在 Internet Explorer 中 我能做些什么 我尝试过修改 css 类中的宽度和填充 但这也会改变布局 测试中的内容是动态的 因此它可以垂直溢出
  • 将 Java 类和方法移植到 Android。 (文本布局、字体、Graphics2D 等)

    我一直在 Android 中尝试并尝试通过 Java 应用程序进行移植 以下是我遇到的一些问题 希望得到一些指导 这是一个相当大的问题 而是多个问题 然而 我并不是盲目地询问他们 因为我已经对他们进行了研究 并试图运用我的理解 我花时间提出
  • 在 SQL Server 中将 COALESCE (或类似的东西)与 GROUP BY 一起使用

    我认为我缺少一些关于如何有效使用 GROUP BY 消除冗余记录的基本知识 我不断遇到似乎需要使用 COALESCE 的地方 但据我所知 这不适用于 GROUP BY 示例 我有一个表 其中包含访问 ID 和访问帐单代码的每种组合以及其他有
  • 使用 Cobertura 和 Jacoco 运行代码覆盖率

    我在获取 Maven 插件项目 使用调用程序插件进行集成测试 的 Sonar 中的集成测试和单元测试的代码覆盖率报告时遇到了一些问题 我无法使用默认的 Jacoco 覆盖率工具进行单元测试 因为这些工具使用 Powermock 这会导致使用
  • 如何制作逆序的for循环?

    编者注 这个问题是在 Rust 1 0 发布之前提出的 引入了 范围 运算符 该问题的代码不再代表当前的风格 但下面的一些答案使用了适用于 Rust 1 0 及更高版本的代码 我当时正在玩Rust 示例网站 https rustbyexam
  • 在 DOS/Batch 中,08 小于 1,但 07 大于 1。为什么?

    在 DOS 批处理中 if 08 lss 1 echo true 与 真 相呼应 09也是如此 08和09都小于1 However if 07 lss 1 echo true 不回显任何内容 01至07不小于1 为什么 08年和09年有什么
  • WebGL 绘制图像

    我是 WebGL 新手 之前在 Java 中使用过 OpenGL 我一直在尝试编写一个简单的函数 该函数以特定的大小和旋转在特定位置绘制图像 但在网上搜索了一段时间后 我的代码仍然无法运行 目前 我已经成功绘制了图像 但是该图像距离正确的位
  • 如何监听Hyperledger Fabric中的事件(commit事件)?

    我们建立了一个结构服务器 并将一些事务放入其中 我们有一些应用程序将与结构服务器配合 这是一个情况 应用程序发送交易fabric sdk java or fabric sdk node 面料执行chaincode 结构通知应用程序结果 应用
  • python中函数的精确计时

    我正在 Windows 上用 python 编程 希望准确测量函数运行所需的时间 我编写了一个函数 time it 它接受另一个函数 运行它 并返回运行所花费的时间 def time it f args start time clock f
  • ORA-02270: 此列列表没有匹配的唯一键或主键

    我有一张表 结构是 CREATE TABLE COURSE ACCREDITED COURSE ID VARCHAR2 50 NOT NULL ENABLE ACCREDITATION BODY ID VARCHAR2 50 NOT NUL
  • 如何覆盖 Material-ui 的选项卡选择颜色?

    我正在使用 Materialui tabs 主题构建 React 16 13 0 应用程序 https material ui com api tab https material ui com api tab 我在我的组件中创建了这些样式
  • 张量流是否通过pdf传播梯度

    可以说 分布函数定义如下 dist tf contrib distributions Normal mu sigma 并从分布中抽取样本 val dist pdf x 并且该值在模型中用于预测变量 X hat f val loss tf n
  • 使用指针传递引用和值[重复]

    这个问题在这里已经有答案了 我不明白为什么将指针传递给函数不会更改传入的数据 如果函数原型如下所示 void func int p 并且 func 为 p 分配了内存 为什么不能在函数外部使用它 我以为指针就是地址 虽然这样的事情符合你的期
  • 我如何使用肘节检查连接性?

    我需要使用连接库检查应用程序内每个页面的连接性 所以我将在提供者内部使用一肘 问题是何时关闭流以便在用户关闭应用程序时可以处理它 像这样 import package connectivity connectivity dart overr