在导航到新的小部件后,try 访问继承的小部件时遇到问题.

我的顶级小部件如下所示

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(),
        ],
      ),
    );
  }
}

Edited:这里是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构建器方法中的上下文有关. 因为如果我使用不带Navigator.ush的LoginScreen小部件,我完全可以很好地使用InheritedWidget

之所以发生错误,是因为传递给LoginBlocProvider.of()方法的上下文没有找到实例.

有什么 idea 吗?

推荐答案

在您提供的代码中,LoginScreen不是LoginBlocProvider的后代,这就是它找不到祖先小部件的原因.您的代码将WelcomeScreen路由包装在LoginBlocProvider中,但不是整个导航器.解决方案是将您的MaterialApp封装在LoginBlocProvider中,这样您就可以在应用程序中的任何地方访问它.

class App extends StatelessWidget {
  @override
  Widget build(context) {
    return LoginBlocProvider(
      child: MaterialApp(
        title: 'Iniciar Sesion',
        home: WelcomeScreen(),
      ),
    );
  }
}

Dart相关问答推荐

如何在 Dart 游戏中重复听按键?

禁用 ListView 滚动

如何从 Flutter App 连接 Ms SQL?

如何在 Flutter 中找出 URL 的有效性?

如何防止键盘在Flutter中按提交键时失效?

如何在Flatter中打开设备GPS?

如何使用 StreamBuilder 更新 TextField 的值?

有没有可能用Flatter摄像头插件播放视频?

Package:flutter/src/widgets/overlay.dart':Failed assertion: line 133 pos 12: "_overlay != null"

停止音频循环(audioplayers 包)

Flutter:主题未应用于文本小部件

参数类型Map Function()不能分配给参数类型Map

如何在 Dart 中获取字符串的字节数?

函数调用前的感叹号是什么意思?

Dart 是否支持函数式编程?

我应该如何在 Dart 中测试 Future?

GWT 与 Dart - 主要区别是什么? Dart 是 GWT 的潜在替代品吗?

_internal 的语义是什么?

Dart 是否支持枚举?

Dart:创建一个从 0 到 N 的列表