【问题标题】:Trying to use InheritedWidget but Getting Null尝试使用 InheritedWidget 但获取 Null
【发布时间】:2018-08-07 01:05:39
【问题描述】:

我正在调用InheritedWidgetof 函数,但是当您在上面看到我的小部件位于树的顶部时,我的函数返回null。调用来自被推送到导航器堆栈的页面,而不是该页面。有谁知道为什么?我的InheritedWidget 代码如下。

class LiveKHProvider extends InheritedWidget {
  final LiveKHBloc liveKHBloc = LiveKHBloc();

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => oldWidget != this;

  static LiveKHBloc of(BuildContext context) {
    var inheritFromWidgetOfExactType =
        context.inheritFromWidgetOfExactType(LiveKHProvider); // to clearly see what’s returning null. 
        //This is where it returns null, 
        //so the below line is executed on a null object.
    return (inheritFromWidgetOfExactType as LiveKHProvider).liveKHBloc;
  }

  LiveKHProvider({Key key, Widget child}) : super(key: key, child: child);
}

【问题讨论】:

  • 您如何使用context?它实际上是继承小部件下方的上下文,还是根上下文?
  • 构建函数中调用小部件的上下文。您是在询问在继承小部件内还是在调用小部件内使用上下文?
  • 我刚刚调试它,发现它确实通过我试图抓取的对象的构造函数运行,这意味着它被实例化了,但由于某种原因,我无法访问它
  • 以上InheritedWidget代码位于哪个文件中,@ThinkDigital?它在您的main.dart 文件中吗?
  • 不,它本身在一个单独的类文件中。

标签: dart flutter


【解决方案1】:

至少在我的测试中,InheritedWidget 可以被继承,即使它是 MaterialApp/WidgetsApp/CupertinoApp 或路由的父级。

对于遇到此问题的其他人,更可能的解释是您导入了具有不同大小写的 InheritedWidget。即,在您生成它的地方,您可能已将其导入为 import 'MyInheritedWidget.dart',而在您尝试检索它的地方,您将其导入为 import 'myinheritedwidget.dart'

这不会导致任一文件出错(至少在 Windows 中),但不会匹配并返回 null。

【讨论】:

  • 这会导致分析仪出错并且无法运行
  • 为我跑。安卓和ios都可以。除非您试图在小部件生命周期中过早地获取它,在这种情况下,无论您做什么或将小部件放在哪里,它都会成为一种竞争条件。
  • 你可以用错误的大小写导入文件并且它可以工作吗?
  • 是的,导入,运行,但是当我尝试将它用作继承的小部件时崩溃了。
  • 太疯狂了,解决了我的问题 - 工具无法为您解决问题,这太疯狂了
【解决方案2】:

我通过将传递给我的 MaterialPageRoute 的页面包装在 InheritedWidget 中解决了这个问题。我假设树在页面路径处停止并且没有达到更高,尽管我不是 100% 确定。

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多