我在用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,但都无济于事。我意识到我错过了一些基本的东西。
1条答案
按热度按时间wwtsj6pe1#
GetIt正在与你的import语句作斗争。你需要使用包导入而不是相对导入来使它正确工作。
这样做:
字符串
而不是:
型