我在使用
injectable时如何将
http.Client
注入到 flutter 类中这个简单问题上花了几个小时。他们引用在模块中执行此操作(如本post中所建议的那样),但我也无法弄清楚。
这是我的文件(抽象类和具体类):
import 'dart:convert';
import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'package:injectable/injectable.dart';
import 'package:myapp_flutter/core/errors/exceptions.dart';
import 'package:myapp_flutter/data/models/sample_model.dart';
abstract class ISampleRemoteDataSource {
/// Throws a [ServerException] for all error codes.
Future<SampleModel> getSampleModel(String activityType);
}
@Injectable(as: ISampleRemoteDataSource)
class SampleRemoteDataSourceImpl extends ISampleRemoteDataSource {
final http.Client client;
final baseUrl = "https://www.boredapi.com/api/activity?type=";
final headers = {'Content-Type': 'application/json'};
SampleRemoteDataSourceImpl({@factoryParam required this.client});
@override
Future<SampleModel> getSampleModel(String activityType) async {
Uri uri = Uri.parse(baseUrl + activityType);
GetIt.I.get<http.Client>();
final response = await client.get(uri, headers: headers);
if (response.statusCode == 200) {
return SampleModel.fromJson(json.decode(response.body));
} else {
throw ServerException();
}
}
}
我认为在构造函数中将其声明为工厂参数就可以了,但我错了。将抽象类声明为模块并不能做到这一点(而且似乎也是非常错误的)。我只是不知道。
这应该有效:
首先实现一个注册模块文件
@module
abstract class RegisterModule {
//add http client
@lazySingleton
http.Client get httpClient => http.Client();
}
class $RegisterModule extends RegisterModule {}
然后,生成
injection.config.dart
文件后,您的 http 客户端应该在 initGetIt
类 中提及
您必须将它们注册为模块,如下所述 https://pub.dev/packages/injectable#Registering-third-party-types
将此类第三方类注释为模块。
@module
abstract class ServiceModule {
@lazySingleton
FirebaseFirestore get getStore => FirebaseFirestore.instance;
}
您可以通过以下方式访问它,
FirebaseFirestore store = GetIt.instance.get<ServiceModule>().getStore