Невозможно импортировать Amplitude SDK в приложение Ionic 3 - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь использовать Amplitude SDK для получения статистики из моего приложения Ionic 3.Однако, поскольку приложение написано на TypeScript с определенной файловой архитектурой, оно не так просто, как в официальной документации .

Однако я обнаружил @ types / амплитуду-js пакет и я подумал, что это решит все мои проблемы.Но, к сожалению, когда я компилирую свое приложение на своем устройстве, используя ionic cordova run android --device, приложение не загружается, и я получаю следующее сообщение об ошибке:

Uncaught Error: Encountered undefined provider! 
Usually this means you have a circular dependencies (might be caused by using 'barrel' index.ts files.

*sigh*

Примечание: эта ошибка также появляется, когда я запускаю ionic serve.

Вот что я сделал, шаг за шагом:

  • Я установил @ types / амплитуду-js, запустив npm install --save @types/amplitude-js.
  • Я установил оригинальный Amplitude SDK, запустив npm install amplitude-js.Я заметил, что это необходимо сделать, иначе мое приложение не будет компилироваться только с пакетом @type (что имеет смысл).
  • Я добавил следующие строки в свой app.module.ts

import { AmplitudeClient } from 'amplitude-js';

[...]
@NgModule({
    [...]
    providers: [
        AmplitudeClient,
        [...]
    ]
});
  • Я также создал AmplitudeProvider, который будет управлять всеми событиями Amplitude в моем приложении:

import { Injectable } from '@angular/core';
import { HttpServiceProvider } from "../http-service/http-service";
import { AmplitudeClient } from 'amplitude-js';

/**
 * AmplitudeProvider
 * @description Handles Amplitude statistics
 */
@Injectable()
export class AmplitudeProvider {

  constructor(
    public http: HttpServiceProvider,
    public amplitude: AmplitudeClient
  ) {
    this.amplitude.init("MY_AMPLITUDE_KEY");
  }

  /**
   * logEvent
   * @description Logs an event in Amplitude
   * @param eventTitle Title of the event
   */
  public logEvent(title) {
      // Do things not relevant here
  }
  
}

Я уверен, что я делаю что-то не так с моей инъекцией зависимости и / или импортом, но я не понимаю что.И я не вижу никакой циклической зависимости, поскольку пакет amplitude-js не сделан мной и не импортирует ни одного из моих провайдеров.

Заранее спасибо всем, кто укажет мне правильное направление!

1 Ответ

2 голосов
/ 23 апреля 2019

AmplitudeClient не является Ионным провайдером, поэтому вы не можете импортировать его и вставить в конструктор класса.

Чтобы использовать амплитуду в своем провайдере, вы хотите импортировать амплитуду.Ваш код должен быть похож на это.

import amplitude, { AmplitudeClient } from 'amplitude-js';

@Injectable()
export class AmplitudeProvider {

  private client: AmplitudeClient;

  constructor(
    public http: HttpServiceProvider,
    public database: DatabaseProvider
  ) {
    this.client = amplitude.getInstance();
    this.client.init("MY_AMPLITUDE_KEY");
  }
}

...