dart – InheritedWidget – 在navigator.push之后调用getter
发布时间:2020-12-14 14:50:19 所属栏目:百科 来源:网络整理
导读:导航到新窗口小部件后,我在尝试访问InheritedWidget时遇到问题. 我有这样的顶级小部件 class App extends StatelessWidget{ build(context){ return MaterialApp( title: 'Iniciar Sesion',home: LoginBlocProvider(child: WelcomeScreen()),); } } 然后Welc
导航到新窗口小部件后,我在尝试访问InheritedWidget时遇到问题.
我有这样的顶级小部件 class App extends StatelessWidget{ build(context){ return MaterialApp( title: 'Iniciar Sesion',home: LoginBlocProvider(child: WelcomeScreen()),); } } 然后WelcomeScreen有一个导航到LoginScreen的按钮 class WelcomeScreen extends StatelessWidget { @override Widget build(BuildContext context){ return Scaffold( body: Center(child: MyButton) ); } } class MyButton extends StatelessWidget { @override Widget build(BuildContext context) { return RaisedButton( shape: StadiumBorder(),child: Text('Ingresar',style: TextStyle(color: Colors.black)),elevation: 5.0,onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (BuildContext context) =>LoginScreen() )); } ); } } 最后在LoginScreen中我想访问InheritedWidget class LoginScreen extends StatefulWidget { @override _LoginScreenState createState() => _LoginScreenState(); } class _LoginScreenState extends State<LoginScreen> { LoginBloc bloc; @override void didChangeDependencies() { bloc = LoginBlocProvider.of(context); super.didChangeDependencies(); } @override Widget build(BuildContext context){ return Scaffold( body: Stack( fit: StackFit.expand,children: <Widget>[ Positioned( top: 0.0,child: Image.asset('assets/images/img.jpg',fit: BoxFit.none,),_buildLogin(),],); } } 编辑:这是LoginBlocProvider class LoginBlocProvider extends InheritedWidget { final bloc; LoginBlocProvider({Key key,Widget child}) : bloc = LoginBloc(),super(key:key,child:child); @override bool updateShouldNotify(InheritedWidget oldWidget) => true; static LoginBloc of(BuildContext context) { return (context.inheritFromWidgetOfExactType(LoginBlocProvider) as LoginBlocProvider).bloc; } } 但是,当我运行InheritedWidget的.of方法时,我得到了这个错误 I/flutter (27725): The following NoSuchMethodError was thrown building Builder: I/flutter (27725): The getter 'bloc' was called on null. I/flutter (27725): Receiver: null I/flutter (27725): Tried calling: bloc 我的印象是,这一切都与Navigator.push构建器方法中的上下文有关. 发生错误是因为传递给LoginBlocProvider.of()方法的上下文未找到实例. 有什么想法吗? 解决方法
在您提供的代码中,LoginScreen不是LoginBlocProvider的后代,这就是它无法找到祖先小部件的原因.您的代码在LoginBlocProvider中包装WelcomeScreen路由,但不包括整个导航器.解决方案是将您的MaterialApp包装在LoginBlocProvider中,然后您可以在应用程序的任何位置访问它.
class App extends StatelessWidget { @override Widget build(context) { return LoginBlocProvider( child: MaterialApp( title: 'Iniciar Sesion',home: WelcomeScreen(),); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |