You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:40:30