【发布时间】:2022-01-01 07:23:15
【问题描述】:
我通过compute() 方法使用隔离来从 API 获取、解析和排序数据(大约 10k 条目)。
我的方法getAllCards() 定义在一个类YgoProRepositoryImpl 中,该类有一个我的远程数据源类YgoProRemoteDataSource 的实例,在这个类中定义了调用我的API 的方法(这是一个简单的GET 请求) .
代码示例
ygopro_repository_impl.dart
class YgoProRepositoryImpl implements YgoProRepository {
final YgoProRemoteDataSource remoteDataSource;
// ...
YgoProRepositoryImpl({
required this.remoteDataSource,
// ...
});
// ...
static Future<List<YgoCard>> _fetchCards(_) async {
// As I'm inside an isolate I need to re-setup my locator
setupLocator();
final cards = await sl<YgoProRemoteDataSource>()
.getCardInfo(GetCardInfoRequest(misc: true));
cards.sort((a, b) => a.name.compareTo(b.name));
return cards;
}
@override
Future<List<YgoCard>> getAllCards() async {
final cards = await compute(_fetchCards, null);
return cards;
}
// ...
}
service_locator.dart
import 'package:get_it/get_it.dart';
import 'data/api/api.dart';
import 'data/datasources/remote/ygopro_remote_data_source.dart';
import 'data/repository/ygopro_repository_impl.dart';
import 'domain/repository/ygopro_repository.dart';
final sl = GetIt.instance;
void setupLocator() {
// ...
_configDomain();
_configData();
// ...
_configExternal();
}
void _configDomain() {
//! Domain
// ...
// Repository
sl.registerLazySingleton<YgoProRepository>(
() => YgoProRepositoryImpl(
remoteDataSource: sl(),
// ...
),
);
}
void _configData() {
//! Data
// Data sources
sl.registerLazySingleton<YgoProRemoteDataSource>(
() => YgoProRemoteDataSourceImpl(sl<RemoteClient>()),
);
// ...
}
void _configExternal() {
//! External
sl.registerLazySingleton<RemoteClient>(() => DioClient());
// ...
}
代码运行正常,但 getAllCards() 不可测试,因为我无法在我的隔离内部注入 YgoProRemoteDataSource 的模拟类,因为它总是会从我的服务定位器获取引用。
如何不依赖我的服务定位器将YgoProRemoteDataSource 注入我的隔离内部并使getAllCards() 可测试?
【问题讨论】:
标签: flutter dart service-locator