Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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,
Expand Down
21 changes: 20 additions & 1 deletion lib/src/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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,
Expand All @@ -23,6 +26,8 @@ class OfflineBuilder extends StatefulWidget {
connectivityBuilder: connectivityBuilder,
connectivityService: Connectivity(),
debounceDuration: debounceDuration,
hostToCheck : hostToCheck,
checkHost : checkHost,
builder: builder,
child: child,
errorBuilder: errorBuilder,
Expand All @@ -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(
Expand All @@ -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;

Expand Down Expand Up @@ -86,7 +101,11 @@ class OfflineBuilderState extends State<OfflineBuilder> {
startsWith(data),
);
},
).transform(
);
_connectivityStream = widget.checkHost ? _connectivityStream.transform(
checkIfHostIsAvailble(widget.hostToCheck),
) : _connectivityStream;
_connectivityStream = _connectivityStream.transform(
debounce(widget.debounceDuration),
);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about..

if (widget.checkHost) {
  _connectivityStream = _connectivityStream.transform(
     checkIfHostIsAvailble(widget.hostToCheck),
  );
}

_connectivityStream = _connectivityStream.transform(
  debounce(widget.debounceDuration),
);

}
Expand Down
35 changes: 35 additions & 0 deletions lib/src/utils.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';

import 'package:connectivity/connectivity.dart';

Expand Down Expand Up @@ -56,3 +57,37 @@ StreamTransformer<ConnectivityResult, ConnectivityResult> startsWith(
},
);
}

StreamTransformer<ConnectivityResult, ConnectivityResult> checkIfHostIsAvailble(
String host,
) {
bool _seenFirstData = false;
Timer _timer;

return StreamTransformer<ConnectivityResult, ConnectivityResult>.fromHandlers(
handleData: (ConnectivityResult data, EventSink<ConnectivityResult> 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<ConnectivityResult> sink) {
_timer?.cancel();
sink.close();
},
);
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
homepage: https://github.com/jogboms/flutter_offline

Expand Down