首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免将分析传递到窗口小部件树?

如何避免将分析传递到窗口小部件树?
EN

Stack Overflow用户
提问于 2019-11-05 01:32:47
回答 1查看 214关注 0票数 1

我想在颤动应用程序与firebase分析跟踪标签的变化。在示例应用程序中,它们只是向下传递FirebaseAnalyticsObserver:

代码语言:javascript
复制
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。所以也许我可以在一个服务中初始化,然后向下提供它?例如

代码语言:javascript
复制
class Analytic extends ChangeNotifier {

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

回答 1

Stack Overflow用户

发布于 2019-11-05 01:45:48

Flutter有InheritedWidget,一个可以做到这一点的小工具,它会一直向下传递数据,你可以检查official video showcase,或者一些articles

要使用它,您需要将您的小部件包装在inheritedwidget中

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58698447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档