Continuously check internet disconnection on Flutter app
You've already written the code to do what you want. You could easily wrap it in a page State
or an InheritedWidget
or some other managerial class.
final Connectivity _connectivity;
final StreamSubscription<ConnectivityResult> _subscription;
ConstructorForWhateverClassThisIs() {
_connectivity = new Connectivity();
_subscription = _connectivity.onConnectivityChanged.listen(onConnectivityChange);
}
void onConnectivityChange(ConnectivityResult result) {
// TODO: Show snackbar, etc if no connectivity
}
void dispose() {
// Always remember to cancel your subscriptions when you're done.
subscription.cancel();
}
According to the documentation, the onConnectivityChanged
will be updated with the new result whenever it changes, meaning you can just listen for changes without ever having to manually query it.
Documentation excerpt:
You can also listen for network state changes by subscribing to the stream exposed by connectivity plugin
I've just implement this packages https://pub.dartlang.org/packages/flutter_offline that deal with this issue really straightforward.
Firs tstep is import the package import 'package:flutter_offline/flutter_offline.dart';
that you included in you project and start using the library as the following example shows:
After that you include the OfflineBuilder on Widget build(BuildContext context) { and it will read all all stream changes from ConnectivityResult even if the user is not interacting with the app at all (or is only reading data) and connectivity status change.
@override
Widget build(BuildContext context) {
return OfflineBuilder(
debounceDuration: Duration.zero,
connectivityBuilder: (
BuildContext context,
ConnectivityResult connectivity,
Widget child,
) {
if (connectivity == ConnectivityResult.none) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Center(child: Text('Please check your internet connection!')),
);
}
return child;
},
child: Scaffold(
resizeToAvoidBottomPadding: false,
appBar: AppBar(
title: Text("Home")
),
body: new Column(
children: <Widget>[
new Container(
decoration: new BoxDecoration(color: Theme.of(context).cardColor),
child: _buildTxtSearchBox(),
),
new Divider(height: 10.0),
new FloatingActionButton.extended(
icon: Icon(Icons.camera_alt),
label: Text("Barcode"),
onPressed: _scanQR,
),
new Container(
// padding: EdgeInsets.only(left: 24.0, right: 24.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
Icon(Icons.hotel, color: Colors.blueGrey[600]),
],
),
Column(
children: [
Icon(Icons.hotel, color: Colors.blue[400]),
],
),
],
),
alignment: Alignment(0.0, 0.0),
),
],
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
drawer: MenuDrawer(),
)
);
}