无效参数:类型为 Api 的对象/工厂已在 GetIt 内注册

Abd*_*adi 5 xcode dart dart-pub flutter flutter-dependencies

当我尝试在 iOS 模拟器上启动我的 flutter 应用程序时,我看到一个白色的空白屏幕,如下所示:

\n
 Launching lib/main.dart on iPhone 12 Pro Max in debug mode...\nRunning Xcode build...                                                  \n \xe2\x94\x94\xe2\x94\x80Compiling, linking and signing...                        13.7s\nXcode build done.                                           38.0s\n[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: Invalid argument(s): Object/factory with  type Api is already registered inside GetIt. \n#0      throwIf (package:get_it/get_it_impl.dart:7:18)\n#1      _GetItImplementation._register (package:get_it/get_it_impl.dart:729:5)\n#2      _GetItImplementation.registerLazySingleton (package:get_it/get_it_impl.dart:502:5)\n#3      setupLocator (package:r/locator.dart:14:18)\n#4      main (package:r/main.dart:12:3)\n#5      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:140:25)\n#6      _rootRun (dart:async/zone.dart:1354:13)\n#7      _CustomZone.run (dart:async/zone.dart:1258:19)\n#8      _runZoned (dart:async/zone.dart:1788:10)\n#9      runZonedGuarded (dart:async/zone.dart:1776:12)\n#10     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:133:5)\n#11     _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)\n#12     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.<\xe2\x80\xa6>\nSyncing files to device iPhone 12 Pro Max...                       137ms\n
Run Code Online (Sandbox Code Playgroud)\n

小智 4

你的问题已经晚了,但我尝试向那些仍然面临此类错误的人解释这个问题,我希望它有所帮助。

基本上发生的事情是在 GetIt 实例中注册的依赖项在某个时刻被重新注册。有三种可能的解决方案

  1. 使用安全注册即检查要注册的类型是否已注册,只有尚未注册时才调用register方法。
    if (!GetIt.instance.isRegistered<T>()) {
    GetIt.instance.registerLazySingleton<T>(() => const T());}
Run Code Online (Sandbox Code Playgroud)
  1. 找出第二次注册依赖项的位置,并通过删除该行来防止重新注册
  2. 使用完实例后尝试取消注册您的依赖项,并在需要时重新注册它。(可能不是最好的解决方案)。
  if (GetIt.instance.isRegistered<T>()) {
    GetIt.instance.unregister<T>(); }
Run Code Online (Sandbox Code Playgroud)

受此启发。