【问题标题】:Error: Type argument 'T' doesn't conform to the bound 'Object' of the type variable 'T' on 'GetIt.call'. After migrating to Null Safety错误:类型参数“T”不符合“GetIt.call”上类型变量“T”的绑定“对象”。迁移到空安全后
【发布时间】: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&gt;T&gt;() 期望 T 派生自 Object(因此不可为空)。我不熟悉package:get_it,也不知道locator 是什么,但您似乎正在尝试将GetIt.call() 与可能为空的类型参数一起使用。您可能应该将BaseView_BaseViewState 改为使用T extends BaseProvider
  • 啊,你是对的!进行这两项更改可以使其构建。谢谢
  • @Swisscheese 你做了什么改变?

标签: flutter dart dart-null-safety


【解决方案1】:

在这里为将来可能最终遇到此问题的任何其他人发布,只是通过更改更改了 jamesdlin 建议的 BaseProvider 的可空性

class BaseView<T extends BaseProvider?>

class BaseView<T extends BaseProvider>

【讨论】:

    【解决方案2】:

    当我升级到 Flutter 2.0 时遇到了类似的问题,我在 Generic 类中创建了泛型方法来显式扩展基类 Object,即

    来自:

    import 'package:get_it/get_it.dart';
    
    class PoultryBabaRegistry<T> {
     static GetIt _getIt = GetIt.instance;
    
     static void register<T>(T model) {
       _getIt.registerSingleton<T extends Object >(model, signalsReady:  true);
        }
     static void remove<T>(T model) {
      _getIt.unregister<T extends Object>(instance:model);
         }
     static T getIt<T>() {
       return _getIt.get<T>();
      }
    }
    

    到:

    class PoultryBabaRegistry<T extends Object> {
       static GetIt _getIt = GetIt.instance;
    
       static void register<T extends Object>(T model) {
        _getIt.registerSingleton<T  >(model, signalsReady: true);
        }
       static void remove<T extends Object>(T model) {
        _getIt.unregister<T>(instance:model);
       }
      static T getIt<T extends Object>() {
        return _getIt.get<T>();
       }
     }
    

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 2019-12-18
      • 2021-07-29
      • 2015-06-24
      • 2022-01-07
      • 2016-09-09
      • 2017-07-14
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多