支架”不是类型“(BuildContext,ChangeNotifier,小部件)=>小部件”的子类型

时间:2019-09-15 13:35:41

标签: flutter dart

在我想使用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();
  }
}

1 个答案:

答案 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 。 如果问题仍然存在,请通知我们。