Flutter开发中,get_it是Flutter中主流服务定位器,属于手动依赖注入库。它能够实现全局容器,注册对象,随处直接获取实例,不需要层层构造函数传参。injectable是get_it代码生成工具,配套build_runner,自动生成get_it注册代码。简单总结如下:
API:
get_it作用:1 管理对象生命周期:单例、工厂、懒加载单例 2 解耦:业务逻辑、Repository、Dio、数据库实例
injectable作用: 1 注解驱动:@injectable、@singleton标记类,自动生成注册逻辑 2 自动解析构造函数依赖:A 依赖 B,不需要手动写getIt.get<B>()传参
两者关系:injectable只是代码生成器,底层完全依赖 get_it
栗子:
Dart
dependencies:
get_it: ^7.6.0
injectable: ^2.1.0
dev_dependencies:
injectable_generator: ^2.1.0
Dart
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:get_it/get_it.dart';
class ApiService {
String fetchData() {
return "来自ApiService的数据";
}
}
class UserRepository {
final ApiService api;
UserRepository(this.api);
String getUserInfo() {
return api.fetchData()+" | 用户仓库处理完成";
}
}
final getIt = GetIt.instance;
void setUpDi() {
getIt.registerSingleton<ApiService>(ApiService());
getIt.registerFactory<UserRepository>(() => UserRepository(getIt<ApiService>()));
}
void main() {
setUpDi();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(appBar: AppBar(title: const Text("get_it Demo"),),
body: Center(
child: ElevatedButton(onPressed: (){
final repo = getIt<UserRepository>();
print("=====>>>>"+repo.getUserInfo());
}
, child: const Text("调用仓库服务")),
),
),
);
}
}
Dart
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'injector.config.dart';
final getIt = GetIt.instance;
@InjectableInit(
initializerName:'initGetIt',
preferRelativeImports:true,
)
void configureDependencies() => getIt.initGetIt();
必须执行生成命令,才会生成injector.config.dart(自动生成,不要手动修改)
dart run build_runner build(或者flutter pub run build_runner build --delete-conflicting-outputs)
Dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:test_251117/2608/injector.dart';
@singleton
class DioClient {
String getResponse() {
return "DioClient:网络请求返回";
}
}
@Injectable()
class ArticleRepository {
final DioClient dioClient;
ArticleRepository(this.dioClient);
String loadArticle() {
return dioClient.getResponse() + " → 文章仓库处理完毕";
}
}
void main()
{
configureDependencies();
runApp(const MyTestInject());
}
class MyTestInject extends StatelessWidget {
const MyTestInject({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("get_it + injectable Demo")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
final repo = getIt<ArticleRepository>();
debugPrint(repo.loadArticle());
},
child: const Text("获取文章数据"),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
final dio = getIt<DioClient>();
debugPrint(dio.getResponse());
},
child: const Text("调用网络客户端"),
)
],
),
);
}
}
注意:
1 禁止注册 Widget、State、BuildContext
2 注解区分 2.1 @singleton:对应registerSingleton,启动即创建实例。 2.2 @Injectable():默认生成registerLazySingleton,第一次获取才实例化。