Hi i am trying to determine if my device is connected to the internet or not. But when i run the app 'ionic serve' im getting this error in the console:
NullInjectorError: StaticInjectorError(AppModule)[AppComponent -> NetworkProvider]: StaticInjectorError(Platform: core)[AppComponent -> NetworkProvider]: NullInjectorError: No provider for NetworkProvider!
I founf this question Missing provider for Ionic's Network native plugin but it doesnt solve my issue can anybody help me?
network-provider.ts
import { AlertController, Events } from '@ionic/angular';
import { Network } from '@ionic-native/network/ngx';
export enum ConnectionStatusEnum {
Online,
Offline
}
@Injectable()
export class NetworkProvider {
previousStatus;
constructor(public alertCtrl: AlertController,
public network: Network,
public eventCtrl: Events) {
console.log('Hello NetworkProvider Provider');
this.previousStatus = ConnectionStatusEnum.Online;
}
public initializeNetworkEvents(): void {
this.network.onDisconnect().subscribe(() => {
if (this.previousStatus === ConnectionStatusEnum.Online) {
this.eventCtrl.publish('network:offline');
}
this.previousStatus = ConnectionStatusEnum.Offline;
});
this.network.onConnect().subscribe(() => {
if (this.previousStatus === ConnectionStatusEnum.Offline) {
this.eventCtrl.publish('network:online');
}
this.previousStatus = ConnectionStatusEnum.Online;
});
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { Network } from '@ionic-native/network/ngx';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
providers: [
Network,
StatusBar,
SplashScreen,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
app.components.ts
import { Component } from '@angular/core';
import { Platform, Events } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { Network } from '@ionic-native/network/ngx';
import { NetworkProvider } from '../app/network-provider';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss']
})
export class AppComponent {
constructor(
public platform: Platform,
public events: Events,
public network: Network,
public networkProvider: NetworkProvider,
private splashScreen: SplashScreen,
private statusBar: StatusBar
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this.networkProvider.initializeNetworkEvents();
// Offline event
this.events.subscribe('network:offline', () => {
alert('network:offline ==> '+this.network.type);
});
// Online event
this.events.subscribe('network:online', () => {
alert('network:online ==> '+this.network.type);
});
});
}
}
You're trying to inject NetworkProvider
when it is not yet declared to be provided in the service itself or the app module. It needs to be declared as a provider just like Network, Statusbar and Splashscreen. Add NetworkProvider
to the provider array or Change @Injectable()
to @Injectable({providedIn: 'root',})
in network-provider.ts
to solve this.