diff --git a/README.md b/README.md index 84d5ea6..6b8dd22 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ dependencies: #### Note for AndroidX Apps -Make sure to point to `0.2.4+1` +Make sure to point to `0.2.4+2` ### ⚡️ Import @@ -35,6 +35,8 @@ class DemoPage extends StatelessWidget { title: new Text("Offline Demo"), ), body: OfflineBuilder( + checkHost : true, // check if internet is avaiable by a DNS request , the default value is false + // hostToCheck : "my.domaine.name", // the default value is google.com connectivityBuilder: ( BuildContext context, ConnectivityResult connectivity, diff --git a/lib/src/main.dart b/lib/src/main.dart index 438a8c1..8868e3e 100644 --- a/lib/src/main.dart +++ b/lib/src/main.dart @@ -5,6 +5,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_offline/src/utils.dart'; const kOfflineDebounceDuration = const Duration(seconds: 3); +const kHostToCheck = 'google.com'; typedef Widget ConnectivityBuilder( BuildContext context, ConnectivityResult connectivity, Widget child); @@ -14,6 +15,8 @@ class OfflineBuilder extends StatefulWidget { Key key, @required ConnectivityBuilder connectivityBuilder, Duration debounceDuration = kOfflineDebounceDuration, + String hostToCheck = kHostToCheck, + bool checkHost = false, WidgetBuilder builder, Widget child, WidgetBuilder errorBuilder, @@ -23,6 +26,8 @@ class OfflineBuilder extends StatefulWidget { connectivityBuilder: connectivityBuilder, connectivityService: Connectivity(), debounceDuration: debounceDuration, + hostToCheck : hostToCheck, + checkHost : checkHost, builder: builder, child: child, errorBuilder: errorBuilder, @@ -35,12 +40,16 @@ class OfflineBuilder extends StatefulWidget { @required this.connectivityBuilder, @required this.connectivityService, this.debounceDuration = kOfflineDebounceDuration, + this.hostToCheck = kHostToCheck, + this.checkHost = false, this.builder, this.child, this.errorBuilder, }) : assert( connectivityBuilder != null, 'connectivityBuilder cannot be null'), assert(debounceDuration != null, 'debounceDuration cannot be null'), + assert(hostToCheck != null, 'hostToCheck cannot be null'), + assert(checkHost != null, 'checkHost cannot be true or false'), assert( connectivityService != null, 'connectivityService cannot be null'), assert( @@ -55,6 +64,12 @@ class OfflineBuilder extends StatefulWidget { /// Debounce duration from epileptic network situations final Duration debounceDuration; + /// Hostname to test internet connection + final String hostToCheck; + + /// hostToCheck to test internet connection + final bool checkHost; + /// Used for building the Offline and/or Online UI final ConnectivityBuilder connectivityBuilder; @@ -86,7 +101,11 @@ class OfflineBuilderState extends State { startsWith(data), ); }, - ).transform( + ); + _connectivityStream = widget.checkHost ? _connectivityStream.transform( + checkIfHostIsAvailble(widget.hostToCheck), + ) : _connectivityStream; + _connectivityStream = _connectivityStream.transform( debounce(widget.debounceDuration), ); } diff --git a/lib/src/utils.dart b/lib/src/utils.dart index c752ddc..c3ec48f 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:connectivity/connectivity.dart'; @@ -56,3 +57,37 @@ StreamTransformer startsWith( }, ); } + +StreamTransformer checkIfHostIsAvailble( + String host, +) { + bool _seenFirstData = false; + Timer _timer; + + return StreamTransformer.fromHandlers( + handleData: (ConnectivityResult data, EventSink sink) { + if (_seenFirstData) { + _timer?.cancel(); + _timer = Timer(Duration.zero, ()async { + try { + final result = await InternetAddress.lookup(host); + if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) { + sink.add(data); + }else{ + sink.add(ConnectivityResult.none); + } + } on SocketException catch (_) { + sink.add(ConnectivityResult.none); + } + }); + } else { + sink.add(data); + _seenFirstData = true; + } + }, + handleDone: (EventSink sink) { + _timer?.cancel(); + sink.close(); + }, + ); +} diff --git a/pubspec.yaml b/pubspec.yaml index 0c69483..6374c13 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_offline description: A tidy utility to handle offline/online connectivity like a Boss. -version: 0.2.4+1 +version: 0.2.4+2 author: Jeremiah Ogbomo homepage: https://github.com/jogboms/flutter_offline