-1

I am trying to have stream provider for checking network connection, however it always return the same error.

"couldn't find the correct provider above your child widget.

I tried different structures but none work.

Edit: Stream provider and widget codes are added

This is my Main Page:

  class MyApp extends StatelessWidget {
 const MyApp({Key? key}) : super(key: key);

 @override
 Widget build(BuildContext context) {
 SystemChrome.setPreferredOrientations([
  DeviceOrientation.portraitUp,
  DeviceOrientation.portraitDown,
 ]);
 return ScreenUtilInit(
    designSize: Size(411.429, 866.2857),
    minTextAdapt: true,
    splitScreenMode: true,
    builder: (_) {
      return MaterialApp(
          useInheritedMediaQuery: true,
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
              textTheme: GoogleFonts.josefinSansTextTheme(
                  Theme.of(context).textTheme),
              primarySwatch: Colors.blue,
              visualDensity: VisualDensity.adaptivePlatformDensity),
          home: MultiProvider(
              providers: [
                StreamProvider<NetworkStatus?>(
                  initialData: null,
                  create: (context) =>
                      NetworkStatusService().networkStatusController.stream,
                )
              ],
              child: NetworkAwareWidget(
                onlineChild: Container(
                  child: Text("A"),
                ),
                offlineChild: Container(
                  child: Text("A"),
                ),
              )
              ));
    });
   }
   }

The provider Code:

     enum NetworkStatus { Online, Offline }

     class NetworkStatusService {
     StreamController<NetworkStatus> networkStatusController =
     StreamController<NetworkStatus>();

     NetworkStatusService() {
     Connectivity().onConnectivityChanged.listen((status) {
     networkStatusController.add(_getNetworkStatus(status));
     });
     }

     NetworkStatus _getNetworkStatus(ConnectivityResult status) {
     return status == ConnectivityResult.mobile ||
        status == ConnectivityResult.wifi
    ? NetworkStatus.Online
    : NetworkStatus.Offline;
  }
 }

The Widget Code:

  `lass NetworkAwareWidget extends StatelessWidget {
   final Widget onlineChild;
   final Widget offlineChild;

     const NetworkAwareWidget(
  {Key? key, required this.onlineChild, required 
 this.offlineChild})
  : super(key: key);

@override
Widget build(BuildContext context) {
NetworkStatus networkStatus = Provider.of<NetworkStatus> 
(context);
if (networkStatus == NetworkStatus.Online) {
  print("Online");
  return onlineChild;
 } else {
  print("Offline");
  return offlineChild;
 }
}
}
Mark Nugromentry
  • 195
  • 2
  • 10

1 Answers1

0

Provider type is NetworkStatus?, but the attempt is made on NetworkStatus.

StreamProvider<NetworkStatus?>(
  initialData: null,
  create: (context) => NetworkStatusService().networkStatusController.stream,
)

...

NetworkStatus? networkStatus = Provider.of<NetworkStatus?>(context);
user18309290
  • 5,777
  • 2
  • 4
  • 22