gpt4 book ai didi

dart - InheritedWidget - 在 navigator.push 之后在 null 上调用 getter

转载 作者:IT老高 更新时间:2023-10-28 12:36:55 26 4
gpt4 key购买 nike

在导航到新小部件后尝试访问 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 构建器方法中的上下文有关。因为如果我在没有 Navigator.push 的情况下使用 LoginScreen 小部件,我可以完美地使用 InheritedWidget

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

对此有什么想法吗?

最佳答案

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

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

关于dart - InheritedWidget - 在 navigator.push 之后在 null 上调用 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com