I got the following Ionic code fragment for displaying alarms / errors in an industrial App:
showError(message: string) {
let toast = this.toastController.create({
message: message,
position: 'top',
duration: 5000,
cssClass: 'danger',
showCloseButton: true
});
toast.present();
}
The App triggers the error message every time it detects a connection issues, which will be also roughly on a 5 second timer.
Multiple calls to this method will lead to 2 or more error messages shown on top of each other if the timing of this code is changed. Can I somehow detect that a toast is already being displayed? Also then, the 5000 msec timer would not be necessary and I can just remove the error message again when the connection is re-established.
Thanks and BR Florian
You could store your Toast object in a variable outside your function, and call the dismiss() method before showing the next toast :
import { ToastController, Toast } from 'ionic-angular';
toast: Toast;
showError(message: string) {
try {
this.toast.dismiss();
} catch(e) {}
this.toast = this.toastController.create({
message: message,
position: 'top',
duration: 5000,
cssClass: 'danger',
showCloseButton: true
});
toast.present();
}
Here my solution :-)
// ToastService.ts
import { Injectable } from '@angular/core';
import { ToastController, Toast } from 'ionic-angular';
@Injectable()
export class ToastService {
private toasts: Toast[] = [];
constructor(private toastCtrl: ToastController) {}
push(msg) {
let toast = this.toastCtrl.create({
message: msg,
duration: 1500,
position: 'bottom'
});
toast.onDidDismiss(() => {
this.toasts.shift()
if (this.toasts.length > 0) {
this.show()
}
})
this.toasts.push(toast)
if (this.toasts.length === 1) {
this.show()
}
}
show() {
this.toasts[0].present();
}
}
You can check if there is already a toast present or not and create new only if no toast present.
import { ToastController, Toast } from 'ionic-angular';
toast: Toast;
isToastPresent:boolean=false;
show(){
this.isToastPresent?'':this.showError('No network');
}
showError(message: string) {
this.toast = this.toastController.create({
message: message,
duration: 3000,
cssClass: 'danger',
showCloseButton: true
});
toast.present();
this.isToastPresent=true;
this.toast.onDidDismiss(() => {
this.isToastPresent=false;
console.log('Dismissed toast');
});
}
In Ionic 4 Toast UI Component
Show Ionic 4 Toast only once using below code
// Call this method
showOnceToast(){
this.toastController.dismiss().then((obj)=>{
}).catch(()=>{
}).finally(()=>{
this.manageToast();
});
}
manageToast() {
this.toastInstance = this.toastController.create({
message: 'Your settings have been saved.',
duration: 2000,
animated: true,
showCloseButton: true,
closeButtonText: "OK",
cssClass: "my-custom-class",
position: "middle"
}).then((obj) => {
obj.present();
});
}
Source Link : http://www.freakyjolly.com/ionic-4-adding-toasts-in-ionic-4-application-using-ui-components-with-plugins/