Search code examples
flutterdartflutter-dependenciesconnectivity

How to check internet connection globally and show no connection screen


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?


Solution

  • 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.