Uncaught Error: Can't resolve all parameters for StorageService

Uncaught Error: Can't resolve all parameters for StorageService

我正在尝试在 ionic cordova 应用程序中实现 sql 存储。我按照这里的教程进行操作:https://ionicacademy.com/ionic-storage-crud-operations/ 和这里的离子页面:https://ionicframework.com/docs/building/storage

我收到未捕获的错误:

Can't resolve all parameters for StorageService: (?).
    at syntaxError (vendor.js:84831)
    at CompileMetadataResolver._getDependenciesMetadata (vendor.js:100051)
    at CompileMetadataResolver._getTypeMetadata (vendor.js:99886)
    at CompileMetadataResolver._getInjectableMetadata (vendor.js:99866)
    at CompileMetadataResolver.getProviderMetadata (vendor.js:100226)
    at vendor.js:100137
    at Array.forEach (<anonymous>)
    at CompileMetadataResolver._getProvidersMetadata (vendor.js:100097)
    at CompileMetadataResolver.getNgModuleMetadata (vendor.js:99665)
    at JitCompiler._loadModules (vendor.js:118758)

我的app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { MyApp } from './app.component';

//**************** Added Modules
import { HttpModule } from '@angular/http';
import { HttpClientModule } from '@angular/common/http';
import { IonicStorageModule } from '@ionic/storage/';
import { InAppBrowser } from '@ionic-native/in-app-browser';
import { EmailComposer } from '@ionic-native/email-composer';

//**************** Created Pages
import { HomePage } from '../pages/home/home';
import { DemographicsPage } from '../pages/demographics/demographics';
import { AuthPage } from '../pages/auth/auth';
import { WeightPage } from '../pages/weight/weight';

//**************** Created Service
import { AuthService } from '../services/auth.service';
import { RefreshTokenService } from '../services/refreshToken.service';
import { FormEncoderService } from '../services/formEncoder.service';
import { DecodeLoinc } from '../services/decodeLoinc.service';
import { AddWeightPage } from '../pages/add-weight/add-weight';
import { StorageService } from '../services/storage.service';

@NgModule({
  declarations: [
    MyApp,
    HomePage,
    DemographicsPage,
    AuthPage,
    WeightPage,
    AddWeightPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpModule,
    HttpClientModule,
    IonicStorageModule.forRoot({})
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage,
    DemographicsPage,
    AuthPage,
    WeightPage,
    AddWeightPage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    AuthService,
    RefreshTokenService,
    FormEncoderService,
    StorageService,
    DecodeLoinc,
    InAppBrowser,
    EmailComposer,
    { provide: ErrorHandler, useClass: IonicErrorHandler }
  ]
})
export class AppModule {}

和我的storage.service.ts

import { Storage } from '@ionic/storage';

export interface Item {
  id: number;
  weight: number;
}

const WEIGHTS_KEY = 'my-weights';

export class StorageService {
  constructor(private storage: Storage) {}

  //create
  addItem(item: Item): Promise<any> {
    return this.storage.get(WEIGHTS_KEY).then((items: Item[]) => {
      if (items) {
        items.push(item);
        return this.storage.set(WEIGHTS_KEY, items);
      } else {
        return this.storage.set(WEIGHTS_KEY, [item]);
      }
    });
  }

  //read
  getItems(): Promise<Item[]> {
    return this.storage.get(WEIGHTS_KEY);
  }
}

服务在这里实现:

import { Component } from '@angular/core';
import { ViewController, NavController } from 'ionic-angular';
import { NgForm } from '@angular/forms';
import { EmailComposer } from '@ionic-native/email-composer';
import { WeightPage } from '../weight/weight';
import { StorageService, Item } from '../../services/storage.service';

@Component({
  selector: 'page-add-weight',
  templateUrl: 'add-weight.html'
})
export class AddWeightPage {
  private enteredWt: number;
  private subject = 'New Patient Weight';
  private body = '';
  private to = 'mfhamid@cmh.edu';
  emailed: boolean = false;
  items: Item[] = [];
  newItem: Item = <Item>{};

  constructor(
    private viewCrtl: ViewController,
    private emailComposer: EmailComposer,
    private navCtrl: NavController,
    private storageService: StorageService
  ) {}

  onAddWeight(form: NgForm) {
    ..........
  }

  saveWeight() {
    this.newItem.id = new Date().getTime();
    this.newItem.weight = this.enteredWt;
    // var date = new Date().getTime().toString();

    this.storageService.addItem(this.newItem).then(item => {
      this.newItem = <Item>{};
    });
  }

  EmailWeight() {
    ........
  }

  onClose() {
    .........
  }
}

我也试过按照离子页面配置数据库,但没有成功:

imports: [
    IonicStorageModule.forRoot({
      name: '__mydb',
driverOrder: ['indexeddb', 'sqlite', 'websql']
    })
  ],

配置文件:

<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>weaigheasy</name>
    <description>An awesome Ionic/Cordova app.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
    <content src="index.html" />
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-intent href="http://localhost/*" />
    <preference name="ScrollEnabled" value="false" />
    <preference name="android-minSdkVersion" value="19" />
    <preference name="BackupWebStorage" value="none" />
    <preference name="SplashMaintainAspectRatio" value="true" />
    <preference name="FadeSplashScreenDuration" value="300" />
    <preference name="SplashShowOnlyFirstTime" value="false" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="3000" />
    <platform name="android">
        <allow-intent href="market:*" />
        <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
        <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
        <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
        <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
        <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
        <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
        <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
        <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
        <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
        <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
        <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
        <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
        <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
        <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
        <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
        <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
        <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
        <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
        <icon height="57" src="resources/ios/icon/icon.png" width="57" />
        <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
        <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
        <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
        <icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
        <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
        <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
        <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
        <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
        <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
        <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
        <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
        <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
        <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
        <icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
        <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
        <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
        <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
        <icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
        <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
        <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
        <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
        <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
        <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
        <splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
        <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
        <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
        <splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
        <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
        <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
        <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
        <splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
    </platform>
    <plugin name="cordova-plugin-whitelist" spec="1.3.3" />
    <plugin name="cordova-plugin-statusbar" spec="2.4.2" />
    <plugin name="cordova-plugin-device" spec="2.0.2" />
    <plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
    <plugin name="cordova-plugin-ionic-keyboard" spec="^2.0.5" />
    <plugin name="cordova-plugin-ionic-webview" spec="^4.0.0" />
    <plugin name="cordova-plugin-inappbrowser" spec="3.0.0" />
    <plugin name="cordova-plugin-email-composer" spec="0.9.2">
        <variable name="ANDROID_SUPPORT_V4_VERSION" value="27.+" />
    </plugin>
    <plugin name="cordova-sqlite-storage" spec="3.2.0" />
    <engine name="android" spec="7.1.4" />
</widget>

知道如何解决这个问题吗?

据我了解,对于存储,您无法将其注入另一个 service/provider。你应该能够做这样的事情而不是注入它:

export class StorageService {
  private storage: Storage;
  constructor() {
    this.storage = new Storage(null); // or some StorageConfig instead of null
  }
}

这是一个working stackblitz