【发布时间】:2019-12-27 04:22:02
【问题描述】:
免责声明:我知道有几个有点相似的问题,但没有一个能帮助我理解这个特定案例中的问题。
我创建了一个实用小部件,它接受ChangeNotifier,并在数据更改时自动重建小部件。
这个小部件的代码略有缩短,但问题是可见的:
class ChangeNotifierConsumer<T extends ChangeNotifier> extends StatefulWidget {
const ChangeNotifierConsumer({
Key key,
@required this.notifier,
@required this.builder,
}) : super(key: key);
final T notifier;
final Widget Function(BuildContext context, T cache) builder;
@override
_ChangeNotifierConsumerState createState() => _ChangeNotifierConsumerState();
}
class _ChangeNotifierConsumerState extends State<ChangeNotifierConsumer> {
@override
Widget build(BuildContext context) => widget.builder(context, widget.notifier);
}
class Model extends ChangeNotifier { ... }
然后我会按如下方式使用小部件,但这就是发生错误的地方:
ChangeNotifierConsumer<Model>(
notifier: Model(),
builder: (BuildContext context, Model model) { ... }
)
确切的错误信息是:
type '(BuildContext, Model) => ListView' is not a subtype of type '(BuildContext, ChangeNotifier) => Widget'
dart 分析也没有编译时错误或输出,只是在运行时失败。
尽管模型扩展了 ChangeNotifier,为什么会出现此错误?
如果我按如下方式使用Builder,那就没有问题了:
builder: (BuildContext context, dynamic model) {
Model model = model as Model;
}
【问题讨论】:
-
好吧,首先,您的实用程序是内置的:
AnimatedBuilder -
我知道
AnimatedBuilder,但正如我所写的“小部件有点短”。我在里面做了额外的事情,AnimatedBuilder没有。除此之外,我在其他小部件上也遇到了类似的错误,但这个是最容易描述问题的。 -
在使用的时候能把你正在使用的代码贴在builder函数里吗?
-
你能发布一个最小的、完整的、可验证的例子吗?我无法重现您的问题。错误消息是正确的,因为
(BuildContext, Model) => ListView不是(BuildContext, ChangeNotifier) => Widget的子类型不是,但不清楚为什么它需要ChangeNotifier参数。您确定您提供了遇到错误的确切代码吗? -
我怀疑您有名称冲突,您使用的这个
Model不是您定义的模型类。只需在ChangeNotifierConsumer<Model>(中的Model上按 ctrl+click(Intellij) 并查看它会将您带到哪里。
标签: inheritance flutter dart casting