我试图将数据从一个小部件传递到树下的另一个小部件。这是我的代码,可从一个屏幕导航到另一个屏幕:
final page = LanguagePreferenceProvider(child: UserNameScreen(),language: _currentNationality,);
navigate(context, page);
navigate()
方法:
void navigate(BuildContext context, Widget page) {
Navigator.pushReplacement(
context,
PageRouteBuilder(
pageBuilder: (context, anim1, anim2) => page,
transitionsBuilder: (context, anim1, anim2, child) {
return SlideTransition(
position: Tween<Offset>(
end: Offset(0, 0), begin: Offset(1, 0))
.animate(anim1),
child: page,
);
},
),
);
}
现在在另一个屏幕中,我正在使用它来获取值:
@override
void didChangeDependencies() {
super.didChangeDependencies();
_selectedLanguage = LanguagePreferenceProvider.of(context).language;
我的InheritedWidget类:
class LanguagePreferenceProvider extends InheritedWidget{
final String language;
LanguagePreferenceProvider({
Widget child,
this.language,
}) : super(child: child);
@override
bool updateShouldNotify(LanguagePreferenceProvider oldWidget) => language != oldWidget.language;
static LanguagePreferenceProvider of(BuildContext context) => context.inheritFromWidgetOfExactType(LanguagePreferenceProvider);
}
但是我收到以下错误:
The getter 'language' was called on null.
答案 0 :(得分:2)
实际上,不是language
是null
,而是LanguagePreferenceProvider
。根据您的示例,我可以推断出发生这种情况的可能情况。
您有一个看起来像这样的小部件树:
- MaterialApp
+ Navigator
+ LanguagePreferenceProvider
+ SomeUiWidgets
注意:默认情况下,MaterialApp中有一个导航器。
每当您将一条路线推到导航器时,孩子就会消失。完全替换或压低路由堆栈。在任何一种情况下,如果新路线的小部件树不包含一个,则查询LanguagePreferenceProvider.of(context)
可能会产生一个null
值。
要解决此问题,可以“继承状态”,将继承的窗口小部件移到导航器上方。这样,替换路线不会破坏它。这是使用InheritedWidget跨路由保持状态的一种方法。