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