【发布时间】:2021-07-12 16:42:26
【问题描述】:
我正在将一个大型项目迁移到 null 安全性,我遇到了一个奇怪的错误,我不完全确定如何解决。
“错误:类型参数'T'不符合'GetIt.call'上类型变量'T'的绑定'Object'。”
class BaseView<T extends BaseProvider?> extends StatefulWidget {
final Widget Function(BuildContext context, T value, Widget? child)? builder;
final Function(T)? onModelReady;
BaseView({this.builder, this.onModelReady});
@override
_BaseViewState<T> createState() => _BaseViewState<T>();
}
class _BaseViewState<T extends BaseProvider?> extends State<BaseView<T?>> {
T model = locator<T>(); <---- This is throwing it
@override
void initState() {
if (widget.onModelReady != null) {
widget.onModelReady!(model);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<T?>(
create: (context) => model,
child: Consumer<T>(builder: widget.builder!),
);
}
}
我找不到有关此错误的太多信息,而且到目前为止我尝试过的任何方法都没有奏效。有人可以帮忙吗?
我正在使用 Provider 进行状态管理,而 BaseView 是在构建过程中包装我所有其他视图的东西;例如:
class EquipmentMainView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BaseView<EquipmentProvider>(
onModelReady: (model) async {
model.getAllFunctions();
},..
【问题讨论】:
-
GetIt.call>T>()期望T派生自Object(因此不可为空)。我不熟悉package:get_it,也不知道locator是什么,但您似乎正在尝试将GetIt.call()与可能为空的类型参数一起使用。您可能应该将BaseView和_BaseViewState改为使用T extends BaseProvider。 -
啊,你是对的!进行这两项更改可以使其构建。谢谢
-
@Swisscheese 你做了什么改变?
标签: flutter dart dart-null-safety