Flutter:如何使用injectable包实现非标准代码流程?
可以用injectable实现这套流程
下面是具体的实现步骤和代码示例:
1. 基础配置
先在pubspec.yaml中添加injectable和get_it依赖,然后按要求创建注入配置文件(比如injectable.config.dart),并在初始化入口添加@InjectableInit注解。
2. 给各个类添加注入注解
EndpointProvider
它无外部依赖,直接标记为可注入:
import 'package:injectable/injectable.dart'; @Injectable() class EndpointProvider { String getEndpoint(String trigger) { // 保留原有逻辑 } }
封装AccessToken获取
因为token从存储读取,我们可以封装一个提供者类统一处理:
@Injectable() class TokenProvider { String getAccessToken() { return getTokenFromStorage() ?? ''; // 如果getTokenFromStorage是异步方法,这里改成Future<String>即可,injectable支持异步注入 } }
MyHttpClient的动态注入
它需要动态的baseUrl和accessToken,用@factoryMethod实现参数动态获取:
import 'package:injectable/injectable.dart'; abstract class BaseHttpClient {} @Injectable(as: BaseHttpClient) class MyHttpClient implements BaseHttpClient { MyHttpClient(this.baseUrl, this.accessToken); final String baseUrl; final String accessToken; @factoryMethod static MyHttpClient create( EndpointProvider endpointProvider, TokenProvider tokenProvider, // 如果trigger是动态参数,可添加@param1接收外部传入值 @param1 String trigger, ) { final endpoint = endpointProvider.getEndpoint(trigger); final accessToken = tokenProvider.getAccessToken(); return MyHttpClient(endpoint, accessToken); } }
MyRemoteDataProvider的注入
直接标记为可注入,依赖BaseHttpClient:
import 'package:injectable/injectable.dart'; abstract class BaseDataProvider { void doSomething(); // 修正原代码中do()的命名,避免关键字冲突 } @Injectable(as: BaseDataProvider) class MyRemoteDataProvider extends BaseDataProvider { MyRemoteDataProvider(this.httpClient); final BaseHttpClient httpClient; @override void doSomething() { // 保留原有逻辑 } }
3. 初始化注入容器并调用
import 'package:get_it/get_it.dart'; import 'injectable.config.dart'; final getIt = GetIt.instance; @InjectableInit( initializerName: 'init', preferRelativeImports: true, asExtension: false, ) void configureDependencies() => init(getIt); void main() async { configureDependencies(); // 如果存在异步依赖,需添加 await getIt.allReady(); // 获取实例并执行方法,若trigger是动态值则传入param1 final dataProvider = getIt<BaseDataProvider>(param1: 'trigger'); dataProvider.doSomething(); }
注意点
- 如果
trigger是动态变化的参数,通过getIt获取实例时传入param1即可动态生成对应HttpClient - 若token获取是异步操作,需将
TokenProvider的方法改为返回Future<String>,并在初始化时调用await getIt.allReady()等待异步依赖加载完成
内容的提问来源于stack exchange,提问作者BambinoUA
相关产品推荐
相关产品推荐

