Generics 颤振中按功能(T)传递通用类型

Generics 颤振中按功能(T)传递通用类型,generics,flutter,dart,flutter-widget,Generics,Flutter,Dart,Flutter Widget,我正在尝试创建一个通用的消费者小部件,以便于将ViewModel传递给它的子对象。因此,我有两个功能。一个在ViewModel的init之后有一个函数(T),另一个用于将模型传递给其子小部件 在泛型类中是ChangeNotifier的子类,在我想要在这两个函数中发送T值之前,它可以正常工作 然后我得到以下错误: 类型“(OnBoardingViewModel)=>Null”不是类型的子类型 “(变更通知程序)=>void” 及 类型“(BuildContext,OnBoardingViewMod

我正在尝试创建一个通用的消费者小部件,以便于将ViewModel传递给它的子对象。因此,我有两个功能。一个在ViewModel的init之后有一个函数(T),另一个用于将模型传递给其子小部件

在泛型类中是ChangeNotifier的子类,在我想要在这两个函数中发送T值之前,它可以正常工作

然后我得到以下错误:

类型“(OnBoardingViewModel)=>Null”不是类型的子类型 “(变更通知程序)=>void”

类型“(BuildContext,OnBoardingViewModel,Widget)=>Scaffold”不可用 类型的子类型 “(BuildContext、ChangeNotifier、Widget)=>Widget”

但是,当我将extends类型从ChangeNotifier更改为OnBoardingViewModel时,一切正常

有人能帮我解释一下为什么这样不行吗

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';

class StateFullConsumerWidget<T extends ChangeNotifier> extends StatefulWidget{

  StateFullConsumerWidget({@required this.builder,Key key,this.onPostViewModelInit,this.child}) : super(key : key);

  final Widget Function(BuildContext context, ChangeNotifier value, Widget child) builder;
  final Widget child;

  final void Function(T) onPostViewModelInit;

  @override
  _StateFullConsumerWidgetState<T> createState() => _StateFullConsumerWidgetState<T>();
}

class _StateFullConsumerWidgetState<T extends ChangeNotifier> extends State<StateFullConsumerWidget>{
  T _viewModel;
  @override
  void initState() {
    // assign the model once when state is initialised
    _viewModel = GetIt.instance.get<T>();
    widget.onPostViewModelInit(_viewModel);


    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<T>(
      builder: (context) => _viewModel,
      child: Consumer<T>(
        builder: widget.builder,
        child: widget.child,
      ),
    );
  }

}

我不太清楚为什么会出现这种情况,但dart编译器无法将StateFullConsumerWidget中的类型t识别为与_StateFullConsumerWidgetState相同的类型t。如果将函数传递给状态,则一切都会按预期工作

结果代码:

class StateFullConsumerWidget<T extends ChangeNotifier> extends StatefulWidget{

  StateFullConsumerWidget({@required this.builder,Key key,this.onPostViewModelInit,this.child}) : super(key : key);

  final Widget Function(BuildContext context, T value, Widget child) builder;
  final Widget child;

  final Function(T viewModel) onPostViewModelInit;

  @override
  _StateFullConsumerWidgetState<T> createState() => _StateFullConsumerWidgetState<T>(onPostViewModelInit, builder);
}

class _StateFullConsumerWidgetState<T extends ChangeNotifier> extends State<StateFullConsumerWidget>{
  final Function(T viewModel) _onPostViewModelInit;
  final Widget Function(BuildContext context, T value, Widget child) _builder;
  T _viewModel;

  _StateFullConsumerWidgetState(this._onPostViewModelInit, this._builder);

  @override
  void initState() {
    // assign the model once when state is initialised
    _viewModel = GetIt.instance.get<T>();
    _onPostViewModelInit(_viewModel);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<T>(
      builder: (context) => _viewModel,
      child: Consumer<T>(
        builder: _builder,
        child: widget.child,
      ),
    );
  }
}
class StateFullConsumerWidget扩展StatefulWidget{
StateFullConsumerWidget({@required this.builder,Key Key,this.onPostViewModelInit,this.child}):super(Key:Key);
最终小部件功能(BuildContext上下文、T值、小部件子项)生成器;
最后一个孩子;
PostViewModelInit上的最终函数(T viewModel);
@凌驾
_StateFullConsumerWidgetState createState()=>_StateFullConsumerWidgetState(onPostViewModelInit,生成器);
}
类_StateFullConsumerWidgetState扩展状态{
最终函数(T viewModel)\u onPostViewModelInit;
最终小部件功能(BuildContext上下文、T值、小部件子项)\u生成器;
T_视图模型;
_StateFullConsumerWidgetState(this.\u onPostViewModelInit,this.\u生成器);
@凌驾
void initState(){
//初始化状态时,分配模型一次
_viewModel=GetIt.instance.get();
_onPostViewModelInit(_viewModel);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
生成器:(上下文)=>\u视图模型,
儿童:消费者(
建筑商:_建筑商,
child:widget.child,
),
);
}
}

您使用泛型类型
T
的方式不完整。在代码中编写的
StateFullConsumerWidget
\u StateFullConsumerWidgetState
类之间的关系是这样的:
StateFullConsumerWidget
使用与自身相同的
T
类型参数创建其状态,因此小部件知道状态使用的泛型与自身相同。但是,从
\u StateFullConsumerWidgetState
的角度来看,该类声明如下:

class _StateFullConsumerWidgetState<T extends ChangeNotifier> 
    extends State<StateFullConsumerWidget>
class StateFullConsumerWidget<T extends ChangeNotifier> extends StatefulWidget{

  StateFullConsumerWidget({@required this.builder,Key key,this.onPostViewModelInit,this.child}) : super(key : key);

  final Widget Function(BuildContext context, T value, Widget child) builder;
  final Widget child;

  final Function(T viewModel) onPostViewModelInit;

  @override
  _StateFullConsumerWidgetState<T> createState() => _StateFullConsumerWidgetState<T>(onPostViewModelInit, builder);
}

class _StateFullConsumerWidgetState<T extends ChangeNotifier> extends State<StateFullConsumerWidget>{
  final Function(T viewModel) _onPostViewModelInit;
  final Widget Function(BuildContext context, T value, Widget child) _builder;
  T _viewModel;

  _StateFullConsumerWidgetState(this._onPostViewModelInit, this._builder);

  @override
  void initState() {
    // assign the model once when state is initialised
    _viewModel = GetIt.instance.get<T>();
    _onPostViewModelInit(_viewModel);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<T>(
      builder: (context) => _viewModel,
      child: Consumer<T>(
        builder: _builder,
        child: widget.child,
      ),
    );
  }
}
class _StateFullConsumerWidgetState<T extends ChangeNotifier> 
    extends State<StateFullConsumerWidget>
class _StateFullConsumerWidgetState<T extends ChangeNotifier> 
    extends State<StateFullConsumerWidget<T>>