flutter GetIt未注册依赖项

gojuced7  于 11个月前  发布在  Flutter
关注(0)|答案(1)|浏览(136)

我在用GetIt(get_it:^5.0.3)并编写了一个单元测试来验证我的用法。每个依赖项都是单独测试的。他们所做的就是测试依赖项是否已注册。前三个依赖项已注册。其余的依赖项从isRegestered函数返回false。三个成功的依赖项都是从外部包导入的测试依赖项。其余的-失败的依赖项-都是作为项目的一部分开发的类。很明显,这让我得出结论,我做了一些根本性的错误。我不认识其他Flutter/Dart开发人员,所以.
依赖注入/服务定位器:

import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';

import 'core/network/network_info.dart';
import 'core/presentation/converter/input_converter.dart';
import 'features/schedule/data/repositories/pill_box_set_repository_impl.dart';
import 'features/schedule/data/datasources/pill_box_set_local_data_source.dart';
import 'features/schedule/data/datasources/pill_box_set_remote_data_source.dart';
import 'features/schedule/domain/repositories/pill_box_set_repository.dart';
import 'features/schedule/domain/usecases/get_pill_box_set.dart';
import 'features/schedule/presentation/bloc/pill_box_set_bloc.dart';

final sl = GetIt.instance;

Future<void> init() async {
  //! Features - Schedule
  // Bloc
  sl.registerFactory(() =>
      PillBoxSetBloc(
          pillBoxSetGetter: sl.get<GetPillBoxSet>(),
          inputConverter: sl.get<InputConverter>(),
      )
  );

  // Use cases
  sl.registerLazySingleton(() => GetPillBoxSet(sl.get<PillBoxSetRepository>()));

  // Repository
  sl.registerLazySingleton<PillBoxSetRepository>(() =>
      PillBoxSetRepositoryImpl(
          networkInfo: sl.get<NetworkInfo>(),
          localDataSource: sl.get<PillBoxSetLocalDataSource>(),
          remoteDataSource: sl.get<PillBoxSetRemoteDataSource>(),
      )
  );

  // Data sources
  sl.registerLazySingleton<PillBoxSetLocalDataSource>(
      () =>  PillBoxSetLocalDataSourceImpl(sharedPreferences: sl())
  );
  sl.registerLazySingleton<PillBoxSetRemoteDataSource>(
      () => PillBoxSetRemoteDataSourceImpl(client: sl.get<http.Client>())
  );

  //! Core
  sl.registerLazySingleton<InputConverter>(() => InputConverter());
  sl.registerLazySingleton<NetworkInfo>(() =>
      NetworkInfoImpl(sl.get<DataConnectionChecker>())
  );

  //! External
  final sharedPreferences = await SharedPreferences.getInstance();
  sl.registerLazySingleton<SharedPreferences>(() => sharedPreferences);
  sl.registerLazySingleton<http.Client>(() => http.Client());
  sl.registerLazySingleton<DataConnectionChecker>(() => DataConnectionChecker());
}

字符串
测试:

import 'package:data_connection_checker/data_connection_checker.dart';
import 'package:pusherman/core/presentation/converter/input_converter.dart';
import 'package:pusherman/features/schedule/data/datasources/pill_box_set_local_data_source.dart';
import 'package:pusherman/features/schedule/data/datasources/pill_box_set_remote_data_source.dart';
import 'package:pusherman/features/schedule/domain/repositories/pill_box_set_repository.dart';
import 'package:pusherman/features/schedule/domain/usecases/get_pill_box_set.dart';
import 'package:pusherman/features/schedule/presentation/bloc/pill_box_set_bloc.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:test/test.dart';
import 'package:http/http.dart' as http;

import 'package:pusherman/core/network/network_info.dart';

import '../lib/service_locator.dart' as di;

void main() async {
  await di.init();

  group('is registered', () {
    test('DataConnectionChecker', () async {
      expect(di.sl.isRegistered<DataConnectionChecker>(), isTrue);
    });
    test('http.Client', () {
      expect(di.sl.isRegistered<http.Client>(), isTrue);
    });
    test('SharedPreferences', () {
      expect(di.sl.isRegistered<SharedPreferences>(), isTrue);
    });
    test('NetworkInfo', () async {
      expect(di.sl.isRegistered<NetworkInfo>(), isTrue);
    });
    test('InputConverter', () {
      expect(di.sl.isRegistered<InputConverter>(), isTrue);
    });
    test('PillBoxSetLocalDataSource', () {
      expect(di.sl.isRegistered<PillBoxSetLocalDataSource>(), isTrue);
    });
    test('PillBoxSetRemoteDataSource', () {
      expect(di.sl.isRegistered<PillBoxSetRemoteDataSource>(), isTrue);
    });
    test('PillBoxSetRepository', () {
      expect(di.sl.isRegistered<PillBoxSetRepository>(), isTrue);
    });
    test('GetPillBoxSet', () {
      expect(di.sl.isRegistered<GetPillBoxSet>(), isTrue);
    });
    test('PillBoxSetBloc', () {
      expect(di.sl.isRegistered<PillBoxSetBloc>(), isTrue);
    });

  });
}


失败的依赖:

import 'package:dartz/dartz.dart';

import '../../error/failure.dart';

class InputConverter {
  static final InputConverter _instance = InputConverter._();

  factory InputConverter() => _instance;

  InputConverter._() { }

  Either<Failure, int> toUnsignedInteger(String s) {
    try {
      var i = int.parse(s);
      if (i < 0) throw FormatException();
      return Right(i);
    } on FormatException {
      return Left(InvalidInputFailure());
    }
  }

  Either<Failure, String> toWordString(String s) {
    if (s == null) {
      return Left(InvalidInputFailure());
    }
    String trimmedString = s.trim();
    if (trimmedString.isEmpty) {
      return Left(InvalidInputFailure());
    }
    return Right(trimmedString);
  }
}

class InvalidInputFailure extends Failure {}


我已经阅读了文档,搜索并查看了Flutter GetIt Plugin - No type xxx is registered inside GetIt,但都无济于事。我意识到我错过了一些基本的东西。

wwtsj6pe

wwtsj6pe1#

GetIt正在与你的import语句作斗争。你需要使用包导入而不是相对导入来使它正确工作。
这样做:

import 'package:pusherman/service_locator.dart' as di;

字符串
而不是:

import '../lib/service_locator.dart' as di;

相关问题