How to check internet connection globally and show no connection screen

Viewed 3694

I use connectivity package in my project to check internet connection.

File main.dart code:

StreamProvider<ConnectivityResult>(
    create: (context) =>
        InternetConnectionService().connectionStatusController.stream,
    child: MaterialApp(
.....

And on each screen I check internet connection like this:

bool hasConnection;

void checkConnectivity(context) async {
  var connectivityResult = Provider.of<ConnectivityResult>(context);
  if (connectivityResult == ConnectivityResult.none ||
      connectivityResult == null) {
    setState(() {
      hasConnection = false;
    });
  } else {
    setState(() {
      hasConnection = true;
    });
  }
}

Widget build(BuildContext context) {
  checkConnectivity(context);
  return hasConnection == true 
    ? Scaffold() 
    : NoInternetScreen();
}

How I check connection globally instead on each screen from root or one widget and show no connection screen?

2 Answers

In your MaterialApp widget, there is a builder. You can wrap your paths in any widget using the builder. Try doing this:

MaterialApp(
    ...
    builder: (context, child) {
        return StreamBuilder<ConnectivityResult>(
            stream: InternetConnectionService().connectionStatusController.stream,
            builder: (context, snapshot) {
                final conenctivityResult = snapshot.data;
                if (connectivityResult == ConnectivityResult.none || connectivityResult == null) return NoInternetScreen();

                return child;
            }
        );
    }
);

Now you don't have to add any internet logic in other files. You can simply write your build methods excluding them.

       class ConnectivityUtils {
          static Future<bool> hasConnection() async {
            var connectivityResult = await (Connectivity().checkConnectivity());
            return connectivityResult == ConnectivityResult.mobile || connectivityResult == ConnectivityResult.wifi;
         } 
       }

You can use this class, and you can call hasConnection() before calling API If it is false, you can show the No Connection Screen

Related