Flutter InheritedWidget在窗口小部件树中以null形式提供数据
我试图将数据从一个小部件传递到树下的另一个小部件。以下是我的代码,可以从一个屏幕导航到另一个屏幕:Flutter InheritedWidget在窗口小部件树中以null形式提供数据,flutter,Flutter,我试图将数据从一个小部件传递到树下的另一个小部件。以下是我的代码,可以从一个屏幕导航到另一个屏幕: final page = LanguagePreferenceProvider(child: UserNameScreen(),language: _currentNationality,); navigate(context, page); navigate()方法: void navigate(BuildContext context, Widget page) {
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,
);
},
),
);
}
我的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.
实际上,
language
不是null
,而是LanguagePreferenceProvider
。根据你的例子,我可以从理论上推断出它发生的可能情况
您的小部件树可能如下所示:
- MaterialApp
+ Navigator
+ LanguagePreferenceProvider
+ SomeUiWidgets
注意:默认情况下,MaterialApp中有一个导航器
每当你推一条路线到导航仪,你这样做,孩子们就会离开。要么被完全替换,要么被推到路由堆栈上。在这两种情况下,如果新路由的小部件树不包含值,则查找LanguagePreferenceProvider.of(context)
可能会导致null
值
要解决这个问题,您可以“生活在状态之上”,将继承的小部件移动到导航器上方。这样,替换路由不会破坏它。这是一种通过InheritedWidget跨路由保持状态的方法
- MaterialApp
+ Navigator
+ LanguagePreferenceProvider
+ SomeUiWidgets