Flutter中如何通过injectable注册第三方抽象类http.Client
问题解答
1. 替换规则
你示例代码中的ThirdPartyImpl对应http包中http.Client抽象类的具体实现,常规场景下不需要手动指定具体实现类名,直接使用http包提供的http.Client()工厂方法即可,该方法会自动根据运行平台返回对应实现:
- 原生平台(安卓/ iOS/桌面端)返回
IOClient实例 - Web平台返回
BrowserClient实例
2. 完整注册模块写法
第一步:先给业务实现类加Injectable注解(可选,也可以写在注册模块里)
在TokenValueRemoteDataSourceImpl类上方添加注解,绑定到对应抽象类:
@Injectable(as: TokenValueRemoteDataSource) class TokenValueRemoteDataSourceImpl implements TokenValueRemoteDataSource { // 原有业务代码不变 }
第二步:编写RegisterModule注册模块
import 'package:injectable/injectable.dart'; import 'package:http/http.dart' as http; @module abstract class RegisterModule { // 注册单例的http.Client实现 @singleton http.Client provideHttpClient() => http.Client(); // 如果你不想在实现类上加注解,也可以在这里绑定数据源抽象类与实现 // @Injectable(as: TokenValueRemoteDataSource) // TokenValueRemoteDataSourceImpl get tokenValueRemoteDataSource; }
扩展场景:区分环境注册
如果需要不同环境用不同配置的Client,可以添加环境注解:
@module abstract class RegisterModule { // 生产环境用带超时配置的Client @prod @singleton http.Client provideProdHttpClient() { final client = http.Client(); // 可自定义添加超时、拦截器等配置 return client; } // 测试环境用MockClient @dev @singleton http.Client provideDevHttpClient() => MockClient((request) async { // 自定义模拟返回逻辑 return http.Response('{"token":"test_token"}', 200); }); }
内容的提问来源于stack exchange,提问作者Biplab Dutta
相关产品推荐
相关产品推荐

