Get access to the context of InheritedWidget

五迷三道 提交于 2019-11-30 21:38:35

问题


I am having the following setup:

MaterialApp(home:SplashScreen)


SplashScreen(
///do some auth checks then
Navigator.of(context).push( MaterialPageRoute(
                builder: (_) =>  StateInheritedWidget(
                  user: userData,
                  child:  HomePage(),

                )))
)

Then in my HomePage I have a FAB that pushes a new route. This new route has no access to the context of my inherited widget.

Is it impossible to get the context of an InheritedWidget in new routes, or is there a way to solve this issue ?


Update

This is my MaterialApp's builder property

    builder: (context,child){
///Doing some auth stuff here
        return new StateInheritedWidget(
          user: userData,
                      child: userData==null?const SplashScreen(child: const LoginPage(),): 
                      const SplashScreen(child: const HomePage(),),

        );
      },

My SplashScreen build method:

return !_load? new Scaffold(
      body: new Center(
        child: new Text('Splash'),
      ),
    ):this.widget.child;

These are the error I get.

The first one seems to be related to the Drawer in my HomePage:

I/flutter (12688): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (12688): The following assertion was thrown building Tooltip("Open navigation menu", vertical offset: 24.0,
I/flutter (12688): position: below, dirty, state: _TooltipState#44ae9(ticker inactive)):
I/flutter (12688): No Overlay widget found.
I/flutter (12688): Tooltip widgets require an Overlay widget ancestor for correct operation.
I/flutter (12688): The most common way to add an Overlay to an application is to include a MaterialApp or Navigator
I/flutter (12688): widget in the runApp() call.
I/flutter (12688): The specific widget that failed to find an overlay was:
I/flutter (12688):   Tooltip("Open navigation menu", vertical offset: 24.0, position: below)
I/flutter (12688):

The second exception appears when I click on FAB (Navigator.push)

I/flutter (12688): Another exception was thrown: Navigator operation requested with a context that does not include a Navigator.

回答1:


No. That's not possible (or at least not recommended).

The problem lies in the fact that your inheritedWidget shouldn't be inside the route but instead above the route. Usually above MaterialApp

But I want my Authentification to be able to push a login screen, I can't put it above MaterialApp !

Which is why I said usually. :D

Authentification is one of these exceptions. You may want your authent layer to access the Navigator. But still want to share that authent layer with all routes.

This is where an useful property of MaterialApp is used : builder

Builder, when passed, will be used to insert any kind of widget right above your routes. But still be after Navigator so that you can still push new routes when needed.

In the end, you'd have

new MaterialApp(
  builder: (context, child) {
    return new MyAuthent(child: child);
  },
  ...
  // home: SplashSceen ?
);

This will most likely requires a refactor on your end. But that's the proper way to achieve this.



来源:https://stackoverflow.com/questions/49328362/get-access-to-the-context-of-inheritedwidget

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!