需要 Ionic platform.ready() 方法



我有一个关于platform.ready().then(() => {})方法的基本问题。当我们使用原生插件时,我们是否需要每次都使用此方法?喜欢Status barLocalStorage等?

如果我们仅在app.component.ts文件中使用上述方法,因此它是根组件,这还不够吗?在此根组件之后,希望platform为所有其他后续组件做好准备,不是吗?那么为什么我们也需要ready子组件使用该方法呢?因为我看过很多文章和视频,如果有任何本机插件,它就会使用。希望这不需要不是吗?

在这个官方文档中,您可以看到它在子组件内部使用不是吗?你的想法?platform.ready((.then((( => {}(

platform.ready()是一个承诺,一旦您的设备/本机插件准备就绪,它就会解决。

让我们看一下ionic sidemenu starter模板 https://github.com/ionic-team/ionic2-starter-sidemenu/blob/master/src/app/app.component.ts。

正如您在第 15 行的app.component.ts中看到的那样,rootPage 已设置并会尽快加载。在构造函数中this.initializeApp();调用

this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
});

与javascript中的每个承诺一样,你无法知道它何时解决。正如您在代码中看到的,ionic 应用程序不会"等待"平台准备就绪。只有statusBar.styleDefault()splashScreen.hide()电话等待这个承诺。

假设解决承诺需要很长时间,例如 5 秒。

如果您的HomePage中有任何离子原生代码,您在app.component.ts或任何其他页面中使用的任何提供程序(因为用户在此期间已经可以在应用程序中导航(,离子原生调用将失败,因为平台尚未准备就绪。

举个例子:

constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen, private: qrScanner: QrScanner) {
this.initializeApp();
this.qrScanner.scan(); // Let's assume this is a provider we made to start a QR scanner. It will try to load the scanner immediately, regardless of the state of the platform.ready() promise. So if the platform is not ready, it will crash.
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: HomePage },
{ title: 'List', component: ListPage }
];
}

这意味着从理论上讲,在使用本机插件时,您应该始终使用this.platform.ready()以确保平台可用。在实践中,这实际上取决于具体情况,因为通常平台准备得非常快,如果不使用它,您不会注意到任何差异。但如果你想确定,你应该在任何地方使用它。

相关内容

  • 没有找到相关文章

最新更新