首页 > 解决方案 > Dart 泛型类型作为类成员函数的类型

问题描述

我有一个使用泛型的类:Screen bloc

class ScreenWithUpdater<DataType> extends StatefulWidget {
  final Updater<DataType> updater;
  final Widget Function(BuildContext, DataType) bodyBuilder;
  final Duration updatePeriod;

  const ScreenWithUpdater({
    Key key,
    @required this.updater,
    @required this.bodyBuilder,
    @required this.updatePeriod,
  }) : super(key: key);
  @override
  _ScreenWithUpdaterState createState() => _ScreenWithUpdaterState();
}

class _ScreenWithUpdaterState<DataType>
    extends State<ScreenWithUpdater<DataType>> {
  UpdateBloc<DataType> _bloc;

  @override
  void initState() {
    super.initState();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _bloc = UpdateBloc<DataType>(
      updatePeriod: widget.updatePeriod,
      updater: widget.updater,
    );
  }

  @override
  void dispose() {
    _bloc.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<UpdateBloc, UpdateState>(
      cubit: _bloc,
      builder: (
        context,
        state,
      ) {
        if (state is ShowLoader) {
          return LoaderWidget();
        } else if (state is UpdateMainState<DataType>) {
          return widget.bodyBuilder(context, state.data);
        } else {
          return Center(
            child: Text('Something went wrong'),
          );
        }
      },
    );
  }
}

当我以这样的方式调用它时:

ScreenWithUpdater<List<OrderFromApi>>(
            updatePeriod: updatePeriod,
            updater: OrdersPageUpdater(),
            bodyBuilder: (context, orders) => OrdersPage(microOrders: orders),
          ),

它失败并出现异常

type '(BuildContext, List) => OrdersPage' 不是类型 '(BuildContext, dynamic) => Widget' 的子类型


但是当我用下一个方式打电话时

ScreenWithUpdater(
            updatePeriod: updatePeriod,
            updater: OrdersPageUpdater(),
            bodyBuilder: (context, orders) => OrdersPage(microOrders: orders),
          ),

它工作正常

为什么?我应该改变什么来运行我的第一个版本?

标签: flutterdartgenericstypes

解决方案


下一行有一个问题:

 @override
  _ScreenWithUpdaterState createState() => _ScreenWithUpdaterState();
}

然后我把这条线改成

 @override
  _ScreenWithUpdaterState createState() => _ScreenWithUpdaterState<DataType>();
}

现在一切正常!


推荐阅读