【问题标题】:InheritedWidget giving data as null down the widget tree FlutterInheritedWidget 在小部件树 Flutter 中将数据设为 null
【发布时间】:2019-10-18 04:40:40
【问题描述】:

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

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.

【问题讨论】:

    标签: flutter


    【解决方案1】:

    实际上,null 不是language,而是LanguagePreferenceProvider。根据你的例子,我可以推测出它发生的可能场景。

    您的小部件树可能如下所示:

    - MaterialApp
      + Navigator
        + LanguagePreferenceProvider
          + SomeUiWidgets
    

    注意: MaterialApp 默认有一个导航器。

    每当您将路线推送到导航器时,您所做的事情都会让孩子们离开。要么完全替换,要么下推到路由堆栈上。在任何一种情况下,如果新路由的小部件树不包含 LanguagePreferenceProvider.of(context) 值,则查找 LanguagePreferenceProvider.of(context) 可能会产生 null 值。

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

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2019-09-14
      • 2020-02-23
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-03-05
      • 2021-03-16
      相关资源
      最近更新 更多