Как избежать передачи аналитики вниз по дереву виджетов? - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу отслеживать изменения вкладки в приложении Flutter с помощью Firebase Analytics. В примере приложения они просто передают FirebaseAnalyticsObserver вниз по дереву виджетов:

class MyApp extends StatelessWidget {
  static FirebaseAnalytics analytics = FirebaseAnalytics();
  static FirebaseAnalyticsObserver observer =
      FirebaseAnalyticsObserver(analytics: analytics);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Analytics Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[observer],
      home: MyHomePage(
        title: 'Firebase Analytics Demo',
        analytics: analytics,
        observer: observer,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title, this.analytics, this.observer})
      : super(key: key);

  final String title;
  final FirebaseAnalytics analytics;
  final FirebaseAnalyticsObserver observer;

  @override
  _MyHomePageState createState() => _MyHomePageState(analytics, observer);
}

class _MyHomePageState extends State<MyHomePage> {
  _MyHomePageState(this.analytics, this.observer);

  final FirebaseAnalyticsObserver observer;
  final FirebaseAnalytics analytics;

Но проблема в том, что моя вкладка находится далеко вниз по дереву виджетов. Поэтому трудно пройти весь путь вниз.

Как я могу инициализировать обозреватель FirebaseAnalytics для отслеживания обычного экранного маршрута, а также предоставить его на вкладку?

Я использую Provider и ChangeNotifier. Так что, может быть, я могу просто инициализировать в службе, а затем предоставить это вниз? Например

class Analytic extends ChangeNotifier {

static FirebaseAnalyticsObserver observer =
FirebaseAnalyticsObserver(analytics: analytics);
}

1 Ответ

0 голосов
/ 04 ноября 2019

Flutter имеет InheritedWidget, виджет, который делает именно это, он передает данные полностью вниз, вы можете проверить официальную видео-витрину или некоторые статьи .

Чтобы использовать его, вы оборачиваете свой виджет унаследованным виджетом

class MyApp extends StatelessWidget {
  final FirebaseAnalytics analytics = FirebaseAnalytics();//don't make this static please
  final FirebaseAnalyticsObserver observer =
      FirebaseAnalyticsObserver(analytics: analytics); //don't make this static please

  @override
  Widget build(BuildContext context) {
    return ObserverProvider(
    child: MaterialApp(
      title: 'Firebase Analytics Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[observer],
      home: MyHomePage(
        title: 'Firebase Analytics Demo'
      ),
    ),
    observer:observer,
    analytics:analytics
    )
    ;
  }
}


class ObserverProvider extends InheritedWidget {
  const ObserverProvider(
      {Widget child,
      Key key,
      this.observer,
      this.analytics})
      : super(key: key, child: child);
  final FirebaseAnalytics analytics;
  final FirebaseAnalyticsObserver observer;

  static ObserverProvider of(BuildContext context) {
    return (context.inheritFromWidgetOfExactType(ObserverProvider));
  }

  @override
  bool updateShouldNotify(ObserverProvider e) => false;
}

, и если вы хотите получить доступ к данным, вы вызываете ObserverProvider.of(context).observer для наблюдателя и ObserverProvider.of(context).analytics для аналитики

...