DependOnInheritedWidgetOfExactType() 返回 null

0xC*_*AF2 9 dart flutter

我试图将我的财产发送InheritedWidget给它的孩子。

class Detector extends InheritedWidget {
  final bool isEditable;

  Detector({@required this.isEditable, @required Widget child, Key key})
      : super(child: child, key: key);

  static Detector of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<Detector>();
  }

  @override
  bool updateShouldNotify(Detector oldWidget) {
    return oldWidget.isEditable != isEditable;
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这里提到的。小部件由以下人员创建:

Detector(
  isEditable: otherObj.isEditable,
  child: command.makeWidget(context) // Extension method that returns new widget
);
Run Code Online (Sandbox Code Playgroud)

makeWidget()方法调用of方法:

   final detector = Detector.of(context);
    if (detector != null && detector.isEditable) {
      return Container(
        child: ...,
      );
    }
Run Code Online (Sandbox Code Playgroud)

总是返回空值。为什么dependOnInheritedWidgetOfExactType()返回null?我使用扩展方法,但给它一个祖先小部件的上下文。

Rém*_*let 2

这就是您不应该使用函数而不是类来制作可重用小部件的原因之一。创建小部件的函数和类有什么区别?

您正在调用dependOnInheritedWidgetOfExactType<Detector>BuildContext祖先Detector

代替:

Detector(
  isEditable: otherObj.isEditable,
  child: command.makeWidget(context) // Extension method that returns new widget
);
Run Code Online (Sandbox Code Playgroud)

重构command.makeWidget(context),使其成为一个StatelessWidget类而不是一个函数。

这将为您提供一个BuildContext的后代Detector,并将解决您的问题。