【第十二天 - Flutter NetWork 网路判断】

前言

今日的程序码 => GIHUB

说明

这是一个网路判断的一个范例,将会使用 data_connection_checker 套件,注意, GITHUB 里面有一个档案叫做 data_connection_checker,他就是现在 plugin 里面的程序码,因为现在这个套件还没有支援Null-Safety,所以我是直接 clone 下来然後改程序码。

网路判断更多的人是使用
https://pub.dev/packages/connectivity
https://pub.dev/packages/connectivity_plus
这两个的 Readme.md 都有非常完整的解说。
和现在的这个 [data_connection_checker 套件(https://pub.dev/packages/data_connection_checker) 一样,都可以监听即时的网路,如果想要修改的话,可以直接在底下 _subscription 修改程序码。

注解:
这边我不示范 connectivity 的原因是因为我使用他会有 bug。

  1. 我的 pub-cache 怪怪的。应该说,我没有去更新 flutter 的版本,但我看 github,好像只有我会遇到这个 bug,应该是 flutter 没更新,或者是 pub-cache 怪怪的。(但是因为这个对我影响不是很大,所以我不急着更新)。
  2. 这个 connectivity 套件需要初始化。而现在的 data_connection_checker 不需要初始化,只是这个 data_connection_checker 套件的作者好像比较不常更新,不过没关系,我可以自己更新套件:)),反正很快 ? 。
  3. 不过使用 connectivity 可以增测到你连上的网路是 mobile 还是 wifi 的资讯,如果需要客制化,就必须使用这个套件。

设定 YAML 档案

  flutter_bloc: ^7.2.0
  data_connection_checker: ^0.3.4
  cupertino_icons: ^1.0.3

Bloc

Event

abstract class NetworkEvent {}

class ListenConnection extends NetworkEvent {}

class ConnectionChanged extends NetworkEvent {
  NetworkState connection;
  ConnectionChanged(this.connection);
}

Bloc

里面因为有用到 StreamSubscription,可以即时监听资料。因此,要记得 close 掉 StreamSubscription
这个 StreamSubscription 可以等於 data_connection_checker 里面提供的 DataConnectionChecker().onStatusChange 来监听网路的 status(状态) 是什麽。

class NetworkBloc extends Bloc<NetworkEvent, NetworkState> {
  NetworkBloc() : super(ConnectionInitial());

  late StreamSubscription _subscription;

  @override
  Stream<NetworkState> mapEventToState(NetworkEvent event) async* {
    if (event is ListenConnection) {
      _subscription = DataConnectionChecker().onStatusChange.listen((status) {
        add(ConnectionChanged(status == DataConnectionStatus.disconnected
            ? ConnectionFailure()
            : ConnectionSuccess()));
      });
    }
    if (event is ConnectionChanged) yield event.connection;
  }

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

State

@immutable
abstract class NetworkState {}

class ConnectionInitial extends NetworkState {}

class ConnectionSuccess extends NetworkState {}

class ConnectionFailure extends NetworkState {}

View(画面、UI)

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        backgroundColor: Colors.cyan[300],
        body: BlocProvider(
          create: (context) =>NetworkBloc()..add(ListenConnection()),
          child: HomeScreen(),
        ),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: BlocBuilder<NetworkBloc, NetworkState>(
        builder: (context, state) {
          if (state is ConnectionFailure) return Text("Failed to connect to Internet",);
          if (state is ConnectionSuccess)
            return Text(" Connected to Internet Successfully");
          else
            return SizedBox();
        },
      ),
    );
  }
}

<<:  介绍Vertex(1) | ML#Day18

>>:  [Day 11] 从零开始的 DenseNet 生活

【从零开始的Swift开发心路历程-Day17】简易订单系统Part1

昨天安装完Realm之後,今天我们来实做一个简易的订单系统吧!透过TextField及Button新...

Day-30 不完美收工

历经了 30 天,我们总算到了这里啦~ 是时候下台一鞠躬了~ 非常可惜的在第 29 天因为工作完全...

Halloween Kills线上看2021

Halloween Kills线上看2021 《月光光心慌慌:杀戮》(英语:Halloween Ki...

【Day2】变数宣告var、let、const的区别

但是老师教我用var宣告变数,但我也看到有同学用 let 与 const 宣告变数,这是怎麽一回事...