InheritedWidget在小部件树Flutter中将数据设为null

时间:2019-06-02 08:54:09

标签: flutter

我试图将数据从一个小部件传递到树下的另一个小部件。这是我的代码,可从一个屏幕导航到另一个屏幕:

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.

1 个答案:

答案 0 :(得分:2)

实际上,不是languagenull,而是LanguagePreferenceProvider。根据您的示例,我可以推断出发生这种情况的可能情况。

您有一个看起来像这样的小部件树:

- MaterialApp
  + Navigator
    + LanguagePreferenceProvider
      + SomeUiWidgets

注意:默认情况下,MaterialApp中有一个导航器。

每当您将一条路线推到导航器时,孩子就会消失。完全替换或压低路由堆栈。在任何一种情况下,如果新路线的小部件树不包含一个,则查询LanguagePreferenceProvider.of(context)可能会产生一个null值。

要解决此问题,可以“继承状态”,将继承的窗口小部件移到导航器上方。这样,替换路线不会破坏它。这是使用InheritedWidget跨路由保持状态的一种方法。