Есть ли способ, которым мы можем внедрить зависимость провайдера в нормальный класс в трепетании? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть один нормальный класс дартс, в котором я хочу обеспечить две зависимости поставщика.

Так что я могу получить доступ к этому классу из своего приложения. Я могу передать эту зависимость из метода сборки виджета, а затем я могу использовать этот класс, но я не хочу этого делать, как 100 раз, когда я должен передать эту зависимость, если я использовал этот класс 100 раз.

Я также хочу использовать этот класс из каждого жизненного цикла флаттера, поскольку он генерирует различные типы событий для приложения.

Я также хочу инициализировать метод genrateUserProerties () только один раз, когда зависимость готов, и когда пользователь открывает приложение.

Это инициализируется перед инициализацией любого провайдера, и это не всегда используется в методе, где у нас есть контекст.

Мне нужен способ обеспечить это зависимость таким образом, что мы можем инициализировать genrateUserProerties () только один раз.

Пользователь _user; и BrandCofiguration _activeBrand; Мне нужно, чтобы эти два были переданы здесь, когда он будет готов.

Пользователь _user; и BrandCofiguration _activeBrand; оба получены от двух разных провайдеров, когда я получил действительный ответ от сервера.

class FireBaseAnalyticsBase {
  static FirebaseAnalytics _analytics;
  static FirebaseAnalyticsObserver _observer;
  **User _user;**
  BuildContext _context;
  **BrandCofiguration _activeBrand;**
  int _seconds;
  Stopwatch _stopwatch;
  String _eventName;
  Map<String, dynamic> _userProperties = {};
  bool _isTimeTrackEvent;


  FireBaseAnalyticsBase(BuildContext context, UserProvider userProvider,
      BrandSelectionProvider brandSelectionProvider) { 
    this._context = context;
    _analytics = FirebaseAnalytics();
    _observer = FirebaseAnalyticsObserver(analytics: _analytics);
    _activeBrand = brandSelectionProvider.activeBrand;
    _user = userProvider.authenticatedUser;
    if (_user != null) {
      genrateUserProerties();
    }
  }

  void startFirebaseEventWithoutTime(String eventName) {
    this._eventName = eventName;
    _isTimeTrackEvent = false;
    logFirebaseEvent();
  }

  void startFireBaseEventWithTime(String eventName) {
    _stopwatch = Stopwatch();
    _stopwatch.start();
    _isTimeTrackEvent = true;
    _eventName = eventName;
  }

  void stopFireBaseTimeEvent() {
    _stopwatch.stop();
    _seconds = (_stopwatch.elapsedMilliseconds / 1000) as int;
    _stopwatch.reset();
    logFirebaseEvent();
  }

  Future<void> logFirebaseEvent() async {
    if (_isTimeTrackEvent) {
      _userProperties
          .addAll({FirebaseAnalyticsEnum.time_spent.value: _seconds});
    }
    print("firebase test");
    await _analytics.logEvent(
      name: _eventName,
      parameters: _userProperties,
    );
  }

  Future<void> genrateUserProerties() async {
    print("firebase properties initilize");
    var _packageInfo = await PackageInfo.fromPlatform();
    _userProperties = {
      FirebaseAnalyticsEnum.user_id.value: _user.id.toString(),
      FirebaseAnalyticsEnum.platform.value: Platform.operatingSystem,
      FirebaseAnalyticsEnum.device_language.value:
          Localizations.localeOf(_context).languageCode,
      FirebaseAnalyticsEnum.application.value: _packageInfo.appName,
      FirebaseAnalyticsEnum.current_api.value: Config.CURRENT_API,
      FirebaseAnalyticsEnum.device_type.value: _user.id.toString(),
      FirebaseAnalyticsEnum.app_version.value: Config.CURRENT_VERSION,
      FirebaseAnalyticsEnum.is_admin.value: _user.isAdmin,
      FirebaseAnalyticsEnum.is_educator.value: _user.educator,
      FirebaseAnalyticsEnum.is_brand_ambassador.value: _user.brandAmbassador,
      FirebaseAnalyticsEnum.salon_role.value: _user.salongroup,
      FirebaseAnalyticsEnum.brand.value: _activeBrand.brandName,
      FirebaseAnalyticsEnum.school_role.value: _user.schoolgroup,
    };
  }
}

1 Ответ

0 голосов
/ 27 апреля 2020

Я думаю, вы должны использовать шаблон Singleton для этих классов, потребляющих много ресурсов. Пример:

static FireBaseAnalyticsBase _instance;

static FireBaseAnalyticsBase getInstance(BuildContext context, UserProvider userProvider,
      BrandSelectionProvider brandSelectionProvider){
    if(_instance == null){
        _instance = FireBaseAnalyticsBase(context,userProvider,brandSelectionProvider);
    }
    return _instance;
}

Или, если вы передаете BuildContext, вы можете получить Provider Provider.of<>(context) в конструкторе FireBaseAnalyticsBase

...