Skip to content

Commit

Permalink
Implement connectivity stream
Browse files Browse the repository at this point in the history
  • Loading branch information
Thesmader committed Apr 28, 2020
1 parent 0d9cd6d commit f3c74f2
Show file tree
Hide file tree
Showing 10 changed files with 267 additions and 120 deletions.
1 change: 1 addition & 0 deletions gogrocy/lib/core/enums/connectivity_status.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum ConnectivityStatus { WiFi, Cellular, Offline }
37 changes: 37 additions & 0 deletions gogrocy/lib/core/services/connectivity_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'dart:async';

import 'package:connectivity/connectivity.dart';
import 'package:gogrocy/core/enums/connectivity_status.dart';

class ConnectivityService {
StreamController<ConnectivityStatus> _connectionStatusController;

ConnectivityService() {
_connectionStatusController = StreamController<ConnectivityStatus>();
_initNetworkStatusListener();
}

StreamController<ConnectivityStatus> get connectionStatusController =>
_connectionStatusController;

void _initNetworkStatusListener() {
Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
_connectionStatusController.add(_getStatusFromResult(result));
});
}

ConnectivityStatus _getStatusFromResult(ConnectivityResult result) {
switch (result) {
case ConnectivityResult.wifi:
return ConnectivityStatus.WiFi;
case ConnectivityResult.mobile:
return ConnectivityStatus.Cellular;
case ConnectivityResult.none:
return ConnectivityStatus.Offline;
}
}

void disposeStream(){
_connectionStatusController.close();
}
}
47 changes: 34 additions & 13 deletions gogrocy/lib/core/viewModels/base_model.dart
Original file line number Diff line number Diff line change
@@ -1,29 +1,50 @@
import 'dart:io';
import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:gogrocy/core/enums/connectivity_status.dart';
import 'package:gogrocy/core/enums/viewstate.dart';
import 'package:gogrocy/core/services/connectivity_service.dart';

class BaseModel extends ChangeNotifier {
ViewState _state = ViewState.Idle;

ViewState get state => _state;

StreamController<ConnectivityStatus> _connectivityStatusController =
ConnectivityService().connectionStatusController;
Stream<ConnectivityStatus> connectivityStatus =
ConnectivityService().connectionStatusController.stream;
bool hasConnection = true;

BaseModel() {
connectivityStatus.listen((ConnectivityStatus status) {
switch (status) {
case ConnectivityStatus.WiFi:
this.hasConnection = true;
print(hasConnection);
notifyListeners();
break;
case ConnectivityStatus.Cellular:
this.hasConnection = true;
notifyListeners();
break;
case ConnectivityStatus.Offline:
this.hasConnection = false;
notifyListeners();
break;
}
});
}

void setState(ViewState viewState) {
_state = viewState;
notifyListeners();
}

Future<bool> checkInternetStatus() async {
try {
final result = await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
print('connected');
return true;
}
} on SocketException catch (_) {
print('not connected');
return false;
}
return false;
@override
void dispose() {
// TODO: implement dispose
_connectivityStatusController.close();
super.dispose();
}
}
4 changes: 4 additions & 0 deletions gogrocy/lib/core/viewModels/login_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,8 @@ class LoginModel extends BaseModel {
}
return user;
}

checkInternetStatus() {
return true;
}
}
2 changes: 2 additions & 0 deletions gogrocy/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gogrocy/core/services/connectivity_service.dart';
import 'package:gogrocy/core/services/navigation_service.dart';
import 'package:gogrocy/core/services/shared_prefs.dart';
import 'package:gogrocy/service_locator.dart';
import 'package:gogrocy/ui/router.dart';
import 'package:gogrocy/ui/views/startup_view.dart';
import 'package:gogrocy/ui/widgets/navbar/bottom_navbar.dart';
import 'package:provider/provider.dart';

void main() {
setupLocator();
Expand Down
45 changes: 39 additions & 6 deletions gogrocy/lib/ui/views/base_view.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import 'dart:async';

import 'package:flushbar/flushbar.dart';
import 'package:flutter/material.dart';
import 'package:gogrocy/core/enums/connectivity_status.dart';
import 'package:gogrocy/core/services/connectivity_service.dart';
import 'package:gogrocy/core/viewModels/base_model.dart';
import 'package:gogrocy/ui/widgets/snackbars/no_internet_snackbar.dart';
import 'package:provider/provider.dart';

import '../../service_locator.dart';
import 'package:gogrocy/service_locator.dart';

class BaseView<T extends BaseModel> extends StatefulWidget {
final Widget Function(BuildContext context, T model, Widget child) builder;
Expand All @@ -19,18 +25,42 @@ class _BaseViewState<T extends BaseModel> extends State<BaseView<T>> {

bool isDisposed = false;

StreamController<ConnectivityStatus> _connectivityStatusController =
ConnectivityService().connectionStatusController;

Flushbar _onlineFlush = onlineSnackBar();
Flushbar _offlineFlush = offlineSnackBar();

@override
void initState() {
super.initState();
if(!isDisposed)
if (widget.onModelReady != null) {
_connectivityStatusController.stream.listen((ConnectivityStatus status) {
switch (status) {
case ConnectivityStatus.WiFi:
if (_offlineFlush.isShowing()) {
_offlineFlush.dismiss();
_onlineFlush.show(context);
}
break;
case ConnectivityStatus.Cellular:
if (_offlineFlush.isShowing()) {
_offlineFlush.dismiss();
_onlineFlush.show(context);
}
break;
case ConnectivityStatus.Offline:
_offlineFlush.show(context);
break;
}
});
if (!isDisposed) if (widget.onModelReady != null) {
widget.onModelReady(model);
}
}


@override
void dispose() {
_connectivityStatusController.close();
model.dispose();
isDisposed = true;
super.dispose();
Expand All @@ -39,7 +69,10 @@ class _BaseViewState<T extends BaseModel> extends State<BaseView<T>> {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<T>(
create: (context) => model,
child: Consumer<T>(builder: widget.builder));
create: (context) => model,
child: Consumer<T>(
builder: widget.builder,
),
);
}
}
Loading

0 comments on commit f3c74f2

Please sign in to comment.