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

相关推荐
恋猫de小郭3 小时前
Flutter iOS 的深度优化 PR,搞笑的是贡献者被 Gemini 评审折磨
android·前端·flutter
GitLqr17 小时前
Flutter + Unity 混合开发:用 unity_kit 实现高效的双向通信
flutter·unity3d·全栈
程序员老刘21 小时前
Flutter版本选择指南:3.47压哨发布,9月大限只剩一周 | 2026年8月
flutter·ai编程·客户端
xcyxiner1 天前
flutter 运行到模拟器上
android·前端·flutter
末代iOS程序员华仔1 天前
iOS 语聊直播/聊天APP4.3条例被拒解决
flutter·ios·swift
恋猫de小郭1 天前
Dart 3.13 的到底改了什么?为什么很重要?有什么坑?
android·前端·flutter
xcyxiner2 天前
flutter wsl2安装记录(使用宿主机虚拟机)
前端·flutter
Kevin Coding2 天前
JsonConvert:适用于 Android、鸿蒙与 Flutter 的 JSON 转 Model 插件
android·flutter·harmonyos
iFlyCai3 天前
Flutter原理深度解析:从架构到渲染的全面剖析(二)
flutter·flutter 三棵树