今日的程序码 => 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。
flutter_bloc: ^7.2.0
data_connection_checker: ^0.3.4
cupertino_icons: ^1.0.3
abstract class NetworkEvent {}
class ListenConnection extends NetworkEvent {}
class ConnectionChanged extends NetworkEvent {
NetworkState connection;
ConnectionChanged(this.connection);
}
里面因为有用到 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();
}
}
@immutable
abstract class NetworkState {}
class ConnectionInitial extends NetworkState {}
class ConnectionSuccess extends NetworkState {}
class ConnectionFailure extends NetworkState {}
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();
},
),
);
}
}
>>: [Day 11] 从零开始的 DenseNet 生活
昨天安装完Realm之後,今天我们来实做一个简易的订单系统吧!透过TextField及Button新...
CSS 三角形作法 语法 HTML <div class="box">...
历经了 30 天,我们总算到了这里啦~ 是时候下台一鞠躬了~ 非常可惜的在第 29 天因为工作完全...
Halloween Kills线上看2021 《月光光心慌慌:杀戮》(英语:Halloween Ki...
但是老师教我用var宣告变数,但我也看到有同学用 let 与 const 宣告变数,这是怎麽一回事...