在我想使用Provider
v3的简单应用程序中,出现以下错误:
以下断言被抛出 BaseWidget(脏,状态: _BaseWidgetState#f3d70):类型'(BuildContext,LoginViewModel,Widget)=>脚手架'不是类型的子类型 '(BuildContext,ChangeNotifier,小部件)=>小部件'
我正在尝试实现this tutorial,我想我已经实现了本教程中的所有代码。
7小时后进行测试,并检查为什么我找不到错误
我在此代码中收到此错误:
class _LoginViewState extends State<LoginView> {
@override
Widget build(BuildContext context) {
return BaseWidget<LoginViewModel>(
model: LoginViewModel(),
child: Text('test'),
builder: (context, model, child) => Scaffold(
),
);
}
}
BaseWidget
类:
class BaseWidget<T extends ChangeNotifier> extends StatefulWidget {
final Widget Function(BuildContext context, T model, Widget child) builder;
final T model;
final Widget child;
final Function(T) onModelReady;
BaseWidget({
Key key,
this.builder,
this.model,
this.child,
this.onModelReady,
}) : super(key: key);
_BaseWidgetState<T> createState() => _BaseWidgetState<T>();
}
class _BaseWidgetState<T extends ChangeNotifier> extends State<BaseWidget<T>> {
T model;
@override
void initState() {
model = widget.model;
if (widget.onModelReady != null) {
widget.onModelReady(model);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<T>(
builder: (context) => model,
child: Consumer<T>(
builder: widget.builder,
child: widget.child,
),
);
}
}
LoginViewModel
类:
class LoginViewModel extends BaseModel {
}
BaseModel
类:
class BaseModel extends ChangeNotifier {
bool _busy = false;
bool get busy => _busy;
void setBusy(bool value) {
_busy = value;
notifyListeners();
}
}
答案 0 :(得分:0)
根据错误提示
'(BuildContext,LoginViewModel,Widget)=>支架'不是'(BuildContext,ChangeNotifier,Widget)=> Widget'类型的子类型
此处所有参数正确,除了其中一个参数是LoginViewModel。 BuildContext和BuildContext一样传递,Widget和Widget&Scaffold是Widget一样传递,因此它也是正确的。
观看了LoginViewModel和ChangeNotifier中的这种不匹配之后,我访问了您提供的教程链接。在那里我找到了
LoginViewModel类扩展了ChangeNotifier {
所以问题是 LoginViewModel 类不是 ChangeNotifier 类的直接子级,但是LoginViewModel类扩展了ChangeNotifier {&Flutter正在寻找的直接子级> ChangeNotifier 。
请重新访问本教程并尝试创建扩展 ChangeNotifier 的 LoginViewModel 。 如果问题仍然存在,请通知我们。