Flutter笔记--get_it&injectable

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,第一次获取才实例化。

相关推荐
事圆则缓1 天前
Flutter 开发鸿蒙实战:从 OpenHarmony 适配版到 HAP 构建与插件接入
flutter·华为·harmonyos
天空之城--1 天前
Android一周动态:Android 18首次官宣、Compose Material3 1.4转正(5趋势+5资讯)
android·人工智能·flutter·架构·android jetpack
恋猫de小郭1 天前
Meta 分享怎么用 AI 迁移 Compose 项目不烧心
android·前端·flutter
EatFan1 天前
Flutter 鸿蒙适配实践 2026:从环境搭建、混合渲染到 OpenTelemetry 性能基建
flutter·华为·harmonyos·openharmony·opentelemetry·鸿蒙适配·impeller
m0_738185821 天前
Flutter 鸿蒙化实战:flutter_secure_storage 适配 OpenHarmony,敏感数据安全存储
安全·flutter·华为·harmonyos·鸿蒙
传奇开心果编程2 天前
【现代声明式UI学与练】第1课 从命令式UI到声明式UI
学习·flutter·ui·swiftui·react·android jetpack
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_nfc_kit 适配 OpenHarmony,NFC 读写一步到位
flutter·华为·harmonyos·鸿蒙
恋猫de小郭2 天前
KMP 又改了编译流程, Separate Compilation 禁止了 `commonMain` 的依赖穿透
android·前端·flutter
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_quill 适配 OpenHarmony,富文本编辑器
flutter·华为·harmonyos·鸿蒙
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_quick_video_encoder 适配 OpenHarmony,逐帧编码视频
flutter·华为·音视频·harmonyos·鸿蒙